c - 如何防止在 USB 传输中丢失数据?
问题描述
我正在编写一个通过 libusb 直接与 USB 外围设备交互的程序。有问题的设备(除其他外)有一个按钮,上面有一个 LED。我通过异步中断传输读取按钮的状态,然后一旦检测到按下,我将按钮的 LED 设置为打开,直到检测到按钮已被释放。每次收到更多数据时,我都会进行新的异步中断传输以从设备中读取,因此我可以循环读取设备中的多个事件。
这样做的问题是,除非在生成数据时我在设备上有待处理的读取操作,否则我不会从设备获取数据。也就是说,如果我在按下或释放按钮时没有主动等待读取,那么该数据就会丢失。因为在接收数据和发出另一个异步中断读取请求之间存在一个窗口,所以有时数据会丢失,例如我会收到“按钮按下”事件,但不会收到“按钮释放”事件,即使在我收到后 LED 仍然亮着停止按下按钮。
是否有其他方式与设备交互(循环中的中断传输除外)可以保证没有数据丢失,即使在设备生成数据时我没有挂起的读取操作?或者,有没有办法确保没有我不从设备读取的窗口,并以这种方式防止数据丢失?
解决方案
我通过一次简单地安排多个中断传输来解决这个问题,所以当一个返回时,仍然会有另一个在等待数据。我担心如果第二个在第一个安排另一个中断传输之前返回会发生什么,但实际上,这个设备似乎不会发生这种情况。
推荐阅读
- sublimetext3 - Sublime 3中每个文件的多个片段
- internet-explorer - Internet Explorer:无法将站点添加到安全区域
- python - Binance API 返回:APIError(code=-1013):过滤器失败:PRICE_FILTER
- apache-kafka - 如何在 Apache kafka 中启用 SFTP 源连接器?
- google-search - 在 Google 上使用特殊字符(搜索)
- apache-spark - 导入与安装 spark
- node.js - Nextcloud OCS 上查询的 XML 数据格式
- docker - 使用 Docker 在 Bamboo 上运行 Selenium Grid
- git - 如何通过 ssh 获取托管在 Azure DevOps Repo 中的 Terraform 模块
- xamarin.forms - Xamarin SkiaSharp:在不同的屏幕分辨率上绘图