0

我创建了一个套接字来从蓝牙中的 rfcomm 套接字接收数据。

一件包裹收到的包裹有 10 个号码,但有时我会收到单独的部分。这取决于我选择获取数据的频率。例如,如果我选择1000Hz我会得到所有信息。我正在使用 a QTimer,因为它得到一个 int ,因为间隔 1000 ms / 1000 Hz 等于一个 int,这没关系。但是,如果除法不是 int,那么 QTimer它将对其进行舍入,并且它不会及时重新启动函数以获取所有包,因为它不同步。

我用这个,

sock = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

numb = read (sock, buf, 10);

如果 numb 等于 10,则包没问题,所以我处理它。如果没有,则只收到一部分。然后那部分就丢失了。

有没有办法只检查缓冲区是否已满而不是已经读取它?即如果状态已满,则读取它,如果没有,则将其留给下一次迭代。

我不是这方面的专家,但国旗会MSG_EOR帮助我吗?我的数据是打包的。

我应该read改成recv? recv获取一个套接字作为参数。

任何帮助将不胜感激。

4

3 回答 3

1

有没有办法只检查缓冲区是否已满而不是已经读取它?

您可以尝试使用带有标志 MSG_PEEK的recv 。使用此标志recv以相同的方式工作,但它不会从队列中删除输入数据。

于 2013-02-28T16:29:56.200 回答
0

好吧,我自己解决了。

作为每个包10 bytes,我将buffer大小更改为大小,frequency * 10 bytes以便它可以接收一秒的采集,因此我可以QTimer每隔一秒获得。

于 2013-02-28T16:28:17.067 回答
0

解决我的问题的另一种方法是重放read()函数recv()并添加 flag MSG_WAITALL

于 2013-02-28T17:21:13.953 回答