Frage

Ich versuche zwischen meinem PC (Windows 7 mit Netbeans und RXTX) mit einem Arduino Pro, mit der seriellen Schnittstelle zu kommunizieren. Das Arduino ist eigentlich mit dem PC verbunden, um ein FTDI-Kabel.

Der Code basiert auf dem Java SimpleRead.Java gefunden hier.

Zur Zeit der Arduino einfach druckt einen String, wenn er startet. Mein Java-Programm sollte die Anzahl von Bytes drucken, die gelesen wurden, und dann die Inhalte ausdrucken. Das Java-Programm funktioniert, irgendwie ...

Wenn die Zeichenfolge lang sind (> 10 Bytes oder so) wird der Ausgang aufgebrochen erhalten.

Also, wenn auf dem Arduino ich Druck

Serial.println("123456789123456789"); //20 bytes including '\r' and '\n'

Die Ausgabe von meinem Java-Programm 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 Timing-Problem, denn wenn ich den Code manuell durchläuft die Debugger verwenden, ist das Ergebnis String immer das, was es sein soll:. Eine 20-Byte-Zeichenfolge

Ich habe mit verschiedenen Dingen wurde durcheinander, aber ich habe nicht in der Lage, das Problem zu 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");
    }
}
War es hilfreich?

Lösung

Serielle Daten sind 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 Linie orientierte Daten verwenden, was Sie tun möchten, ist die Daten-Puffer, bis Sie den Leitungsabschluss sehen und erst dann die Daten verarbeiten.

Andere Tipps

Ich habe nicht Java RXTX verwendet, aber ich habe mit Arduino und Verarbeitung gespielt und es ist ziemlich einfach / Schreibwert von Arduino zu lesen. Hier ist 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 Nummer verwenden, um zu hören.

Auch ist es ziemlich wichtig, um Ihre Informationen wie BYTE zu schicken, sonst wirst du Dinge wie \ r oder \ n in der Art und Weise haben.

Kürzere Version, versuchen Sie:

Serial.println(123456789123456789,BYTE);

Je einfacher, desto besser.

Ich glaube, Sie ereignisgesteuerte Entwurfsmuster verwenden müssen, um dieses Problem zu lösen. Ich empfehle Ihnen, zu besuchen: http: //www.whatisarduino. org / bin / Tutorials / Java + Serial + API + und + Arduino

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top