如何使用 libusb 和 libusb_get_device_descriptor()?
Posted
技术标签:
【中文标题】如何使用 libusb 和 libusb_get_device_descriptor()?【英文标题】:How to use libusb and libusb_get_device_descriptor()? 【发布时间】:2013-01-21 05:43:51 【问题描述】:我正在学习第一次在 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);
此时,rc == 0,意味着它应该已经成功完成了。来源:documentation for *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 中得到我期望的结果。
我还尝试以 root 身份运行 a.out
,以防万一这需要提升权限。在 libusb_get_device_descriptor
上进行谷歌搜索并没有让我得到任何结果。
我运行的相关命令来尝试这段代码:
sudo apt-get install libusb-1.0.0-dev
g++ -ggdb test.cpp -lusb-1.0
./a.out
啊!疯狂的用户错误! sharth 的代码帮我弄清楚了。这是我实际使用的代码——看看你是否能发现错误:
std::cout << "rc == " << libusb_get_device_descriptor(dev, &desc) << std::endl
<< "vendor == " << desc.idVendor << std::endl;
我猜编译器评估这个的方式,在实际调用libusb_get_device_descriptor()
之前评估desc.idVendor
是免费的。我的错。
【问题讨论】:
Your cout was actually undefined behavior. 很高兴为您提供帮助! 【参考方案1】:您没有包含完整的、可编译的测试用例。所以我建了一个。这适用于我在 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);
输出
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
【讨论】:
@Yeti:当然。以后您可以随意进行类似的编辑。 libusb_free_device_list(list, count); void libusb_free_device_list(libusb_device **list, int unref_devices) 释放 libusb_get_device_list 发现的设备列表。如果 unref_device 设置为 1,则列表中的所有设备的引用计数器都会减一。你有 unref_devices 错误【参考方案2】:这不是一个独立的答案,它更像是对比尔林奇帖子的评论。我无法在 Bill Lynch 的帖子中添加评论(缺少声誉),所以我决定这样做 ;-)。
上面的代码中缺少一点细节:
您必须手动释放从 libusb_get_device_list 中填写的列表。
来自libusb docu:
您应该在使用完所有设备后取消对它们的引用,然后使用 libusb_free_device_list() 释放列表。请注意, libusb_free_device_list() 可以为您取消引用所有设备。请注意不要取消引用您将要打开的设备,直到您打开它。
【讨论】:
【参考方案3】:只是添加到比尔的答案中,以避免您可能会从该行收到的多个警告
libusb_device_descriptor desc = 0;
只需删除作业。
libusb_device_descriptor desc;
没什么大不了的,但这些事情让我很困扰。
【讨论】:
以上是关于如何使用 libusb 和 libusb_get_device_descriptor()?的主要内容,如果未能解决你的问题,请参考以下文章
如何最正确地使用 libusb 与连接的 USB 设备通信?
Windows 8.1 上的 Pyusb - 没有可用的后端 - 如何安装 libusb?