【问题标题】:Error getting number of devices using Libusb-win32-1.2.6.0使用 Libusb-win32-1.2.6.0 获取设备数量时出错
【发布时间】:2017-08-11 17:18:26
【问题描述】:

我正在尝试在 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 & lib 文件。我能够编译代码。 usb_find_busses() 返回 1 和 usb_find_devices() 返回 0。我不明白为什么我没有得到正确的数字。打印 bus->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 的设备。我不明白我错过了什么。

【问题讨论】:

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


    【解决方案1】:

    libusb 0.1 API 中的 usb_find_devices() documentation 表示:

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

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

    话虽如此,有一个更新的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-like API。建议使用 libusb-win32 API 的 libusb-win32 用户继续使用它,因为 libusb-win32 项目将支持它。 对 libusb-1.0 感兴趣的 libusb-win32 用户,一旦集成了 libusbk 后端,也将得到支持。 libusb-1.0 API(比如 libusb-1.1)的未来增强功能可能需要更适合 Windows 用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多