1

我通过 USB 串行连接从 Arduino 板向我的 PC 上的 java 应用程序发送 JSON 对象。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 的调用的返回值,它似乎返回与可用字节数相同的值,并且我还测试了其他事件,但似乎没有其他事件发生。

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

我是否应该转向创建一个单独线程的设计,该线程具有对串行端口的阻塞“readline”调用?

我难住了。

4

1 回答 1

2

由于 JSON 中允许使用空格(请参阅 json.org),因此您可以在 JSON 字符串的最后一个字符之后放置一个换行符。确保不要在 JSON 字符串的其他任何地方使用换行符。一旦遇到换行符,这就是您收到整个字符串的信号。

我以前用串行流 JSON 做过这个。在我的情况下,有一个设备不断地流式传输 JSON 字符串。JSON 字符串中的数据值会有所不同(它是温度和湿度等环境数据)。因此,我通过查找标识符来找到字符串的开头(在我的情况下,它是{"environment data":并且我通过查找换行符(在字符串中的其他任何地方都没有使用)来找到结尾。

于 2012-04-10T14:55:07.577 回答