Подтвердить что ты не робот

Последовательная связь между Java RXTX и Arduino

Я пытаюсь установить связь между моим ПК (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");
    }
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

/**
 * 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);

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

Ответ 3

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