1 简介
网络上关于使用 libusb 连接设备大多都停留在单设备的层面,当一台主机上连接了多个 USB 设备时,用这种方法显然不太合适。在处理多个具有相同 VID 和 PID 的 USB 设备时,我们一般可以使用设备的总线编号和设备地址来区分它们。
那么如何获取设备总线编号和设备地址呢?libusb 提供了 libusb_get_bus_number 和 libusb_get_device_address 函数来获取这些信息。
2 代码案例
以下是一个示例代码,展示如何使用总线编号、设备地址和序列号来区分多个具有相同 VID 和 PID 的设备:
#include <iostream>
#include <libusb-1.0/libusb.h>
int main() {
libusb_context *context = nullptr;
libusb_device **device_list = nullptr;
libusb_device_handle *device_handle = nullptr;
ssize_t device_count;
int result;
// 1 初始化libusb库并创建libusb_context
if (libusb_init(&context) != 0) {
std::cerr << "Failed to initialize libusb." << std::endl;
return 1;
}
// 2 获取连接的USB设备列表
device_count = libusb_get_device_list(context, &device_list);
if (device_count < 0) {
std::cerr << "Failed to get USB device list." << std::endl;
libusb_exit(context);
return 1;
}
// 3 遍历设备列表查找指定VID和PID的设备
for (ssize_t i = 0; i < device_count; ++i) {
libusb_device *device = device_list[i];
libusb_device_descriptor descriptor;
// 3.1 获取设备描述符
if (libusb_get_device_descriptor(device, &descriptor) != 0) {
std::cerr << "Failed to get device descriptor." << std::endl;
continue;
}
// 3.2 检查VID和PID
if (descriptor.idVendor == 0x1A86 && descriptor.idProduct == 0x5537) {
uint8_t bus_number = libusb_get_bus_number(device);
uint8_t device_address = libusb_get_device_address(device);
std::cout << "Found device: VID=0x" << std::hex << descriptor.idVendor
<< " PID=0x" << std::hex << descriptor.idProduct << std::dec
<< " Bus=" << static_cast<int>(bus_number)
<< " Address=" << static_cast<int>(device_address) << std::endl;
// 3.2.1 打开设备获取设备句柄
result = libusb_open(device, &device_handle);
if (result != 0) {
std::cerr << "Failed to open device. Error: " << libusb_error_name(result) << std::endl;
continue;
}
// 3.2.2 关闭设备句柄
libusb_close(device_handle);
std::cout << "Device handle closed." << std::endl;
}
}
// 4 释放设备列表
libusb_free_device_list(device_list, 1);
// 5 关闭libusb库并释放libusb_context
libusb_exit(context);
return 0;
}
3 总结
操作步骤基本可以按以下流程来进行
- 1 初始化 libusb 库并创建 libusb_context
- 2 获取连接的USB设备列表
- 3 遍历设备列表查找指定VID和PID的设备
- 3.1 获取设备描述符
- 3.2 检查VID和PID
- 3.2.1 打开设备获取设备句柄
- 3.2.2 关闭设备句柄
- 4 释放设备列表
- 5 关闭libusb库并释放libusb_context