使用Delphi XE2
和TJvHidDevice
类从Jedi
库,我设法与USB设备(pic32mx7
板,我的代码运行在其上)成功通信。 “发送请求,等待单一响应”的通常方式起作用。使用Delphi + Jedi,当设备发送“太快”时丢失USB数据
问题在于导致大量连续响应的命令。如果设备尽可能快地发送这些响应 - 或者即使我在它们之间增加了一个小的延迟(如5ms),我也会丢失数据包(报告?帧?)。对于所有这些事件来说,事件似乎都不会起作用。如果我在设备的代码中添加更大的延迟,问题就会消失。
我用USBPcap
程序捕获USB数据并将其转储到一个文件中,一旦我在WireShark中打开它,它包含设备发送的所有数据(我发送255个数据包作为测试,所有零和一个“1”在每个数据包中将其位置移动1个位置)。所以,我认为设备和Windows都在做他们的工作。
为了确保我的Delphi代码没有错误,我尝试了Jedi示例项目“DevReader”(这里是main.pas code),它在屏幕上转储数据并且它也丢失了数据包。
我觉得应该有更多关于Jedi的USB类的网络信息,但我很难找到它。
我可以通过聚合/压缩设备的响应来避免此问题,但仍然想知道发生了什么。
编辑:
- 从一个控制台应用程序尝试:包中不再丢失。
- 修改了绝地演示应用程序只计算接收到的数据包并更新屏幕上的计数器标签(无强制窗口重绘) - 没有丢失数据包。
- 在OnData事件中添加了sleep(1) - 没有丢失数据包。
- 在OnData事件中添加sleep(2) - 再次丢失数据包。
这看起来像Jedi线程读取数据不能被任何处理延迟 - 不应该有一些数据缓冲(由Windows?),这将允许这种类型的处理延迟?从数据包丢失的“模式”来看,似乎有缓冲,但它是不够的,因为我可以接收30个数据包然后丢失5然后接收另外20个等。
我将修改我的代码来复制数据并尽快退出OnData事件,以便线程具有最少的“停机时间”,我将报告结果。
首先带走来自阅读过程的GUI。只需将数据转储到稍后分析的内容即可。如果有效,你知道该怎么做。 –
什么是您的HID IN端点描述符的“bInterval”值? –
@Turbo bInterval = 1,输入和输出相同 – Milos