我的串行端口事件不在连续循环中使用 jSSC 接收数据
My SerialPortEvent does not receive data using jSSC in a continous loop
我一直在尝试与我的 Arduino Uno 进行串行通信,并使用了库 jSSC-2.6.0。我正在使用 SeriaPortEvent 侦听器从串行端口 (Arduino) 接收字节并将它们存储在链表中。
public synchronized void serialEvent(SerialPortEvent serialPortEvent) {
if (serialPortEvent.isRXCHAR()) { // if we receive data
if (serialPortEvent.getEventValue() > 0) { // if there is some existent data
try {
byte[] bytes = this.serialPort.readBytes(); // reading the bytes received on serial port
if (bytes != null) {
for (byte b : bytes) {
this.serialInput.add(b); // adding the bytes to the linked list
// *** DEBUGGING *** //
System.out.print(String.format("%X ", b));
}
}
} catch (SerialPortException e) {
System.out.println(e);
e.printStackTrace();
}
}
}
}
现在,如果我循环发送单个数据并且不等待任何响应,则 serialEvent 通常会将接收到的字节打印到控制台。
但是如果我尝试等到链表中有一些数据,程序就会继续循环,而 SerialEvent 永远不会向 LinkedList 添加字节,它甚至不会注册接收到的任何字节。
这有效,正确的字节由 Arduino 发送,由 SerialEvent 接收并打印到控制台:
while(true) {
t.write((byte) 0x41);
}
但是这个方法只是停留在 this.available() 上 returns LinkedList 的大小,
因为实际上没有从 Arduino 接收到数据或 serialEvent 接收到数据:
public boolean testComm() throws SerialPortException {
if (!this.serialPort.isOpened()) // if port is not open return false
return false;
this.write(SerialCOM.TEST); // SerialCOM.TEST = 0x41
while (this.available() < 1)
; // we wait for a response
if (this.read() == SerialCOM.SUCCESS)
return true;
return false;
}
我已经调试了程序,有时调试,程序确实可以运行,但并非总是如此。此外,当我尝试检查链表中是否有一些字节时,程序只会卡住,即 while(available() < 1)。否则,如果我不检查,我最终会从 Arduino
收到正确的字节响应
在浪费了 4 小时后自己找到了答案。为了安全起见,我最好使用字节计数为 1 且超时为 100 毫秒的 readBytes()
方法。所以现在读取方法看起来像这样。
private byte read() throws SerialPortException{
byte[] temp = null;
try {
temp = this.serialPort.readBytes(1, 100);
if (temp == null) {
throw new SerialPortException(this.serialPort.getPortName(),
"SerialCOM : read()", "Can't read from Serial Port");
} else {
return temp[0];
}
} catch (SerialPortTimeoutException e) {
System.out.println(e);
e.printStackTrace();
}
return (Byte) null;
}
我一直在尝试与我的 Arduino Uno 进行串行通信,并使用了库 jSSC-2.6.0。我正在使用 SeriaPortEvent 侦听器从串行端口 (Arduino) 接收字节并将它们存储在链表中。
public synchronized void serialEvent(SerialPortEvent serialPortEvent) {
if (serialPortEvent.isRXCHAR()) { // if we receive data
if (serialPortEvent.getEventValue() > 0) { // if there is some existent data
try {
byte[] bytes = this.serialPort.readBytes(); // reading the bytes received on serial port
if (bytes != null) {
for (byte b : bytes) {
this.serialInput.add(b); // adding the bytes to the linked list
// *** DEBUGGING *** //
System.out.print(String.format("%X ", b));
}
}
} catch (SerialPortException e) {
System.out.println(e);
e.printStackTrace();
}
}
}
}
现在,如果我循环发送单个数据并且不等待任何响应,则 serialEvent 通常会将接收到的字节打印到控制台。 但是如果我尝试等到链表中有一些数据,程序就会继续循环,而 SerialEvent 永远不会向 LinkedList 添加字节,它甚至不会注册接收到的任何字节。
这有效,正确的字节由 Arduino 发送,由 SerialEvent 接收并打印到控制台:
while(true) {
t.write((byte) 0x41);
}
但是这个方法只是停留在 this.available() 上 returns LinkedList 的大小, 因为实际上没有从 Arduino 接收到数据或 serialEvent 接收到数据:
public boolean testComm() throws SerialPortException {
if (!this.serialPort.isOpened()) // if port is not open return false
return false;
this.write(SerialCOM.TEST); // SerialCOM.TEST = 0x41
while (this.available() < 1)
; // we wait for a response
if (this.read() == SerialCOM.SUCCESS)
return true;
return false;
}
我已经调试了程序,有时调试,程序确实可以运行,但并非总是如此。此外,当我尝试检查链表中是否有一些字节时,程序只会卡住,即 while(available() < 1)。否则,如果我不检查,我最终会从 Arduino
收到正确的字节响应在浪费了 4 小时后自己找到了答案。为了安全起见,我最好使用字节计数为 1 且超时为 100 毫秒的 readBytes()
方法。所以现在读取方法看起来像这样。
private byte read() throws SerialPortException{
byte[] temp = null;
try {
temp = this.serialPort.readBytes(1, 100);
if (temp == null) {
throw new SerialPortException(this.serialPort.getPortName(),
"SerialCOM : read()", "Can't read from Serial Port");
} else {
return temp[0];
}
} catch (SerialPortTimeoutException e) {
System.out.println(e);
e.printStackTrace();
}
return (Byte) null;
}