如何使用串行事件侦听器接收JSON对象?

时间:2012-04-10 14:50:42

标签: java json serial-port

我正在通过USB串行连接将Arduino板上的JSON对象发送到PC上的java应用程序。 java应用程序从串行事件监听器中的串行端口接收“块”。

这是听众的身体:

public synchronized void serialEvent(SerialPortEvent oEvent) {
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);

            // buffering of bytes must happen here to 
            // ultimately de-serialize into JSON object
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}

我遇到的问题是,何时收到JSON对象的结尾并不清楚。根据我的研究,需要某种事件导致尝试从串口读取返回-1。问题是,对于这个模型,我只有在有可读数据时才进入监听器。

我添加了一些代码来检查对input.read的调用的返回值,它似乎返回与可用字节数相同的值,并且我还测试了其他事件,似乎没有其他事件发生。< / p>

除非有一种简单的方法来修改它以检测串行传输的结束,我认为这种串行输入模型不适用于接收类似JSON对象的东西。

我是否应该转向使用阻塞的“readline”调用串口创建单独线程的设计?

我很难过。

1 个答案:

答案 0 :(得分:2)

由于JSON中允许使用空格(请参阅json.org),因此可以在JSON字符串的最后一个字符后面添加换行符。确保在JSON字符串中的其他任何位置都不使用换行符。一旦遇到换行符,那就是你收到整个字符串的信号。

我之前使用串行流JSON完成了这项工作。在我的情况下,有一个设备连续流式传输JSON字符串。数据值在JSON字符串中变化(它是温度和湿度等环境数据)。所以我通过查找标识符来找到字符串的开头(在我的例子中,它是{"environment data":,我通过查找换行符来找到结尾(在字符串中没有其他地方使用)。