2012-04-10 56 views
1

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

这是听众的身上:

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”调用串口?

我很难过。

回答

2

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

我以前用串口流JSON完成了这个。在我的情况下,有一种设备不断流式传输JSON字符串。数据值在JSON字符串内变化(它是环境数据,如温度和湿度)。所以我通过寻找一个标识符来找到字符串的开头(在我的例子中,它是{"environment data":,我通过寻找一个换行符(它在字符串中没有其他地方使用)来找到最后的结果)

+1

Hey ... * *我**正在打字!:)(+1) – 2012-04-10 14:57:13

+0

这里同样的事情。我正在发送一串温度测量值。所以我需要测试每个块是否存在换行符? – ColonelPackage 2012-04-10 15:16:32

+0

出于好奇,您对我创建单独线程的替代方法有何看法,该线程阻止了对“readline”的调用?它是否仍然需要添加换行符?我在想是的。 – ColonelPackage 2012-04-10 16:27:01