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

Check state of buffer in Bluetooth socket

本文关键字:缓冲区 状态 插座 检查      更新时间:2023-10-16

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

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

我用这个,

sock = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
numb = read (sock, buf, 10);

如果麻木等于10,包裹还可以,所以我处理它。如果不可以,只收到一部分。然后那个部分就丢失了。

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

我不是这方面的专家,但MSG_EOR标志能帮我吗?我的数据是打包的。

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

如有任何帮助,我们将不胜感激。

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

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

我自己解决了。

作为每个包10 bytes,我将buffer的大小更改为具有frequency * 10 bytes的大小,以便它可以接收一秒钟的采集,并且因此我可以具有一秒钟间隔的QTimer

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