使用Libusb-win32-1.2.6.0获取设备数量出错

时间:2017-08-11 17:18:26

标签: c++ winapi usb libusb libusb-win32

我正在尝试在VS2010上运行用libusb-win32编写的简单代码,以获取有关所连接USB设备的信息。我无法让它成功运行。

#include <stdio.h>
#include <string.h>
#include "lusb0_usb.h"

int verbose = 1;

int print_device(struct usb_device *dev, int level);

int main(int argc, char *argv[])
{
    struct usb_bus *bus;

    if (argc > 1 && !strcmp(argv[1], "-v"))
        verbose = 1;

    usb_init();
    usb_set_debug(255);

    int nBusses = usb_find_busses();
    int nDevices = usb_find_devices();
    if(nDevices <=0) return 0;
    for (bus = usb_get_busses(); bus; bus = bus->next)
    {
        if (bus->root_dev && !verbose)
            print_device(bus->root_dev, 0);
        else
        {
            struct usb_device *dev;

            for (dev = bus->devices; dev; dev = dev->next)
                print_device(dev, 0);
        }
    }

    return 0;
}

项目配置是Win32,调试,我使用的是x86 dll&amp; lib文件。我能够编译代码。 usb_find_busses()返回1&amp; usb_find_devices()返回0.我不明白为什么我没有得到正确的数字。打印总线 - &gt; root_dev打印以下输出。

Dev #0: 0000 - 0000
bLength:             18
bDescriptorType:     01h
bcdUSB:              0200h
bDeviceClass:        09h
bDeviceSubClass:     00h
bDeviceProtocol:     00h
bMaxPacketSize0:     40h
idVendor:            0000h
idProduct:           0000h
bcdDevice:           0100h
iManufacturer:       0
iProduct:            0
iSerialNumber:       0
bNumConfigurations:  0
  Couldn't retrieve descriptors

我运行了inf-wizard.exe,在那里我可以看到所有带有供应商和设备ID的设备。我不明白我错过了什么。

1 个答案:

答案 0 :(得分:1)

usb_find_devices() documentation中的libusb 0.1 API说:

  

返回自上次调用此函数以来的更改次数(删除了新设备和设备的总数)。

因此,它不会像您期望的那样返回可用设备的数量。如果需要该值,请枚举自行计算设备的总线列表。  否则,只需忽略计数并继续进行总线打印循环,它将在任何连接的设备上运行。

话虽如此,有一个较新的libusb 1.0 API,但其文档根本没有提到usb_find_devices()usb_find_devices()似乎已替换为新的usb_get_devices_list()功能:

  

返回当前连接到系统的USB设备列表。

     

这是寻找USB设备运行的切入点。

根据libusb website

,您确实应该使用较新的1.0 API
  

有几种libusb-0.1 API实现:

     
      
  • libusb-0.1是第一个libusb实现。
  •   
  • libusb-compat-0.1是一个兼容库,它使用libusb-1.0 API提供libusb-0.1 API。
  •   
  • libusb-win32是libusb-0.1 API的仅Windows实现。 libusb-win32项目还创建了开源libusb0.sys Windows内核驱动程序,该驱动程序公开了一个用户空间API,允许在Windows内核之外访问USB设备。
  •   
     

...

     

因为0.1和1.0 API使用不同的前缀,所以它们彼此兼容。两者通常并行安装在系统上。 我们强烈建议将libusb-1.0与libusb-compat-0.1一起使用,而不是使用古老的libusb-0.1代码,以便在程序的不同部分使用0.1 API和1.0 API的程序,或者在程序使用的不同库中,都将使用libusb-1.0进行实际的设备访问。这对于避免在同一进程中使用的libusb-1.0和libusb-0.1之间的潜在冲突非常重要

     

... 建议所有新开发使用libusb-1.0。鼓励开发人员移植使用libusb-0.1的现有应用程序以使用新API。

     

...

     

libusb-0.1(旧版API)

     

...

     
      
  • 请注意,libusb-win32是一个单独的项目,仍然可以看到活跃的开发。下一代libusb-win32内核驱动程序(libusbk.sys)基于KMDF。 ​libusbk库将支持现有的libusb-win32 API,libusb-1.0 API和类似WinUSB的API。建议使用libusb-win32 API的libusb-win32用户继续使用它,因为libusb-win32项目将支持它。一旦集成libusbk后端,也将支持对libusb-1.0感兴趣的 libusb-win32用户。未来增强libusb-1.0 API(比如libusb-1.1)可能需要更适合Windows用户。
  •