www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Microcontrollerantwort mit X-Port Java Applet auswerten


Autor: Valkyrie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe folgendes Problem:
Über ein Applet auf einem X-Port gebe ich einen ATmega1281v Befehle. 
Wenn der uC diese ausführt sendet er eine Antwort (z.B. COMMIT_C_OKAY). 
Diese Antwort wiederrum wird vom Java-Applet in einer Text Area 
angezeigt.

Eine dieser Antworten vom uC enthält Zeichen die vom Applet nicht 
dargestellt werden können, weshalb ich diese Antwort abfange und in 
hexadezimale Darstellung konvertiere. Diese wird dann in Text Area 
ausgegeben.

Das funktioniert auch einige Male (ca 17 Mal) ganz gut. Irgendwann 
werden keine Antworten des uCs mehr angezeigt. Der uC lässt sich 
allerdings weiterhin steuern.

Ich vermute mal, dass es am Puffer liegen könnte.

Hier mal der Empfangsteil des Codes:
// print received data on text area
  public void run()
  {
      //int test;
    Thread me = Thread.currentThread();
      while (timer == me) {
        int i;
      
          try {
              Thread.currentThread().sleep(200);
          } catch (InterruptedException e) { }
          if ( (gtp != null) && ((i = gtp.available()) > 0) ) {
          
        String received;
        byte[] in = new byte[100];
        
        in = gtp.receive();                      // write received bytes in in[]
        received = new String(in);                  // covert byte[] to string
        Ringbuffer ring = new Ringbuffer(200);
        // if it's a response to a GET_CONF-command (GET_CONF_OKAY_), convert received frame to hex than display it in the text area
        if((in[0]== 0x47) && (in[1]== 0x45) && (in[2]== 0x54) && (in[3] == 0x5F) && (in[4] == 0x43) && (in[5] == 0x4F) && (in[6] == 0x4E) && 
           (in[7]== 0x46) && (in[8]== 0x5F) && (in[9]== 0x4F) && (in[10]== 0x4B) && (in[11]== 0x41) && (in[12]== 0x59) && (in[13]== 0x5F))
        {            
          String tempStringBuffer = "GET_CONF_OKAY_(";      // write prelude of the response
          
          // config frame data from in[14] to in[length-2]
          for(int j = 14; j < in.length-2; j++) 
          {
            String temp = Integer.toHexString(in[j] & 0xFF);   // convert the byte array to a string of hexadecimal bytes
            if (temp.length() < 2)
            {
              tempStringBuffer += "0";            // if hex number consists of only one digit, add a '0' in front of the value
            }
            tempStringBuffer += temp;              // write converted hex to output string
            tempStringBuffer += " ";              // divider between the hexadecimal byte blocks
          }
          tempStringBuffer += ")\n\r";              // conclusion of config frame with additional "line feed" and "carriage return" symbol
          
          textArea.append(tempStringBuffer);            // print 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
        }
        //java.util.Arrays.fill(in, 0); 
        received = "";
      }
      }
  }

Vielleicht habt ihr ja eine Idee
Vieln Dank im Voraus...

Autor: Shuzz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus
byte[] in = new byte[100];
in = gtp.receive();                      
received = new String(in);                  

würde ich erstmal
received = new String(gtp.receive());

machen.

Ist vermutlich nicht der Grund, sprang mir aber ins Auge... ^^

Generell würde ich Dir empfehlen den Code mal aufzuräumen und zu 
entrümpeln.
Was macht z.B. der Ringbuffer da? Wird nicht weiter verwendet oder?

Und wenn ich mir die if-clause anschaue krieg ich gaaanz große Augen:
Du fragst tatsächlich manuell und hexadezimal ab, ob der empfangene 
String mit "GET_CONF_OK_" anfängt?!? oO
Wie wäre es mit
if(received.startsWith("GET_CONF_OK_"){
    ....
}

Welcher Puffer wo genau überläuft lässt sich anhand des Code-Snippets eh 
nicht genau sagen.
In dem Teil den Du gepostet hast sollte es eigentlich zu keinen 
Problemen mit dem Puffer kommen.

Kann es evtl. sein, dass der Thread einfach zu macht?
Also z.B. timer != me wird?

Autor: Shuzz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nochmal.

Schau Dir mal das folgende Snippet an, vllt. hilft es ja weiter... ;)
  public static void main (String[] args) {

    String received = "GET_CONF_OKAY_7832z4";
    String output = null;

    if(received.startsWith("GET_CONF_OKAY_")){
      String payload = received.substring("GET_CONF_OKAY_".length(), received.length());
      output = "GET_CONF_OKAY_";
      for(int i = 0; i < payload.length(); i++){
        output += "0x" + StringUtils.leftPad(Integer.toHexString(payload.charAt(i)), 2, '0') + "_";
      }
    }
    System.out.println(output.substring(0, output.length()-1));
  }

StringUtils sind Teil des Apache commons Projekts.

Autor: Valkyrie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort, werde die Tipps morgen ausprobieren. Muss mein 
Kopf etwas frei bekommen ,-)

Autor: Valkyrie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
gibt es eine Möglichkeit mit Java Strings "Interrupt gesteuert" 
einzulesen. Durch die Abfrage alle 200ms werden manche Antwort-Strings 
in meinem Programm zusammengesetzt. Gibt es eine Möglichkeit diese auch 
einzeln auszulesen?

Autor: Christian T. (shuzz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hängt davon ab, was Dein gtp.receive() macht...
Ich weiss nicht, wie die Klasse aussieht, ob da ein Empfangspuffer drin 
ist oder wasauchimmer.

Ansonsten nimm halt das sleep raus...

Autor: Valkyrie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die receive()-Methode hat keinen Puffer.
Wenn ich das sleep rausnehme, kommen die einzelnen Pakete zerstückelt 
an.

Am Ende jedes Pakets ist noch "\n\r" angehängt. Wie kann ich einen 
Puffer implementieren, der immer wenn diese Zeichen kommen, den String 
zur hex-Umwandlung schickt?

Autor: Valkyrie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Christian,
es funktioniert ,-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.