检查蓝牙插座中的缓冲区状态

时间:2013-02-25 10:31:36

标签: c++ linux bluetooth buffer rfcomm

我创建了一个套接字,用于从蓝牙的rfcomm套接字接收数据。

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

我用这个,

sock = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

numb = read (sock, buf, 10);

如果麻木等于10,那么包装正常,所以我处理它。如果没有,只收到一部分。然后那部分就丢失了。

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

我不是这方面的专家,但旗帜MSG_EOR会帮助我吗?我的数据来自包裹。

我应该将read更改为recv吗? recv获取套接字作为参数。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

  

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

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

答案 1 :(得分:0)

我自己解决了这个问题。

作为每个包10 bytes,我将buffer大小更改为frequency * 10 bytes的大小,以便它可以获得第二次获取,因此我可以拥有QTimer间隔一秒钟。

答案 2 :(得分:0)

解决我的问题的另一种方法是使用read()重播recv()函数并添加标记MSG_WAITALL