Нужна помощь с Javafx + JSSC.
Я пытаюсь установить последовательную связь между Raspberry Pi 3B + и eval.плата (Atmel SAMC21 Xplained Pro).
Вот символическое представление моей аппаратной настройки:
Raspberry Pi 3B + с программой Javafx для отображения входящих данных [USB] <----------> [USB] eval.плата с данными
(My Raspberry Pi, работающий в версии 2018-11-13-raspbian-stretch)
Использование Javafx (Eclipse Version: 2018-09 (4.9.0)) и JSSC (Версия 2.7.0) Я написал процедуру, которая извлекает (или должна непрерывно извлекать) данные из eval.доска и отобразить его на экране пользовательского интерфейса, который подключен к Raspberry Pi.(Программа Javafx UI работает на Raspberry Pi.)
Вот проблемы, с которыми я сталкиваюсь:
1) При запуске программы (Javafx) данные отправляются, но один раз в RaspberryЧисло Пи.Отображаемые данные не обновляются, хотя и eval.плата продолжает отправлять данные.
2) Буфер не очищен для новых данных.Поэтому часто только часть данных отображается статически (то есть входящие данные не отображаются).
Попробовали несколько вещей / предложений, чтобы решить проблему без какого-либо успеха.
Когда я запускаюсьminicom на терминале Raspberry Pi, потоки данных как и ожидалось.
У кого-нибудь есть идея, что я делаю неправильно?(Я новичок в кодировании).
Каждый толчок в правильном направлении будет очень признателен!
Вот выдержка из моего кода:
public class RxTxSerialData
{
private static SerialPort serialPort;
private StringProperty serialData = new SimpleStringProperty();
Label dataFromController = new Label();
// setter and getter for serial data
public final String getSerialData()
{
return serialData.get();
}
public final void setSerialData(String srlData)
{
serialData.set(srlData);
}
public final StringProperty serialDataProperty()
{
return serialData;
}
//*** method for receiving data from µ-controller
public void receiveSerialDataFromController()
{
SerialPort serialPort = new SerialPort("/dev/ttyACM0");
String stringFromController = dataFromController.getText();
try
{
if (serialPort != null && serialPort.isOpened())
{
serialPort.purgePort(4); //tx_clear
serialPort.purgePort(8); //rx_clear
serialPort.closePort();
}
serialPort.openPort();
serialPort.purgePort(4); //tx_clear
serialPort.purgePort(8); //rx_clear
try {
Thread.sleep(3000);
}catch(InterruptedException ie)
{
Logger.getLogger(RxTxSerialData.class.getName()).log(Level.SEVERE, null, ie);
}
serialPort.setParams
(
SerialPort.BAUDRATE_115200,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE
);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);
PortReader portReader = new PortReader(serialPort);
serialPort.addEventListener(portReader, SerialPort.MASK_RXCHAR);
serialPort.writeBytes(stringFromController.getBytes());
}catch(SerialPortException se)
{
Logger.getLogger(RxTxSerialData.class.getName()).log(Level.SEVERE, null, se);
}
}
private class PortReader implements SerialPortEventListener
{
SerialPort serialPort;
public PortReader(SerialPort serialPort)
{
this.serialPort = serialPort;
}
@Override
public void serialEvent(SerialPortEvent srlEvent)
{
if(srlEvent.isRXCHAR() && srlEvent.getEventValue() > 0)
{
try
{
String buffer = serialPort.readString(srlEvent.getEventValue());
setSerialData(buffer);
Platform.runLater(new Runnable() {
@Override
public void run() {
setSerialData(buffer);
}
});
}catch (SerialPortException ex)
{
System.out.println("Error" + ex);
}
}
}
}
}