###InputStreamは取りこぼすことがあるのでしょうか?
InputStream は、以下のような処理でデータを取得すると思います。
Java
1while (true) { 2 read = in.read(buf); 3 if (read == -1) { 4 break; 5 } 6 7 // 取得したデータを処理 8}
シリアル通信(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() などの処理は不要で、極度に小さいバッファサイズや、長時間かかる処理をしなければ、溢れることを心配する必要がない。
ということで理解しました。
いろいろ情報をいただき、ありがとうございました。
よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー