首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX+JSSC()线程通信

JavaFX+JSSC()线程通信
EN

Stack Overflow用户
提问于 2015-07-09 04:36:53
回答 1查看 2.8K关注 0票数 1

我在做条形码扫描项目。我使用条形码扫描仪扫描条形码,扫描仪通过蓝牙与我的笔记本电脑通信。蓝牙连接仿真为串口通信。

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

我研究了javafx.concurrent包,但发现JSSC将线程创建封装到自己的类中,我无法控制它。有人能为它提出一个解决方案吗?下面是我在Javafx控制器中启动JSSC侦听器的代码片段。基本上,如何将缓冲区设置为FXML标签变量条形码?

真的很感激你的到来!

代码语言:javascript
复制
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);
                }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-09 12:00:17

向您的Consumer类添加一个PortReader

代码语言:javascript
复制
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);
            }
    }
}

然后换掉

代码语言:javascript
复制
serialPort.addEventListener(new PortReader(),SerialPort.MASK_RXCHAR);

使用

代码语言:javascript
复制
serialPort.addEventListener(
    new PortReader(buffer -> Platform.runLater(() -> barCode.setText(buffer))),
    SerialPort.MASK_RXCHAR);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31308228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档