2017-04-18 3 views
0

Ich habe Probleme beim Lesen etwas von einem COM-Port, ich benutze TXRX-Bibliothek in einer JavaFX-Anwendung. Hier ist der Code, der zeigt, was es zu lesen:Anzeige gesamte Zeile von InputStream

public void serialEvent(SerialPortEvent evt) { 
     String bytesin = null; 
     String fullLine = " "; 


     if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) 
     { 
      try 
      { 
       byte singleData = (byte)input.read(); 

       if (singleData != CR_ASCII) 
       { 
        bytesin = new String(new byte[] {singleData}); 
        fullLine = fullLine+bytesin; 
        System.out.println(fullLine); 
       } 
       else if (singleData == CR_ASCII) 
       { 
        System.out.println("CR detected!"); 
       } 
       else 
       { 
        statusLabel.setText("Read!"); 
       } 
       } 
      catch (Exception e) 
      { 
       statusLabel.setText("Failed to read data. (" + e.toString() + ")"); 
       System.out.println("Failed to read data. (" + e.toString() + ")"); 

      } 
     } 


} 

== Das Problem mit diesem Code ist, dass es zeigt alles in einem einzigen Zeichen pro Zeile. Mein USB-Gerät ausgibt den folgenden Text (die Chars ASCII sind, nicht Zeichen):

**T-Pod-1Ch**(Char 13)(Char 10) 

aber mein Code Ausgang ergibt dies:

* 
* 
T 
- 
P 
o 
d 
- 
1 
C 
h 
* 
* 
CR detected! 


* 
* 
T 
- 
P 
o 
d 
- 
1 
C 
h 
* 
* 
CR detected! 
+0

Warum sollte es noch etwas anderes tun? Sie setzen 'fullLine' auf ein Leerzeichen und lesen dann einfach ein einzelnes Zeichen aus dem Stream und machen dann eine' System.out.println (fullLine) '. Wenn Sie eine ganze Textzeile lesen möchten, warum erstellen Sie nicht einen 'BufferedReader' und rufen' readLine() 'darauf auf? –

Antwort

0

Der übliche Weg, eine Textzeile aus einem Stream zu lesen, ist die readLine() Methode in BufferedReader. Gibt es einen Grund, warum Sie nicht tun können:

BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 

// ... 

String fullLine = reader.readLine(); 
System.out.println(fullLine); 

anstatt zu versuchen, ein einzelnes Byte zu einem Zeitpunkt, zu lesen (und im Wesentlichen neu zu erfinden das Rad).

+0

Danke, das wusste ich nicht. Ich arbeitete an anderen Beispielen, die ich online gelesen habe. –

0

(byte)input.read() ein einziges Byte liest und System.out.println(fullLine) druckt dieses Zeichen und danach eine neue Zeile. So funktioniert der Code. Versuchen Sie stattdessen System.out.print(fullLine) zu verwenden.