我创建了一个套接字,用于从蓝牙的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
获取套接字作为参数。
非常感谢任何帮助。
答案 0 :(得分:1)
有没有办法只检查缓冲区是否已满而不是已经读取?
您可以尝试将 recv 与标志MSG_PEEK一起使用。使用此标志 recv 的工作方式相同,但不会从队列中删除输入数据。
答案 1 :(得分:0)
我自己解决了这个问题。
作为每个包10 bytes
,我将buffer
大小更改为frequency * 10 bytes
的大小,以便它可以获得第二次获取,因此我可以拥有QTimer
间隔一秒钟。
答案 2 :(得分:0)
解决我的问题的另一种方法是使用read()
重播recv()
函数并添加标记MSG_WAITALL
。