我有一个通过串行端口每5s发送一次控制消息 #2214 的框,但是当发生某些情况时,该框会向我发送预期的消息,例如。 $ 22021CB47E06B9B97BA56600 ,我需要使用此“美元信息”,但我需要整个信息。当我从Java运行代码时,框的输出看起来像
可用6
#2214
可用1
可用7
#2214
可用1
$
可用14
22021CB47E06B9
可用12
B97BA56600
可用4
#221
可用3
4
如果您不知道消息的大小,这是一种如何等待所有字节的方法? 我的代码有一部分。我尝试了很多方法。感谢您的帮助。
public static class SerialReader implements Runnable {
InputStream in;
SerialPort comPort;
public SerialReader(InputStream in, SerialPort comPort) {
this.in = in;
this.comPort = comPort;
}
@Override
public void run() {
comPort.addDataListener(new SerialPortDataListener() {
@Override
public int getListeningEvents() {
return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
}
@Override
public void serialEvent(SerialPortEvent event) {
try {
StringWriter sw = new StringWriter();
if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
return;
}
int i = 0;
while ((i = in.available()) > 0) {
byte[] readBuffer = new byte[i];
in.read(readBuffer);
System.out.println("AVAILIBLE "+i);
System.out.println(new String(readBuffer));
}
} catch (IOException ex) {
Logger.getLogger(SerialPortReader.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
}
答案 0 :(得分:0)
结果是使用BufferedReader br = new BufferedReader(new InputStreamReader(InputStream)
而不是经典的InputStream,但是此解决方案会引发超时异常,因为超时默认情况下设置为0
。所以我添加了READ_TIMEOUT
,一切正常。
public void connect(String portName) throws Exception {
SerialPort serialPort = availiblePorts().get(portName);
if (serialPort.isOpen()) {
System.out.println("Error: Port is currently in use");
} else {
serialPort.openPort(2000);
serialPort.setComPortParameters(9600, 8, 1, 0);
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING, 500, 0);
InputStream in = serialPort.getInputStream();
(new Thread(new SerialReader(in))).start();
}
}