jSerialComm - SerialPortEvent.getReceivedData () возвращает ноль при получении сообщения Arduino - PullRequest
0 голосов
/ 19 июня 2019

Я делаю программу на Java, которая обрабатывает данные о погоде, полученные от Arduino Uno. Он хранит данные в базе данных и отправляет их на разные apis.

Я использую библиотеку jSerialComm для получения данных, которые отправляются через последовательный порт из Arduino. Я использую SerialPortEvent, который запускается, как только Arduino отправляет какие-либо данные (я не использую InputStream, потому что некоторые другие функции в программе больше не будут работать).

Javacode:

(enable () вызывается в основном методе программы)

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;

public class Arduino implements SerialPortDataListener {

    @Override
    public void enable() {
        SerialPort comPort = SerialPort.getCommPort("COM5");
        System.out.println(comPort.getDescriptivePortName());
        comPort.openPort();
        comPort.setBaudRate(9600);
        comPort.addDataListener(this);
    }

    @Override
    public int getListeningEvents() {
        return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
    }

    @Override
    public void serialEvent(SerialPortEvent event) {
        byte[] newData = event.getReceivedData();
        System.out.println(newData);
    }

}

Программа Arduino:

(пока простая тестовая программа)

void setup() {
 Serial.begin(9600);
}

int i = 0;

void loop() {
  Serial.println(i);
  i++;
  delay(1000);
}

Но независимо от того, что я делаю, метод SerialPortEvent.getReceivedData() всегда возвращает null вместо byte[] -объекта (выводится раз в секунду, когда Arduino отправляет свои данные):

Консольный вывод:

User-Specified Port
null
null
null 
null
...

Где моя ошибка?

1 Ответ

0 голосов
/ 19 июня 2019

Попробуйте получить SerialPortEvent тип внутри метода serialEvent, затем прочитайте данные как поток в случае, если событие инициирует готовность данных, сначала объявив входной поток, который должен быть доступен для метода:

InputStream inputStream = comPort.getInputStream();

Тогда serialEvent должно выглядеть следующим образом:

@Override
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType())
{
  case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
     System.out.println("empty");
     break;
  case SerialPortEvent.DATA_AVAILABLE: 
     try
     {
        byte[] readBuffer = new byte[inputStream.available()];
        while(inputStream.available() > 0)
        {
           int numBytes = inputStream.read(readBuffer);
        }
        totalReadBuffer = readBuffer;
        System.out.print(new String(readBuffer));
     }
     catch(IOException e)
     {
     }
     catch(Exception ex)
     {
        ex.printStackTrace();
     }
     break;
  }
}
}

Вы можете проверить Ссылка для полного кода, обратите внимание, что класс, используемый для последовательной связи, равен SerialPortEventListener, вы можете попробовать еговместо

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