Empfangene Daten sinnvoll Puffern

  • Themenstarter Themenstarter valkyrie
  • Beginndatum Beginndatum
V

valkyrie

Gast
Hallo,
in meinem Projekt sendet ein Mikrocontroller Daten an ein Java-Applet (X-Port). Dabei handelt es sich um Antworten auf Steuerbefehle. Jede dieser Antworten sieht z.B. so aus "COMMIT_C_OKAY\n\r", "GET_CONF_OKAY\n\r".
Wenn ich die Daten nicht puffere, werden die einzelnen Antworten zerhackt und ich kann sie nicht mehr auswerten. Puffere ich zu lang, sind Fragmente von anderen Antworten mit drin und ich kann das ganze wiederrum nicht auswerten.
Ich bräuchte einen Puffer der das "\n\r" erkennt und die Strings bis dahin sendet und dann den Nächsten ausliest.

das Projekt sieht bisher so aus:
Java:
public void run()
	{
		Thread me = Thread.currentThread();
		StringBuffer buffer = new StringBuffer();
	    while (timer == me) {
	    	int i;
			
	        try {
	            Thread.currentThread().sleep(2000);
	        } catch (InterruptedException e) { }
	        
	        if ( (gtp != null) && ((i = gtp.available()) > 0) ) {
	        
				String received = new String(gtp.receive());

                if(received.startsWith("GET_CONF_OKAY_"))
                {                   
                    String payload = received.substring("GET_CONF_OKAY_".length(), received.length()-2);
                    String output = "GET_CONF_OKAY_( ";

                    for(int j = 0; j < payload.length(); j++)
                    {   //StringUtils.leftPad(, 2, '0')
                        String temp = Integer.toHexString(payload.charAt(j) & 0xFF);
                        String pad = "";
                        if(temp.length() < 2)
                        {
                            pad = "0";
                        }
                        output += pad + temp + " ";
                    }
                    output += ")\n\r";
                    textArea.append(output);                                // print output string in text area
                    textArea.setCaretPosition(textArea.getText().length()); // view always last row in text area
                }
                // for every uC response of a command, except the GET_CONFIG command
                else
                {
                    textArea.append(received);                              // print received string in text area
                    textArea.setCaretPosition(textArea.getText().length()); // view always last row in text area
                }
			}
	    }
	}
Im Moment wird nur ein Befehl ausgewertet. Das Programm funktioniert so eigentlich auch meistens. Aber halt nicht immer.
Mit einem StringBuffer hab ich schon experimentiert, es aber nicht so richtig hinbekommen.
Wär echt super, wenn ihr mir helfen könntet...
 
Hab mal noch meinen Versuch eines Puffers eingebaut.

Java:
	// print received data on text area
	public void run()
	{
		Thread me = Thread.currentThread();
		StringBuffer buffer = new StringBuffer();
	    while (timer == me) {
	    	int i;
			/*
	        try {
	            Thread.currentThread().sleep(200);
	        } catch (InterruptedException e) { }
	        */
	        if ( (gtp != null)  ){// && ((i = gtp.available()) > 0) ) {
	        
	        while((i = gtp.available()) > 0){
				//String received = new String(gtp.receive());

				String rec = new String(gtp.receive());
				buffer.append(rec);
				int start = 0;

                int end = buffer.indexOf("\n\r", start);
                String received = buffer.substring(start,end+2);
                start = end+2;
                StringBuffer tempBuffer = new StringBuffer();
                tempBuffer.append(buffer.substring(end+1,buffer.length()));
                buffer = tempBuffer;
                buffer.delete(0,end+2);
                //buffer.trimToSize();
            
            
                if(received.startsWith("GET_CONF_OKAY_"))
                {                   
                    String payload = received.substring("GET_CONF_OKAY_".length(), received.length()-2);
                    String output = "GET_CONF_OKAY_( ";

                    for(int j = 0; j < payload.length(); j++)
                    {   //StringUtils.leftPad(, 2, '0')
                        String temp = Integer.toHexString(payload.charAt(j) & 0xFF);
                        String pad = "";
                        if(temp.length() < 2)
                        {
                            pad = "0";
                        }
                        output += pad + temp + " ";
                    }
                    output += ")\n\r";
                    textArea.append(output);                                // print output string in text area
                    textArea.setCaretPosition(textArea.getText().length()); // view always last row in text area
                }
                // for every uC response of a command, except the GET_CONFIG command
                else
                {
                	textArea.append("--");
                    textArea.append(received);                              // print received string in text area
                    textArea.setCaretPosition(textArea.getText().length()); // view always last row in text area
                }}
			}
	    }
	}

Der Output der TextArea sieht so aus: (-- Steht für ein Trennzeichen zwischen zwei Befehlen)

Java:
[1] 01.07.2010 - 14.16.19: 
--C--CON_L_OKAY
--C--CON_L_OKAY
--C--CON_L_OKAY
--C--CON_L_OKAY
--C--CON_L_OKAY
--C--CON_L_OKAY
--C--CON_L_OKAY
--COMMIT_C_OKAY
--GET_CONF_OKAY_( 00 a1 01 52 00 00 08 00 00 ac 00 00 ac 00 00 22 00 00 00 00 00 22 00 00 fd 00 00 92 00 00 07 00 00 13 00 00 1f 00 00 11 00 00 19 00 00 ac 00 00 ac 00 00 00 b7 1b 00 a1 )
 
Dein Problem ist nicht der StringBuffer (du weißt was das ist und wofür der gut ist, oder?), sondern die receive Methode (eventuell auch das Senden).
Wenn nur Zeilen von Text gesendet und empfangen werden, dann solltest du mit Reader und Writer arbeiten und auch zeilenweise lesen bzw. schreiben. Wenn gepufferte Streams darunter liegern, kann es u.U. sinnvoll sein, nach dem Schreiben einer Zeile den Puffer zu flushen.
 

Neue Themen


Zurück
Oben