在字节数组中捕获<cr> <lf>

时间:2016-03-21 11:01:52

标签: java bytearray newline event-listener serial-communication

我编写了一个事件监听器,假设从接收器中读取特定类型的任何消息。

这是我的事件监听器:

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字节的数据,这大约是消息的大小。 但是,有时消息不满,因为它比通常短。 这是消息结构: enter image description here

如您所见,消息以<CR><FL>结尾。 我想修改我的方法,以便它一次读取每个字节,并在它到达消息结束时停止读取。我怎样才能捕获字节数组中的<CR><FL>

任何帮助将不胜感激。谢谢。

2 个答案:

答案 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
  • 如果消息是基于文本的换行符分隔,那么您绝对应该使用BufferedReader来从流中读取。假设您的SP串口是一个InputStream,您可以在其上创建一个BufferedReader,然后在阅读器上调用readLine()方法。读者将继续从流中请求字节,直到它看到换行符,然后将整行作为字符串返回给您。 Reader对象也封装了我之前谈论的Charset。

答案 1 :(得分:0)

我设法解决了我的问题。 非常简单的解决方案:

String tmp = SP.readString();
String[] msgs = tmp.split("\r\n");

从串口读取字符串后,我只是将其拆分为行尾。