2010-01-05 8 views
12

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"); 
    } 
} 

Antwort

6

Serielle Daten ist nur ein Strom von Daten. Je nachdem, wann Sie es lesen und die Pufferung, dass, wenn Sie es lesen verfügbar sein, nur einen Teil der Daten kann geschieht.

Da Sie zeilenorientierte Daten verwenden, sollten Sie die Daten so lange puffern, bis Sie den Zeilenabschluss sehen und erst dann die Daten verarbeiten.

+0

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

+0

@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. –

3

Ich habe Java RXTX nicht verwendet, aber ich habe mit Arduino und Processing gespielt und es ist ziemlich einfach, Werte von Arduino zu lesen/schreiben. Hier eine Leseprobe, die mit Processing (Datei> Beispiele> Bibliotheken> Seriell> SimpleRead) kommt

/** 
* Simple Read 
* 
* Read data from the serial port and change the color of a rectangle 
* when a switch connected to a Wiring or Arduino board is pressed and released. 
* This example works with the Wiring/Arduino program that follows below. 
*/ 


import processing.serial.*; 

Serial myPort; // Create object from Serial class 
int val;  // Data received from the serial port 

void setup() 
{ 
    size(200, 200); 
    // I know that the first port in the serial list on my mac 
    // is always my FTDI adaptor, so I open Serial.list()[0]. 
    // On Windows machines, this generally opens COM1. 
    // Open whatever port is the one you're using. 
    String portName = Serial.list()[0]; 
    myPort = new Serial(this, portName, 9600); 
} 

void draw() 
{ 
    if (myPort.available() > 0) { // If data is available, 
    val = myPort.read();   // read it and store it in val 
    } 
    background(255);    // Set background to white 
    if (val == 0) {    // If the serial value is 0, 
    fill(0);     // set fill to black 
    } 
    else {      // If the serial value is not 0, 
    fill(204);     // set fill to light gray 
    } 
    rect(50, 50, 100, 100); 
} 



/* 

// Wiring/Arduino Code 
// Code for sensing a switch status and writing the value to the serial port. 

int switchPin = 4;      // Switch connected to pin 4 

void setup() { 
    pinMode(switchPin, INPUT);    // Set pin 0 as an input 
    Serial.begin(9600);     // Start serial communication at 9600 bps 
} 

void loop() { 
    if (digitalRead(switchPin) == HIGH) { // If switch is ON, 
    Serial.print(1, BYTE);    // send 1 to Processing 
    } else {        // If the switch is not ON, 
    Serial.print(0, BYTE);    // send 0 to Processing 
    } 
    delay(100);       // Wait 100 milliseconds 
} 

*/ 

Soweit ich mich erinnere, die Baud-Dingen Sie Setup in Arduino, wenn Sie Serial instanziiert ziemlich wichtig ist. Wenn Sie 9600 verwenden zum Beispiel zu senden, sollten Sie die gleiche Anzahl zu hören nutzen.

Auch ist es sehr wichtig, Ihre Informationen wie BYTE zu senden, sonst haben Sie Sachen wie \ r oder \ n in der Art und Weise.

Kürzere Version, versuchen:

Serial.println(123456789123456789,BYTE); 

Je einfacher, desto besser.

+0

Hallo, kann Verarbeitung ohne Papplet arbeiten? Weil ich versuche, mit meinem Java-Code zu integrieren ... – wizztjh

+1

@wizzztjh könnten Sie versuchen, dies: http://www.arduino.cc/playground/Interfacing/Java –

+0

Danke für die Antwort, @geory lassen Sie sagen, ich möchte ein Analog erhalten Eingabe von Arduino und der Arduino wird den analogen Wert immer dann, wenn ich etwas an Arduino senden. Entsprechend dem Code in der Verbindung, wird es nur das Ding ausdrucken, anstatt es in einer Variablen zu speichern, Wie kann ich das chunck zu einer Variablen speichern? Weil das öffentliche synchronisierte void serialEvent keinen Wert zurückgeben kann, denke ich ... – wizztjh