Lesen serielle Schnittstelle in Java
Ich bin Anfänger in Java. Ich bin Lesen der Daten vom Gerät über den seriellen port. Ich bin immer Daten für jede minute, aber zuerst Lesen, kommt die Hälfte nach, die Daten kommen korrekt.
Ausgabe, die ich bekommen hab ist:
6050.003120815340006050.003120815350006050.0
Korrekte Ausgabe sollte wie folgt sein:
03120815340006050.003120815350006050.0
Mein code ist:
import java.io.*;
import java.util.*; //import gnu.io.*;
import javax.comm.*;
public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;
InputStream inputStream;
SerialPort serialPort;
Thread readThread;
byte[] readBuffer;
public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers();
System.out.println("portList... " + portList);
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
System.out.println("port identified is Serial.. "
+ portId.getPortType());
if (portId.getName().equals("COM2")) {
System.out.println("port identified is COM2.. "
+ portId.getName());
//if (portId.getName().equals("/dev/term/a")) {
SimpleRead reader = new SimpleRead();
} else {
System.out.println("unable to open port");
}
}
}
}
public SimpleRead() {
try {
System.out.println("In SimpleRead() contructor");
serialPort = (SerialPort) portId.open("SimpleReadApp1111",500);
System.out.println(" Serial Port.. " + serialPort);
} catch (PortInUseException e) {
System.out.println("Port in use Exception");
}
try {
inputStream = serialPort.getInputStream();
System.out.println(" Input Stream... " + inputStream);
} catch (IOException e) {
System.out.println("IO Exception");
}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
System.out.println("Tooo many Listener exception");
}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
//no handshaking or other flow control
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
//timer on any read of the serial port
serialPort.enableReceiveTimeout(500);
System.out.println("................");
} catch (UnsupportedCommOperationException e) {
System.out.println("UnSupported comm operation");
}
readThread = new Thread(this);
readThread.start();
}
public void run() {
try {
System.out.println("In run() function ");
Thread.sleep(500);
//System.out.println();
} catch (InterruptedException e) {
System.out.println("Interrupted Exception in run() method");
}
}
public void serialEvent(SerialPortEvent event) {
//System.out.println("In Serial Event function().. " + event +
//event.getEventType());
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:
readBuffer = new byte[8];
try {
while (inputStream.available()>0) {
int numBytes = inputStream.read(readBuffer);
// System.out.println("Number of bytes read " + numBytes);
}
System.out.print(new String(readBuffer));
} catch (IOException e) {
System.out.println("IO Exception in SerialEvent()");
}
break;
}
//System.out.println();
/* String one = new String(readBuffer);
char two = one.charAt(0);
System.out.println("Character at three: " + two);*/
}
}
- Bitte fügen Sie vier Leerzeichen vor den ersten Zeilen, so dass es formatiert als code.
- Haben Sie kopieren Sie einfach den von einer anderen Seite? -- java-samples.com/showtutorial.php?tutorialid=11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die folgenden:
Sie drucken das Ergebnis aus der while-Schleife. Jedoch der code innerhalb der Schleife kann mehr als einmal ausgeführt werden, so Menge Daten verloren.
Versuchen Sie, das Spülen der input buffer des Ports, bevor Sie Ihr Lesen. Ansonsten, wenn der Sender gesendet hat Daten während Ihres Programm zu starten (oder zu eng, bevor, dass sein könnte, bis auf das Betriebssystem), erhalten Sie alt gepufferten Daten.
Auch, wenn möglich, sollten Sie erwägen message framing des Protokolls, so können Sie erkennen, wenn Sie Sie gelesen haben, etwas, das nicht ist, in der Tat, eine vollständige Nachricht, und entsorgen Sie Sie. Dies ist oft sehr hilfreich bei solchen Fragen.
Dieser sieht aus, als wenn Sie Lesen würden, der rest der Nachricht, die gesendet wurde, bevor Sie begann.
Versuchen zu Lesen, so viele Daten wie möglich, wie Sie das Programm starten, löschen Sie alle hardware-Puffer. Danach starten Sie die Verarbeitung.