我正在通过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”调用串口创建单独线程的设计?
我很难过。
答案 0 :(得分:2)
由于JSON中允许使用空格(请参阅json.org),因此可以在JSON字符串的最后一个字符后面添加换行符。确保在JSON字符串中的其他任何位置都不使用换行符。一旦遇到换行符,那就是你收到整个字符串的信号。
我之前使用串行流JSON完成了这项工作。在我的情况下,有一个设备连续流式传输JSON字符串。数据值在JSON字符串中变化(它是温度和湿度等环境数据)。所以我通过查找标识符来找到字符串的开头(在我的例子中,它是{"environment data":
,我通过查找换行符来找到结尾(在字符串中没有其他地方使用)。