[C++][libusb] 如何使用libusb打开多个VID和PID相同的设备

1 简介

网络上关于使用 libusb 连接设备大多都停留在单设备的层面,当一台主机上连接了多个 USB 设备时,用这种方法显然不太合适。在处理多个具有相同 VID 和 PID 的 USB 设备时,我们一般可以使用设备的总线编号和设备地址来区分它们。
那么如何获取设备总线编号和设备地址呢?libusb 提供了 libusb_get_bus_numberlibusb_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
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值