我正在学习在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
上进行Google搜索并没有让我在任何地方。
我跑来试试这段代码的相关命令:
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;
我想编译器对此进行评估的方式是,在实际调用desc.idVendor
之前可以自由评估libusb_get_device_descriptor()
。我的坏。
答案 0 :(得分:27)
您没有包含完整的,可编译的测试用例。所以我建了一个。这适用于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
答案 1 :(得分:2)
这不是一个独立的答案,而是对Bill Lynch的帖子的评论。我无法在Bill Lynch的帖子中添加评论(缺少声望)所以我决定这样做; - )。
上面的代码中缺少一些细节:
你必须手动释放你从libusb_get_device_list填写的清单。
来自libusb docu:
完成后,您需要取消所有设备的引用,然后使用libusb_free_device_list()释放列表。请注意,libusb_free_device_list()可以为您取消所有设备。在打开设备之前,请注意不要放弃要打开的设备。
答案 2 :(得分:2)
只是添加Bill的回答,以避免您可能会从此行收到的多重警告
scripts
只需删除作业。
libusb_device_descriptor desc = {0};
这不是什么大不了的事,但这些事情让我烦恼。