我编写了一个事件监听器,假设从接收器中读取特定类型的任何消息。
这是我的事件监听器:
class SerialPortReader implements SerialPortEventListener {
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() > 0) {
try {
byte[] buffer = SP.readBytes(6);
String type = new String(buffer);
if (type.equals("$GPGGA")){
String line = "";
line = line + type;
buffer = SP.readBytes(66);
String values = new String(buffer);
line = line + values;
writer.write(line + "\n");
}
}
catch (SerialPortException ex) {System.out.println(ex);}
catch (IOException ex) {System.out.println(ex);}
}
}
}
现在,在我检查消息的类型是否正确后,我只读取了80字节的数据,这大约是消息的大小。 但是,有时消息不满,因为它比通常短。 这是消息结构:
如您所见,消息以<CR><FL>
结尾。
我想修改我的方法,以便它一次读取每个字节,并在它到达消息结束时停止读取。我怎样才能捕获字节数组中的<CR><FL>
?
任何帮助将不胜感激。谢谢。
答案 0 :(得分:2)
这取决于&#34;消息&#34;的定义:它们是固定长度还是由某个序列分隔?在您当前的代码中,您正在阅读&#34;标题&#34;这是6个字节长,一个&#34;消息&#34;那是66个字节长。但是,看起来您实际上并不知道先验的长度,而是消息是换行终止的。几点:
String(byte[])
ctor将它们转换为字符串。 documentation表示这会为您的平台使用default charset,可能是UTF-8,Latin-1或任何区域默认值。如果您通过串行端口与设备通信,这可能不是您想要的,因为设备可能有一个特定的邮件字符集(可能是ASCII?)。调查该点并使用this String ctor或者,如果您希望在输入包含不可解码的垃圾时收到通知,请CharsetDecoder class。SP
串口是一个InputStream,您可以在其上创建一个BufferedReader,然后在阅读器上调用readLine()
方法。读者将继续从流中请求字节,直到它看到换行符,然后将整行作为字符串返回给您。 Reader对象也封装了我之前谈论的Charset。答案 1 :(得分:0)
我设法解决了我的问题。 非常简单的解决方案:
String tmp = SP.readString();
String[] msgs = tmp.split("\r\n");
从串口读取字符串后,我只是将其拆分为行尾。