Ich versuche, zwischen meinem PC (Windows 7 mit Netbeans und RXTX) mit einem Arduino Pro, über die serielle Schnittstelle zu kommunizieren. Der Arduino ist tatsächlich über ein FTDI-Kabel mit dem PC verbunden.Serielle Kommunikation zwischen Java RXTX und Arduino
Der Code basiert auf dem Java SimpleRead.Java gefunden here.
Derzeit ist das Arduino einfach eine Zeichenkette ausgibt, wenn er startet. Mein Java-Programm sollte die Anzahl von Bytes drucken, die gelesen wurden, und dann die Inhalte ausdrucken. Das Java-Programm funktioniert wie folgt ...
Wenn die Zeichenfolge lang ist (> 10 Bytes oder so), wird die Ausgabe unterbrochen.
wenn also auf dem Arduino I
Serial.println("123456789123456789"); //20 bytes including '\r' and '\n'
Die Ausgabe meiner Java-Programm drucken kann, wie etwas aussehen:
Number of Bytes: 15
1234567891234
Number of Bytes: 5
56789
oder
Number of Bytes: 12
1234567891
Number of Bytes: 8
23456789
Ich denke, es ist ein ist Timing-Problem, denn wenn ich mit dem Debugger manuell den Code gehen, ist das Ergebnis String immer das, was es sein soll: auf Die 20-Byte-Zeichenfolge.
Ich habe verschiedene Dinge durcheinander gebracht, aber ich konnte das Problem nicht beheben. Hier
ist der Teil des Codes, der mir Probleme geben:
static int baudrate = 9600,
dataBits = SerialPort.DATABITS_8,
stopBits = SerialPort.STOPBITS_1,
parity = SerialPort.PARITY_NONE;
byte[] readBuffer = new byte[128];
...
...
public void serialEvent(SerialPortEvent event)
{
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
if (input.available() > 0) {
//Read the InputStream and return the number of bytes read
numBytes = input.read(readBuffer);
String result = new String(readBuffer,0,numBytes);
System.out.println("Number of Bytes: " + numBytes);
System.out.println(result);
}
} catch (IOException e) {
System.out.println("Data Available Exception");
}
}
Aus irgendeinem Grund nahm ich an, dass Daten zusammenhängend in einem einzigen Strom gesendet würden.Auf der PC-Seite muss ich nur den seriellen Ausgang sehen, deshalb denke ich nicht, dass ich mich bemühen werde, die komplette eingehende Leitung zu speichern und sie dann anzuzeigen. Ich denke, ich werde nur die Daten byteweise anzeigen, wie es kommt. Also werde ich aByte = input.read(); anstelle von input.read (readBuffer); Danke – SharpBarb
@SharpBarb - keine Notwendigkeit, auf das Lesen eines Bytes zu einem Zeitpunkt wechseln. Wenn Sie das wirklich wollen, würde ich empfehlen, einen Puffer zu lesen und dann in Ihrer App jedes Byte einzeln zu verarbeiten. –