Вопрос

Я пытаюсь установить связь между моим компьютером (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");
    }
}
Это было полезно?

Решение

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

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

Другие советы

Я не использовал Java RXTX, но я играл с Arduino и обработкой, и довольно легко считывать / записывать значения из Arduino.Вот образец для чтения, который поставляется с обработкой (Файл> Примеры> Библиотеки> Последовательный> 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 для отправки, вы должны использовать тот же номер для прослушивания.

Кроме того, очень важно отправлять вашу информацию в виде БАЙТ, в противном случае вам будут мешать такие вещи, как или .

Более короткая версия, попробуйте:

Serial.println(123456789123456789,BYTE);

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top