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 に答える