Я неправильно читаю входящие данные Arduino, используя jSerialComm? - PullRequest
0 голосов
/ 21 марта 2020

Я пишу приложение JavaFX, которое должно взаимодействовать с моим Arduino UNO. Для этого я использую библиотеку jSerialComm.

Просто для тестирования посторонних мест я загрузил в Arduino очень простой набросок, который каждые 2 секунды печатает в Serial слово «Hello»:

void setup() {
    //put your setup code here, to run once:
    Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
  Serial.print("Hello");
}

И в моей сцене JavaFX я читаю входящие данные следующим образом:

public void setDevice(SerialPort device) {
    this.device = device;
    device.openPort();
    device.addDataListener(new SerialPortDataListener() {
        @Override
        public int getListeningEvents() {
            return SerialPort.LISTENING_EVENT_DATA_RECEIVED;
        }

        @Override
        public void serialEvent(SerialPortEvent serialPortEvent) {
            if (serialPortEvent.getEventType() == SerialPort.LISTENING_EVENT_DATA_RECEIVED){
                byte [] data = serialPortEvent.getReceivedData();
                String msg = new String(data);
                System.out.println(msg);
            }
        }
    });
}

Я могу читать данные из Arduino, но это происходит странным образом. Как строка отправляется в 2 различных строк. Вот изображение вывода консоли:

Console Output

Я что-то не так делаю? Большое спасибо!

1 Ответ

0 голосов
/ 22 марта 2020

Вы используете jSerialComm по умолчанию = неблокирующий режим. Итак, что происходит (как шаги псевдокода)

 LISTENING_EVENT_DATA_RECEIVED triggered
 get the char H
 get the char e
 Because we are nonBlocking we have to move on in the program
 Print what we have so far -> HE
.... do other stuff or check if other stuff has to be processed
LISTENING_EVENT_DATA_RECEIVED triggered
 get the char L
 get the char L
 get the char O
 Because we are nonBlocking we have to move on in the program
 Print what we have so far -> LLO
 .... do other stuff or check if other stuff has to be processed

Таким образом, вы можете сделать 2 вещи -> изменить режим, например, на блокировку при получении (обеспечить правильное время ожидания для предотвращения взаимных блокировок) или переписать функцию (мой предпочтительный способ) проверить наличие конечных терминаторов в потоке связи и затем обработать содержимое буфера (что должно быть реализовано неблокирующим образом)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...