首页 > 解决方案 > 将串口接收到的数据发送到 JavaFX 控制器

问题描述

我正在尝试从串行端口读取数据并将其显示在 JavaFX 控制器中。我正在使用 jSerialComm 从串口读取数据。这是他们的例子:

public final class MessageListener implements SerialPortMessageListener {
    @Override
    public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_RECEIVED; }

    @Override
    public byte[] getMessageDelimiter() { return new byte[] { (byte) 0x03}; }

    @Override
    public boolean delimiterIndicatesEndOfMessage() { return true; }

    @Override
    public void serialEvent(SerialPortEvent event) {
        byte[] delimitedMessage = event.getReceivedData();
        System.out.println("Received the following delimited message: " + new String(delimitedMessage));
    }
}

然后将串行事件附加到 com 端口:

static public void main(String[] args) {
    SerialPort comPort = SerialPort.getCommPorts()[0];

    comPort.setBaudRate(1200);
    comPort.openPort();
    comPort.addDataListener(new MessageListener());
}

在该serialEvent方法中,数据在控制台中打印。如何将在此事件中收到的数据发送到 JavaFX 控制器?

标签: javajavafxevent-handlingserial-portlistener

解决方案


你问的不是很清楚:你已经拥有了所有的部分。

我不熟悉jSerialComm(特别是它如何管理线程),但您的 JavaFX 应用程序将如下所示:

public class MyApp extends Application {
    private SerialPort comPort;

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void init() {
        comPort = SerialPort.getCommPorts()[0];

        comPort.setBaudRate(1200);
        comPort.openPort();
    }

    @Override
    public void start(Stage stage) {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/fxml/file"));
        Parent root = loader.load();
        MyControllerClass controller = loader.getController();

        SerialPortMessageListener listener = new SerialPortMessageListener() {
            @Override
            public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_RECEIVED; }

            @Override
            public byte[] getMessageDelimiter() { return new byte[] { (byte)0x03}; }

            @Override
            public boolean delimiterIndicatesEndOfMessage() { return true; }

            @Override
            public void serialEvent(SerialPortEvent event) {
                byte[] delimitedMessage = event.getReceivedData();
                Platform.runLater(() -> controller.processData(new String(delimitedMessage)));
            }
        }

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    @Override
    public void stop() {
        // shut down comPort
    }
}

public class MyControllerClass {
    @FXML
    private TextArea textArea;

    public void processData(String data) {
        textArea.appendText(data);
    }

    // other controller stuff
}

推荐阅读