java - 在字节数组中捕获 <CR><LF>

标签 java arrays 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>在字节数组内部?

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

这取决于“消息”的定义:它们是固定长度的还是按特定序列分隔的?在当前代码中,您正在读取 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/

相关文章:

arrays - 从 NodeJS 中的复杂 JSON 字符串获取值

android - 将csv导入mysql和sqlite时换行

java - 在 tomcat 中部署 Spring Boot war 时,application.yml 文件应该放在哪里?

java - VideoView无法播放视频

java - 对于我的特殊情况,服务器应返回哪个HTTP代码?

c - 为什么这个将二维数组传递到函数的简单代码会给我一个错误?

javascript - 使用标识符遍历 JSON 对象并获取带有标识符的特定值

android - 字符串资源新行/n 不可能?

node.js - 使用 Express 和 node.js 在响应中发送换行符

java - 为目录中的每个文件创建 JButton