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」呼び出しをブロックする別のスレッドを作成するデザインに移行する必要がありますか?
私は困惑しています。