首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用libusb和libusb_get_device_descriptor()?

如何使用libusb和libusb_get_device_descriptor()?
EN

Stack Overflow用户
提问于 2013-02-06 05:15:28
回答 3查看 29.7K关注 0票数 18

我第一次在Ubuntu12.10上学习使用libusbv1.0.0。下面是我用来尝试和理解如何使用这个API的一些小测试代码:

代码语言:javascript
复制
#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);

此时,rc == 0,这意味着它应该已经成功完成。资料来源:*.

但是结构desc总是空的。所有的田地都没有固定过。如果我将上面的最后两行更改为:

代码语言:javascript
复制
    libusb_device_descriptor desc = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int rc = libusb_get_device_descriptor(dev, &desc);

当...then返回时,我看到desc保持不变,这为我确认了我没有从这个API中得到我期望的结果。

我还尝试将a.out作为根用户运行,以防需要提升权限。在libusb_get_device_descriptor上搜索谷歌并没有给我带来任何帮助。

为了尝试这段代码,我运行了相关命令:

代码语言:javascript
复制
sudo apt-get install libusb-1.0.0-dev
g++ -ggdb test.cpp -lusb-1.0
./a.out 

阿!疯狂的用户错误!的密码帮我弄清楚了。下面是我实际使用的代码--看看您是否能发现错误:

代码语言:javascript
复制
std::cout << "rc == " << libusb_get_device_descriptor(dev, &desc) << std::endl
          << "vendor == " << desc.idVendor << std::endl;

我猜编译器评估这一点的方式是,在调用desc.idVendor之前,可以自由地计算libusb_get_device_descriptor()。是我的错。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-06 05:26:42

您没有包含完整的、可编译的测试用例。所以我造了一个。这在CentOS 6 x64上适用于我。我也把它作为一个普通的用户帐户运行。

来源

代码语言:javascript
复制
#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);
}

输出

代码语言:javascript
复制
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
票数 33
EN

Stack Overflow用户

发布于 2016-03-24 10:29:45

这不是一个独立的答案,更多的是对比尔·林奇的帖子的评论。我无法在比尔·林奇的帖子中添加评论(名誉缺失),所以我决定这样做;-)

上面的代码中缺少一些细节:

您必须释放您从libusb_get_device_list手工填写的列表。

来自libusb docu

当您完成这些设备时,您应该取消引用所有设备,然后使用libusb_free_device_list()释放列表。请注意,libusb_free_device_list()可以为您取消所有设备。小心不要取消你将要打开的设备,直到你打开它。

票数 3
EN

Stack Overflow用户

发布于 2016-05-27 02:34:55

为了补充Bill的答案,为了避免您可能从这一行收到的多次警告

代码语言:javascript
复制
libusb_device_descriptor desc = {0};

只需删除作业即可。

代码语言:javascript
复制
libusb_device_descriptor desc;

没什么大不了的,但这些事让我很困扰。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14722083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档