2012-04-10 15 views
1

ArduinoボードからPCのJavaアプリケーションにJSONオブジェクトをUSBシリアル接続で送信しています。 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

ちょっと... * *私は**入力していました!:)(+1) –

+0

同じことがここにあります。私は温度測定のストリームを送信しています。だから私は改行文字の存在について各チャンクをテストする必要がありますか? – ColonelPackage

+0

"readline"呼び出しをブロックする別のスレッドを作成する私の代わりのアプローチについて、あなたの意見は何ですか?それでも改行文字を追加する必要はありますか?私はそう思っている。 – ColonelPackage

関連する問題