JavaFX+JSSC(JavaSimple Serial Connector)线程通信
JavaFX+JSSC(Java Simple Serial Connector) thread communication
我正在进行条码扫描项目。我使用条码扫描仪扫描条码,扫描仪通过蓝牙与我的笔记本电脑通信。蓝牙连接模拟串口通信
我开发了一个 Java 桌面应用程序来检索扫描的条形码并显示它们。我使用 Javafx for UI 和开源库 JSSC(Java Simple Serial Connector) 来监听串行端口并检索扫描的条形码。
但是,当 JSSC serialPort 为 added/started 时,将创建一个新线程。这个新线程监听串行端口并检索扫描的条形码。我想要的是在 Javafx UI 上显示扫描的条形码,必须将在 JSSC 侦听器线程中检索到的条形码发送回父 Javafx 应用程序线程。
我探索了 javafx.concurrent 包,但发现 JSSC 将线程创建包装到它自己的 class 中,我无法控制它。有人可以为此提出解决方案吗?这是我在 Javafx 控制器中启动 JSSC 侦听器的代码片段。基本上,如何将缓冲区设置回 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);
}
}
}
}
将 Consumer<String>
添加到您的 PortReader
class:
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);
我正在进行条码扫描项目。我使用条码扫描仪扫描条码,扫描仪通过蓝牙与我的笔记本电脑通信。蓝牙连接模拟串口通信
我开发了一个 Java 桌面应用程序来检索扫描的条形码并显示它们。我使用 Javafx for UI 和开源库 JSSC(Java Simple Serial Connector) 来监听串行端口并检索扫描的条形码。 但是,当 JSSC serialPort 为 added/started 时,将创建一个新线程。这个新线程监听串行端口并检索扫描的条形码。我想要的是在 Javafx UI 上显示扫描的条形码,必须将在 JSSC 侦听器线程中检索到的条形码发送回父 Javafx 应用程序线程。
我探索了 javafx.concurrent 包,但发现 JSSC 将线程创建包装到它自己的 class 中,我无法控制它。有人可以为此提出解决方案吗?这是我在 Javafx 控制器中启动 JSSC 侦听器的代码片段。基本上,如何将缓冲区设置回 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);
}
}
}
}
将 Consumer<String>
添加到您的 PortReader
class:
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);