2012-03-30 2 views
3

Ich habe versucht, von einem COM-Port mit der RXTX-API zu lesen. Der COM-Port wurde an einen Mikrocontroller angeschlossen, so dass ich jedes Mal, wenn ich einen Knopf auf der Mikrocontroller-Platine drücke, eine Reihe von Bytes von 0x01 bis 0xff zurücksende. Ich wollte diese Nummer auf meiner Java-Konsole anzeigen, aber es schien in der Lage zu sein, bis zu 0x40 zu lesen. Alle anderen Byte-Nummern nachher schienen verloren zu gehen. Ich war mir ziemlich sicher, dass der Mikrocontroller gut funktionierte, da ich in einem anderen Terminalprogramm getestet habe, das dann das korrekte Ergebnis ausgab. Ich vermute also, dass etwas mit meinem Inputstream nicht stimmt. Gibt es jemanden, der mir helfen könnte, das Problem zu finden? Das Folgende ist mein Java-Code, der ein typischer serieller COM-Port ist, den ich von Google gefunden habe.aus dem Commport lesen gibt kein vollständiges Ergebnis auf Java zurück

import gnu.io.CommPortIdentifier; 
import gnu.io.PortInUseException; 
import gnu.io.SerialPort; 
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import gnu.io.UnsupportedCommOperationException; 
import java.io.*; 
import java.util.*; 

public class SimpleRead implements Runnable, SerialPortEventListener { 
static CommPortIdentifier portId; 
static Enumeration portList; 

InputStream inputStream; 
SerialPort serialPort; 
Thread readThread; 

public static void main(String[] args) { 
    portList = CommPortIdentifier.getPortIdentifiers(); 

    while (portList.hasMoreElements()) { 
     portId = (CommPortIdentifier) portList.nextElement(); 

     if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { 
      if (portId.getName().equals("COM7")) { 
     //    if (portId.getName().equals("/dev/term/a")) { 
       SimpleRead reader = new SimpleRead(); 
      } 
     } 
    } 
} 

public SimpleRead() { 
    try { 
     serialPort = (SerialPort) portId.open(this.getClass().getName(), 2000); 
    } catch (PortInUseException e) {System.out.println(e);} 
    try { 
     inputStream = serialPort.getInputStream(); 
    } catch (IOException e) {System.out.println(e);} 
try { 
     serialPort.addEventListener(this); 
} catch (TooManyListenersException e) {System.out.println(e);} 
    serialPort.notifyOnDataAvailable(true); 
    try { 
     serialPort.setSerialPortParams(115200, 
      SerialPort.DATABITS_8, 
      SerialPort.STOPBITS_1, 
      SerialPort.PARITY_NONE); 
    } catch (UnsupportedCommOperationException e) {System.out.println(e);} 
    readThread = new Thread(this); 
    readThread.start(); 
} 

public void run() { 
    try { 
     //System.out.println("1"); 
     Thread.sleep(20000); 
    } catch (InterruptedException e) {System.out.println(e);} 
} 

public void serialEvent(SerialPortEvent event) { 
    switch(event.getEventType()) { 
    case SerialPortEvent.BI: 
    case SerialPortEvent.OE: 
    case SerialPortEvent.FE: 
    case SerialPortEvent.PE: 
    case SerialPortEvent.CD: 
    case SerialPortEvent.CTS: 
    case SerialPortEvent.DSR: 
    case SerialPortEvent.RI: 
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
     break; 
    case SerialPortEvent.DATA_AVAILABLE: 
     byte[] readBuffer = new byte[4049]; 

     try { 
      while (inputStream.available() > 0) { 
       int numBytes = inputStream.read(readBuffer); 
      } 
      for(Byte bytenum: readBuffer)System.out.print(Integer.toHexString(bytenum)+" "); 

     } catch (IOException e) {System.out.println(e);} 
     break; 
    } 
    if (serialPort != null) { 
       try { 
        // close the i/o streams. 
        inputStream.close(); 
       } catch (IOException ex) { 
        System.out.println(ex); 
       } 
       // Close the port. 
       serialPort.close(); 
      } 

} 

}

und hier ist das Teiler (beachten Sie, dass Bytenummer nach 40 ausgelesen nicht erfolgreich) 1 2 3 4 5 6 7 8 9 abcdef 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 0 ​​0 0 0 0 0 0

Danke

Antwort

0

Der serielle Port sendet Teile mit der Endung ({0}). Sie müssen beim ersten Auftritt brechen. Und Sie können den nächsten Teil der Nachricht erhalten. Aber in Ihrem Code ist das nicht möglich, weil Sie den Stream und den Port schließen. Mach es in einer Schleife, bis alle Daten empfangen wurden.

Verwandte Themen