我使用 JSSC 库与项目中的硬件设备进行通信。
我的软件和我的团队硬件需要同步工作(我的软件需要显示硬件中当前显示的内容,反之亦然)
一切都与我们团队的面包板完美配合,直到我们将其制成安装了按钮的真正 PCB。
我们的团队目前正在为设备使用此 USB 转串行适配器:https://www.sparkfun.com/products/14050
当我们使用面包板进行测试时,它通过 COM3 连接。当前设备通过 COM5 连接。
我的软件现在只能从设备接收数据,并且在单击软件中的按钮时无法发回信号(实际上writeString方法返回 true,但我们的设备什么也没收到)
让我们看一下我的软件的一些代码片段:
我有这个连接按钮来打开端口并建立通信:
private void connectButtonActionPerformed(java.awt.event.ActionEvent evt) {
if (selectedPort != null && selectedPort.isOpened()) {
// Disconnect
selectedPort.closePort();
connectButton.setText("Connect");
} else { // Connect
selectedPort = new SerialPort(listPort.getSelectedItem().toString());
try {
connectButton.setText("Disconnect");
selectedPort.openPort();
selectedPort.setParams(9600, 8, 1, 0, true, false);
selectedPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);
int mask = SerialPort.MASK_RXCHAR;
selectedPort.setEventsMask(mask);
selectedPort.addEventListener(new SerialPortReader());
} catch (SerialPortException ex) {
System.out.println(ex);
}
}
}
我还有一个jcombobox可以将角色发送到设备:
private void modeListActionPerformed(java.awt.event.ActionEvent evt) {
try {
JComboBox cb = (JComboBox) evt.getSource();
String selectedItem = (String) cb.getSelectedItem();
switch (selectedItem) {
case "VOLTAGE_DC":
dataMode = VOL_DC;
selectedPort.writeString("v");
break;
case "VOLTAGE_AC":
dataMode = VOL_AC;
selectedPort.writeString("V");
break;
case "CURRENT_DC":
dataMode = "CUR_DC";
selectedPort.writeString("i");
break;
case "CURRENT_AC":
dataMode = "CUR_AC";
selectedPort.writeString("I");
break;
case "RESISTANCE":
dataMode = RES;
selectedPort.writeString("r");
break;
case "RESISTANCE_CON":
dataMode = CON;
selectedPort.writeString("c");
break;
default:
break;
}
selectedPort.closePort();
selectedPort.openPort();
selectedPort.addEventListener(new SerialPortReader());
} catch (SerialPortException ex) {
Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
}
}
我的串行端口读取器:
public class SerialPortReader implements SerialPortEventListener {
@Override
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() > 0) {
try {
byte[] buffer = selectedPort.readBytes(event.getEventValue());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
update_display_by_buffer(buffer);
});
}
catch (SerialPortException ex) {
System.out.println(ex);
}
}
回顾几个要点:
- 我的软件可以在测试时与试验板顺利通信 (COM3)
- 我的软件现在只能接收数据,但不能与真实设备相反(甚至writeString方法返回 true)
- 我们的真实设备与腻子完美配合
这个问题的原因可能是什么?
任何指示将不胜感激。
更新:
使用jSerialComm库解决了问题
结论:
RXTX是一团糟。
JSSC库很烂。
我在另一个项目中观察到相同的行为,有时是由于写入串行端口后"不刷新数据"。JSSC似乎没有任何刷新。