0

Bluetoothのrfcommソケットからデータを受信するためのソケットを作成しました。

ワンピースで受け取った場合のパッケージには10個の番号がありますが、別々のパーツを受け取ることもあります。それは私がデータを取得するために選択した頻度に依存します。たとえば、私が選択した場合、1000Hz私はすべての情報を取得します。私はaを使用してQTimerおり、間隔1000 ms / 1000 Hzがintに等しいため、intを取得しますが、これは問題ありません。ただし、除算がintでない場合は、除算が QTimer丸められ、非同期化されたときにすべてのパッケージを取得するために関数が時間内に再起動されません。

私はこれを使います、

sock = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

numb = read (sock, buf, 10);

numbが10に等しい場合、パッケージはOKだったので、処理します。そうでない場合は、部品のみを受け取りました。その後、その部分は失われます。

バッファがすでに読み取られているのではなく、バッファがいっぱいかどうかだけを確認する方法はありますか?つまり、状態が完全に読み取られた場合、そうでない場合は、次の反復に任せます。

私はこの問題の専門家ではありませんが、旗はMSG_EOR私を助けてくれますか?私のデータはパッケージに入っています。

に変更readする必要がありrecvますか?recvパラメータとしてソケットを取得します。

どんな助けでも大歓迎です。

4

3 に答える 3

1

バッファーを既に読み取る代わりに、バッファーがいっぱいかどうかのみを確認する方法はありますか?

フラグ MSG_PEEK でrecvを使用することができます。このフラグを使用すると、 recvは同じように機能しますが、キューから入力データを削除しません。

于 2013-02-28T16:29:56.200 に答える
0

私の問題を解決する別の方法は、フラグを使用してread()関数を再生しrecv()、フラグを追加することMSG_WAITALLです。

于 2013-02-28T17:21:13.953 に答える
0

まあ、私はそれを自分で解決しました。

各パッケージなので、1秒の取得を受信できるように、1秒間隔で取得できるようにサイズを10 bytes変更しました。bufferfrequency * 10 bytesQTimer

于 2013-02-28T16:28:17.067 に答える