通过USB高速传输数据到主机

时间:2011-04-20 14:16:05

标签: visual-c++ usb libusb winusb

我正在通过USB连接与定制的实验室设备(小硬件)进行交谈。如何以最快的速度从实验室设备获取数据?

主机是Windows XP计算机,在Visual Studio中使用libsub-win32运行c代码。小硬件收集数据,大量数据。主机可以请求此数据然后读取它。一切都很好。困扰我的是速度,粗略估计是1Mbit / s,这远远低于480 Mbit / s USB2支持。设备应该能够以至少该速度向我发送数据。我对USB和libusb-win32几乎都没有经验,但我试过阅读它们。虽然我没有看到在何处以及如何更改任何USB通信设置。在规范中,高速公交车上似乎有一种称为微框架的东西。我该如何使用它们?

我不一定要使用libusb-win32库。你有其他建议吗?

有关当前实施的详细信息: 如上所述,我使用libusb-win32进行通信。所有初始化都是从下载中包含的一个小例子中复制的。

usb_init(); 
...
usb_open();
usb_set_configuration(...);
usb_claim_interface(...);

然后我(使用usb_bulk_write(...)和usb_bulk_read(...))与实验室设备交谈并说服它与我分享它的数据。它以512字节的块为单位提供数据。使用usb_bulk_read(...)读取每个这样的块。

编辑2011年4月27日: 看起来我正在使用全速,但不是高速。我如何获得高速?我在usb描述符文件中得到了一些参数错误吗? (是的,我正在使用USB2.0,设备应该支持高速。)


编辑2011年5月17日: 我现在使用winUSB实现了通信(写了一个.inf文件和c ++ - 程序)。使用WinUSB的好处是它可以告诉我它是否试图使用高速。它确实如此,但我仍然没有超过11 + -2 Mbit / s。为什么?

根据USB2.0协议,计算机应该发送帧起始标记(每个ms发送一次),我认为它正在进行 - 因此是11Mbit / s。但是当使用高速时,它表示“高速使用长度为125us的'Microframe'(每毫秒8个微帧)。通过在8个连续重复每个帧编号,在1ms帧编号的对应关系保持在高速SOF包中微帧“。我真的不明白这一点,但不经常发送微帧可能是问题吗?有人了解这个协议请赐教我!我想了解这件事是如何工作的,如果我可以让它在我的电脑上运行它。


编辑6月15日

问题解决了:计算机端的任何改动都不能使通信速度超出预期(如果你没有改变端点的数量而你真的有USB2.0连接)。这里的问题在于处理器代码以非常耗时的方式使用其存储区域。这使得这个问题成为一个非问题的问题。感谢所有指针和信息。我学到了很多关于USB的知识!

3 个答案:

答案 0 :(得分:1)

尝试使用WinUSB官方微软驱动程序,我认为这会有所帮助。您还可以找到有关如何使用它的示例Jan Axelson's website,特别是与WinUSB的this页面交易。作为补充论据,即使LibUSB依赖于WinUSB。

我想问你的实验室设备是什么类型的设备:HID,CDC等?因为它还取决于你的后端设备。它是一个HID(鼠标,键盘)你不能指望超级速度。

答案 1 :(得分:1)

真的需要检查您的USB设备运行的模式。为此, 打开设备管理器,然后导航: 视图 - >设备连接。

现在您必须将设备树折叠到USB设备。它将落后于其中一个 “标准XYZ USB主机控制器”。

使用XYZ,您可以判断其是高速还是满/低:如果XYZ是“增强型 PCI到USB”,那么设备确实以高速480 MBit / s运行。但是如果上层主机控制器是“OpenHCD USB”或其他东西(可能是UHCI的东西,我这里没有英特尔主板),则设备以全速运行 - 最大12 MBit / s。许多“USB 2.0”微控制器仅支持全速而非高速。

更新

在下列情况下,设备全速运行:

  • 中间有一个USB 1.1集线器,一个不能说高速的话筒
  • 设备本身只能全速通话。

答案 2 :(得分:0)

如何计算数据传输速度?

  1. 数据传输速度计算 MAY 不正确或
  2. 处理数据传输的线程数较少;因此速度较慢。
  3. 我没有使用过libusb-win32库,也没有深入使用USB,但这些要点可以帮助你找到真正的根本原因或问题,如果有的话。