【问题标题】:JavaFX+JSSC(Java Simple Serial Connector) thread communicationJavaFX+JSSC(Java Simple Serial Connector)线程通信
【发布时间】:2015-07-09 04:36:53
【问题描述】:

我正在从事条形码扫描项目。我使用条形码扫描仪扫描条形码,扫描仪通过蓝牙与我的笔记本电脑通信。蓝牙连接被模拟为串口通信。

我开发了一个 Java 桌面应用程序来检索扫描的条形码并显示它们。我使用 Javafx for UI 和开源库 JSSC(Java Simple Serial Connector)来监听串口并检索扫描的条形码。 但是,当添加/启动 JSSC 串行端口时,会创建一个新线程。这个新线程侦听串行端口并检索扫描的条形码。我想要的是在 Javafx UI 上显示扫描的条形码,在 JSSC 侦听器线程中检索到的条形码必须发送回父 Javafx 应用程序线程。

我探索了 javafx.concurrent 包,但发现 JSSC 将线程创建包装到它自己的类中,我无法控制它。有人可以提出解决方案吗?这是我在 Javafx 控制器中启动 JSSC 侦听器的代码 sn-p。基本上,如何将缓冲区设置回 FXML 标签变量条形码?

真的提前感谢!

public class BarcodeScanningController {
    @FXML
    private Label barcode;

    private static SerialPort serialPort;

    @FXML
    void initialize() {
        serialPort = new SerialPort("COM5");
        try {
            if (serialPort!=null && serialPort.isOpened ()) {
                serialPort.closePort();
            }
            serialPort.openPort();

            serialPort.setParams(SerialPort.BAUDRATE_9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
            int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
            serialPort.setEventsMask(mask);//Set mask
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN |
                SerialPort.FLOWCONTROL_RTSCTS_OUT);

            serialPort.addEventListener(new PortReader(),SerialPort.MASK_RXCHAR);
        } catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }

    private class PortReader implements SerialPortEventListener {
        private String buffer;

        @Override
        public void serialEvent(SerialPortEvent event) {
            if(event.isRXCHAR()){
                try {
                    buffer = serialPort.readString();
                    System.out.println(buffer);
                } catch (SerialPortException ex) {
                    System.out.println(ex);
                }
        }
    }
}

【问题讨论】:

    标签: multithreading javafx jssc


    【解决方案1】:

    Consumer<String> 添加到您的PortReader 类中:

    private class PortReader implements SerialPortEventListener {
        private final Consumer<String> textHandler ;
    
        PortReader(Consumer<String> textHandler) {
            this.textHandler = textHandler ;
        }
    
        @Override
        public void serialEvent(SerialPortEvent event) {
            if(event.isRXCHAR()){
                try {
                    String buffer = serialPort.readString();
                    textHandler.accept(buffer);
                } catch (SerialPortException ex) {
                    System.out.println(ex);
                }
        }
    }
    

    然后只需替换

    serialPort.addEventListener(new PortReader(),SerialPort.MASK_RXCHAR);
    

    serialPort.addEventListener(
        new PortReader(buffer -> Platform.runLater(() -> barCode.setText(buffer))),
        SerialPort.MASK_RXCHAR);
    

    【讨论】:

    • 谢谢詹姆斯。但是 Platform.runLater 期望可运行,而 barCode.setText(buffer) 是无效的。它是如何工作的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多