如何使用libusb和libusb_get_device_descriptor()
How to use libusb and libusb_get_device_descriptor()?
我第一次在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,这意味着它应该已经成功完成。来源:*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
。我的坏。
您没有包含完整的、可编译的测试用例。所以我建了一个。这适用于我在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:%04xn", desc.idVendor, desc.idProduct);
}
libusb_free_device_list(list, 1);
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
这不是一个独立的答案,它更多的是对Bill Lynch帖子的评论。我无法在Bill Lynch的帖子中添加评论(名誉缺失),所以我决定这样做;-)。
上面的代码中缺少一点细节:
您必须手动从libusbget_device_list中释放已填充的列表。
来自libusb docu:
使用完所有设备后,您需要取消引用这些设备,然后使用libusb_free_device_list()释放列表。请注意,libusb_free_device_list()可以为您取消所有设备的刷新。小心不要取消引用你要打开的设备,直到你打开它。
只是为了添加到Bill的答案中,以避免您可能从这行收到的多个警告
libusb_device_descriptor desc = {0};
只需删除分配即可。
libusb_device_descriptor desc;
不是什么大不了的事,但这些事情困扰着我。
- USB传输的LibUSB C++格式不同
- 使用libusb.h时出现编译器错误
- 如何使用libusb获取驱动器名称?
- 在 c++ libusb 中将数据写入得利捷 PM9500 扫描仪的正确格式
- Android USB 附件模式无法使用 libusb 与主机 PC 一起读/写
- 如何使用 libusb 为 USB 设备设置备用设置
- 将 libusb 设备存储在易于访问的容器中,无需所有权
- Android N libusb_init返回 -1 无法初始化 libusb
- libusb:错误 [submit_bulk_transfer] submiturb 失败错误 -1 errno=2 -
- 字符串由 libusb 传输,但打印机无法打印
- 使用 Libusb 1.0 发送中断传输会返回LIBUSB_ERROR_IO,但在接收时不会
- ROS use libusb C++
- CMake/Make cannot find libusb
- C++使用 libusb 发送数据(使用 RS 232)
- C ++ libusb:如何将数据发送到设备
- libusb如何获得vid和pid
- 如何在Mac OS X上使用Qt设置libusb?(尝试跨平台方法)
- 如何通过 int-descriptor 找出文件名?(或"can I..?")
- 使用 libusb-win32 与 USB 到 DMX512 接口通信,找不到任何端点
- 在多线程环境中,什么可能导致"bad file descriptor"?