java - 将串口接收到的数据发送到 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 控制器?
解决方案
你问的不是很清楚:你已经拥有了所有的部分。
我不熟悉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
}
推荐阅读
- c# - 将php中的Aes加密转换为c#
- ajax - 在请求参数中有斜杠的 ajax 调用给出未找到错误
- machine-learning - 在 Kevin Lin 等人的 CVPR16 论文“Deepbit”中,是不是损失函数部分的错字?
- html - 如何使 html 块仅在一侧投射阴影和/或遵循非方形形状
- amazon-web-services - Web 套接字握手错误 AWS IOT
- kubernetes - 如何使用“kubectl”命令而不是“sudo kubectl”
- php - 如何手动向表单/请求添加数据
- dynamics-crm - 查看用户执行报告的次数 - CRM online v9
- javascript - 单击表单内的事件侦听器
- python - Celery 无法发现 4.2.0 版本中的任务