2012-04-10 55 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