如何使用libusb和libusb_get_device_descriptor()?

Sté*_*ane 14 c++ libusb libusb-1.0

我正在学习在Ubuntu 12.10上第一次使用libusb v1.0.0.这是我用来尝试理解如何使用此API的一些小测试代码:

#include <libusb-1.0/libusb.h>
...
libusb_device **list;
libusb_get_device_list(ctx, &list); // Returns 11 USB devices which is correct.
for (size_t idx = 0; list[idx] != NULL; idx ++)
{
    libusb_device *dev = list[idx];
    libusb_device_descriptor desc = {0};
    int rc = libusb_get_device_descriptor(dev, &desc);
Run Code Online (Sandbox Code Playgroud)

此时,rc == 0,意味着它应该已经成功完成.来源:*libusb_get_device_descriptor()*的文档.

但结构desc总是空的.没有任何字段被设置.如果我将上面的最后两行更改为:

    libusb_device_descriptor desc = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int rc = libusb_get_device_descriptor(dev, &desc);
Run Code Online (Sandbox Code Playgroud)

...然后当libusb_get_device_descriptor()返回时,我看到desc保持不变,向我确认我没有得到我对此API的期望.

我还尝试以a.outroot 身份运行,以防万一这需要提升权限.进行谷歌搜索libusb_get_device_descriptor并没有让我到任何地方.

我跑来试试这段代码的相关命令:

sudo apt-get install libusb-1.0.0-dev
g++ -ggdb test.cpp -lusb-1.0
./a.out 
Run Code Online (Sandbox Code Playgroud)

啊! 疯狂的用户错误!sharth的代码帮我搞清楚了.这是我实际使用的代码 - 看看你是否能发现错误:

std::cout << "rc == " << libusb_get_device_descriptor(dev, &desc) << std::endl
          << "vendor == " << desc.idVendor << std::endl;
Run Code Online (Sandbox Code Playgroud)

我想编译器评估它的方式,可以desc.idVendor在实际调用之前自由评估libusb_get_device_descriptor().我的错.

Bil*_*nch 28

您没有包含完整的,可编译的测试用例.所以我建了一个.这适用于CentOS 6 x64.我也将其作为普通用户帐户运行.

资源

#include <cassert>
#include <cstdio>
#include <libusb-1.0/libusb.h>

int main() {
    libusb_context *context = NULL;
    libusb_device **list = NULL;
    int rc = 0;
    ssize_t count = 0;

    rc = libusb_init(&context);
    assert(rc == 0);

    count = libusb_get_device_list(context, &list);
    assert(count > 0);

    for (size_t idx = 0; idx < count; ++idx) {
        libusb_device *device = list[idx];
        libusb_device_descriptor desc = {0};

        rc = libusb_get_device_descriptor(device, &desc);
        assert(rc == 0);

        printf("Vendor:Device = %04x:%04x\n", desc.idVendor, desc.idProduct);
    }

    libusb_free_device_list(list, count);
    libusb_exit(context);
}
Run Code Online (Sandbox Code Playgroud)

产量

Vendor:Device = 1d6b:0002
Vendor:Device = 1d6b:0002
Vendor:Device = 8087:0020
Vendor:Device = 8087:0020
Vendor:Device = 0424:2514
Vendor:Device = 10c4:ea60
Vendor:Device = 051d:0002
Vendor:Device = 0624:0248
Run Code Online (Sandbox Code Playgroud)

  • 你的答案比libusb网站上的文档更好...... (17认同)