Последовательная связь Javafx и JSSC - PullRequest
0 голосов
/ 14 марта 2019

Нужна помощь с 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);
                    }
            }           
        }       
    }
}
...