检查蓝牙插座中缓冲区的状态
Check state of buffer in Bluetooth socket
我创建了一个套接字,用于从蓝牙中的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
。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 套接字读取后,我在缓冲区中看到意外输入
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何检查已使用的 UDP 缓冲区状态
- 顶点缓冲区的直接状态访问
- 我应该缓存OpenGL状态,比如当前绑定的缓冲区,还是OpenGL会这样做
- 检查蓝牙插座中缓冲区的状态