我编写了一个事件监听器,它可以从接收器读取任何特定类型的消息。
这是我的事件监听器:
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>
在字节数组内部?
如有任何帮助,我们将不胜感激。谢谢。
最佳答案
这取决于“消息”的定义:它们是固定长度的还是按特定序列分隔的?在当前代码中,您正在读取 6 个字节长的“ header ”和 66 个字节长的“消息”。但是,看来您实际上并不知道先验的长度,而是消息以换行符终止。一些提示:
- 您正在从流中读取字节,然后使用
String(byte[])
构造函数将它们转换为字符串。 documentation指出这使用 default charset适用于您的平台,可能是 UTF-8、Latin-1 或任何区域默认值。如果您通过串行端口与设备通信,这可能不是您想要的,因为设备可能有一个特定的消息字符集(可能是 ASCII?)。调查该点并使用 this String ctor或者,如果您想在输入包含无法解码的垃圾时收到通知,则 CharsetDecoder class . - 如果消息是基于文本的且以换行符分隔,则绝对应该使用 BufferedReader从流中读取。假设您的 SP 串行端口是一个 InputStream,您可以在其上创建一个 BufferedReader,然后调用读取器上的 readLine() 方法。读取器将继续从流中请求字节,直到看到换行符,然后将整行作为字符串返回给您。 Reader对象也封装了我之前谈到的Charset。
关于java - 在字节数组中捕获 <CR><LF>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36129292/