我第一次在Ubuntu12.10上学习使用libusbv1.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,这意味着它应该已经成功完成。资料来源:*.
但是结构desc总是空的。所有的田地都没有固定过。如果我将上面的最后两行更改为:
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上搜索谷歌并没有给我带来任何帮助。
为了尝试这段代码,我运行了相关命令:
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()。是我的错。
发布于 2013-02-06 05:26:42
您没有包含完整的、可编译的测试用例。所以我造了一个。这在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发布于 2016-03-24 10:29:45
这不是一个独立的答案,更多的是对比尔·林奇的帖子的评论。我无法在比尔·林奇的帖子中添加评论(名誉缺失),所以我决定这样做;-)
上面的代码中缺少一些细节:
您必须释放您从libusb_get_device_list手工填写的列表。
来自libusb docu
当您完成这些设备时,您应该取消引用所有设备,然后使用libusb_free_device_list()释放列表。请注意,libusb_free_device_list()可以为您取消所有设备。小心不要取消你将要打开的设备,直到你打开它。
发布于 2016-05-27 02:34:55
为了补充Bill的答案,为了避免您可能从这一行收到的多次警告
libusb_device_descriptor desc = {0};只需删除作业即可。
libusb_device_descriptor desc;没什么大不了的,但这些事让我很困扰。
https://stackoverflow.com/questions/14722083
复制相似问题