我创建了一个套接字,用于从蓝牙中的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
。