Последовательная связь между Java RXTX и Arduino - PullRequest
12 голосов
/ 06 января 2010

Я пытаюсь установить связь между моим ПК (Windows 7 с использованием Netbeans и RXTX) с Arduino Pro, используя последовательный порт. Arduino фактически подключен к ПК с помощью кабеля FTDI.

Код основан на Java SimpleRead.Java, найденном здесь .

В настоящее время Arduino просто печатает строку при запуске. Моя Java-программа должна распечатать количество прочитанных байтов, а затем распечатать содержимое. Программа на Java работает, вроде ...

Если строка длинная (> 10 байт или около того), вывод будет разбит.

Так что если на Arduino я печатаю

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

Вывод моей программы на Java может выглядеть примерно так:

Number of Bytes: 15   
1234567891234  
Number of Bytes: 5  
56789

или

Number of Bytes: 12   
1234567891  
Number of Bytes: 8  
23456789

Я думаю, что это проблема синхронизации, потому что когда я вручную просматриваю код с помощью отладчика, строка результата всегда будет такой, какой она должна быть: одна строка из 20 байтов.

Я возился с разными вещами, но не смог решить проблему.

Вот часть кода, которая вызывает у меня проблемы:

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

Ответы [ 3 ]

6 голосов
/ 06 января 2010

Последовательные данные - это просто поток данных. В зависимости от того, когда вы читаете это и буферизации, которая происходит, только часть данных может быть доступна, когда вы читаете это.

Поскольку вы используете ориентированные на строки данные, вам нужно будет буферизовать данные до тех пор, пока вы не увидите ограничитель строки и только затем обработать данные.

3 голосов
/ 06 января 2010

Я не использовал Java RXTX, но я играл с Arduino и Processing, и значения Arduino читать / писать довольно легко. Вот пример чтения, который поставляется с Processing (Файл> Примеры> Библиотеки> Serial> SimpleRead)

/**
 * 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
}

*/

Насколько я помню, бод, который вы настраиваете в Arduino при создании экземпляра Serial, очень важен. Если вы используете 9600 для отправки, например, вы должны использовать тот же номер для прослушивания.

Также очень важно отправить вашу информацию как BYTE , в противном случае у вас будут такие вещи, как \ r или \ n.

Укороченная версия, попробуйте:

Serial.println(123456789123456789,BYTE);

Чем проще, тем лучше.

1 голос
/ 19 февраля 2012

Я думаю, что для решения этой проблемы вам нужно использовать шаблоны проектирования, управляемые событиями. Я настоятельно рекомендую вам посетить: http://www.whatisarduino.org/bin/Tutorials/Java+Serial+API+and+Arduino

...