如何使用libusb和libusb_get_device_descriptor()?(How to

2019-08-16 18:59发布

我正在学习使用libusb V1.0.0首次在Ubuntu 12.10。 下面是我使用的尝试和了解如何使用这个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);

在这一点上,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);

......那么当libusb_get_device_descriptor()返回时,我看到desc保持不变,证实了我,我没有收到我从这个API的期望。

我也试着运行a.out为根,以防万一,这需要更高的权限。 做的一个关于谷歌搜索libusb_get_device_descriptor一直没有得到我的任何地方。

相关命令我跑去试试这个代码:

sudo apt-get install libusb-1.0.0-dev
g++ -ggdb test.cpp -lusb-1.0
./a.out 

啊! 疯狂的用户错误! 沙尔斯的代码让我看着办吧。 下面是我实际使用的代码 - 看你是否能发现错误:

std::cout << "rc == " << libusb_get_device_descriptor(dev, &desc) << std::endl
          << "vendor == " << desc.idVendor << std::endl;

我猜编译器评估这种方式,它是免费的评估desc.idVendor该呼叫之前libusb_get_device_descriptor()已实际取得。 我的错。

Answer 1:

您没有包括一个完整的,可编译测试用例。 所以,我建一个。 这对我的作品在CentOS 6 64。 我也运行此为普通用户帐户。

资源

#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);
}

产量

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


Answer 2:

这不是一个独立的答案,它更比尔林奇的信息发表评论。 我不能添加评论比尔林奇的帖子(缺少声望),所以我决定做这样;-)。

有一个小细节在上面的代码丢失:

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

从libusb的实况 :

您预计unreference所有的设备,当你与他们做,然后释放与libusb_free_device_list名单()。 需要注意的是libusb_free_device_list()可以UNREF为你的所有设备。 要小心,不要unreference你即将打开,直到你已经打开后的设备。



Answer 3:

只需添加到比尔的答案,避免多次警告你可能会从该行收到

libusb_device_descriptor desc = {0};

只需删除该任务。

libusb_device_descriptor desc;

不是一个大问题,但这些事情打扰我。



文章来源: How to use libusb and libusb_get_device_descriptor()?