打开多个VID和PID相同的设备,libusb如何区分不同的设备
2026-08-17 17:27:27 来源:华启智能
本文介绍当打开多个VID和PID相同的设备,libusb如何区分不同的设备。libusb通过总线编号和设备地址区分相同VID和PID的USB设备。
背景
当一台主机上连接了多个相同的USB设备(VID和PID相同)时,我们需要区分他们。
一般可以使用设备的总线编号和设备地址来区分它们。
一般可以使用设备的总线编号和设备地址来区分它们。
那么如何获取设备总线编号和设备地址呢?libusb 提供了 libusb_get_bus_number 和 libusb_get_device_address 函数来获取这些信息。
1. 为什么需要区分相同VID和PID的USB设备
在实际开发中,我们经常会遇到需要同时管理多个相同型号USB设备的情况。比如在工业控制领域,可能需要同时连接多个相同型号的设备;这些设备通常具有相同的厂商ID(VID)和产品ID(PID),这就给设备管理带来了挑战。
想象一下这样的场景:你正在开发一个数据采集系统,需要同时从3个完全相同的USB-840数据采集卡获取数据。当你把这些设备插入电脑后,系统会识别出3个VID和PID完全相同的设备。这时候问题就来了 - 如何确保每个设备采集的数据能够正确对应到各自的物理位置?如果无法区分这些设备,采集到的数据就会混在一起,失去意义。
我曾经在一个工业自动化项目中就遇到过这样的问题。当时需要控制8个相同的USB继电器模块,最初尝试用VID和PID来识别设备,结果发现根本无法区分。后来通过研究libusb的文档,发现总线编号和设备地址才是区分相同VID/PID设备的关键。
2. 理解USB设备识别的基本概念
2.1 VID和PID的局限性
VID(Vendor ID)和PID(Product ID)是由USB Implementers Forum分配给厂商和产品的标识符。它们可以唯一标识一类设备,但无法区分同一型号的不同设备实例。就像汽车的品牌和型号可以区分大众和丰田,但无法区分同一型号的两辆不同汽车。
2.2 总线编号和设备地址的作用
每个USB设备在系统中都有两个关键属性:
总线编号(Bus Number):标识设备连接在哪条USB总线上。现代计算机通常有多条USB总线。
总线编号(Bus Number):标识设备连接在哪条USB总线上。现代计算机通常有多条USB总线。
设备地址(Device Address):在特定总线上分配给设备的唯一地址。这个地址在设备连接时由主机分配。
这两个属性组合起来,就能在系统中唯一标识一个USB设备,即使它们的VID和PID完全相同。
2.3 libusb中的设备描述结构
在libusb中,libusb_device结构体代表一个USB设备,它包含了设备的完整信息。我们可以通过以下函数获取关键信息:
| 函数名称 | 所属类别 | 功能描述 | 返回值说明 | 使用场景 |
| libusb_get_bus_number() | 拓扑信息 | 获取设备所在的总线号 | 总线编号 | 设备定位和识别 |
| libusb_get_device_address() | 拓扑信息 | 获取设备在总线上的地址 | 设备地址 |
设备定位和识别 |
参考资料:
https://blog.csdn.net/qq_37380933/article/details/139330998
https://blog.csdn.net/weixin_29163797/article/details/159569074
https://www.cnblogs.com/clnchanpin/p/19529413
https://blog.csdn.net/github_37157365/article/details/78771403

