質問: -1) { break; } // 取得したデータを処理 } ``` シリアル通信(SPP)のデータ受信処理を作っているのですが、少し疑問に思うことがありました。 データ送信側が定期的にデータを送信(100ms毎など)している場合は、このループを回しっぱなしでエンドコードを受信するまでなど、役目を終えるまで処理すると思います。 上の例だと sleep() などのウエイトなしですが、これを sleep(1000) などデータ送信側の間隔より遅い待機時間になった場合は、データを取りこぼすことになるのでしょうか? それとも、上記の例ですと10回分のデータは取りこぼすことなく取れるものなのでしょうか? 現在はウエイトなしで問題なくデータ受信はできているのですが、ノーウエイトでループするのもCPUの負担になると思ったのと、ウエイトを入れた時にデータを取りこぼすことがあるのだろうかと思ったので質問しました。 もしご存知の方がいらっしゃいましたら、教えていただけると助かります。 よろしくお願いします。 --- 追加情報です。 データ送信側の情報を記載します。 (マニュアル記載のままです) | | | | --- | --- | | ボーレート | 9600bps | | データ | 8bit | | パリティ | なし | | ストップ | 1bit | | フロー制御 | なし | この装置と Android(OS 4.4.x) アプリを bluetooth で接続してデータを読み取る仕組みとなっています。 Android は、 android.bluetooth.BluetoothAdapter android.bluetooth.BluetoothDevice android.bluetooth.BluetoothSocket を使ってます。 --- 結論として、read() は... * 適切な wait が入る(具体的な処理内容は調べてみます) * バッファサイズから溢れない限り取りこぼすことはない(バッファサイズの調整方法は調べてみます) ということなので、 ループ処理に Thread.sleep() などの処理は不要で、極度に小さいバッファサイズや、長時間かかる処理をしなければ、溢れることを心配する必要がない。 ということで理解しました。 いろいろ情報をいただき、ありがとうございました。 よろしくお願いします。
回答: シリアル通信は普通、データ受信時にバッファにためて、 利用側のソフトはバッファの中身を読み出します。 なのでバッファの容量を超えない限りは読み落としません。