如何选择两台同型号USB设备中的目标设备发送命令
针对同型号不同序列号USB设备的定向选择方案
同型号USB设备的VID/PID完全一致,无法通过厂商/产品ID区分,必须通过设备唯一序列号(Serial Number) 或者系统分配的唯一设备路径/实例ID做匹配,不同平台的操作方案如下:
Windows 平台
- 先定位设备标识:打开设备管理器,找到对应USB设备,右键选择「属性」→「详细信息」,属性下拉栏选「设备实例路径」,条目里会包含SN-01/SN-02的序列号字段,记录对应设备的完整实例路径
- 命令行/脚本调用:
- 用
devcon工具匹配指定设备:先执行devcon find *SN-01*定位设备ID,后续发送控制命令时直接绑定该ID即可 - PowerShell场景下可直接按序列号筛选:
Get-PnpDevice | Where-Object {$_.SerialNumber -eq 'SN-01'},获取设备对象后即可调用对应控制接口
- 用
Linux 平台
- 临时匹配设备路径:执行
lsusb -v,找到对应VID/PID的设备条目,查看iSerial字段确认是SN-01还是SN-02,记录对应的总线号和设备号,比如Bus 001 Device 005对应的设备路径为/dev/bus/usb/001/005 - 固定设备路径(推荐,避免插拔后路径变化):在
/etc/udev/rules.d/下新建99-usb-serial.rules规则文件,写入以下内容:
执行SUBSYSTEM=="usb", ATTRS{serial}=="SN-01", SYMLINK+="usb_device_sn01", MODE="0666" SUBSYSTEM=="usb", ATTRS{serial}=="SN-02", SYMLINK+="usb_device_sn02", MODE="0666"udevadm control --reload-rules && udevadm trigger重载规则后,就可以通过固定路径/dev/usb_device_sn01直接访问指定序列号的设备 - 开发调用时,如果用libusb库,可以先遍历所有匹配VID/PID的设备,调用
libusb_get_device_descriptor获取设备描述符后读取序列号字段,匹配成功后再打开设备发送命令
macOS 平台
- 查看设备信息:执行
system_profiler SPUSBDataType,在对应USB设备条目下找到「序列号」字段,确认SN后记录对应的「位置ID」 - 开发调用时,用IOKit框架筛选指定序列号的USB设备,匹配成功后获取设备句柄即可发送命令
通用注意事项
所有主流USB控制库(libusb、pyusb、WinUSB等)都支持读取设备序列号字段,不要依赖设备枚举顺序或者固定端口号,必须显式匹配serial字段后再打开设备,是稳定性最高的方案。
内容的提问来源于stack exchange,提问作者mannes9715
相关产品推荐
相关产品推荐

