USB序列号相同产生的问题及解决

有两个以上的USB设备,他们的Vendor ID和Product ID都一样,如何指定对应的usb插口和/dev/ttyUSB的序号? 如果有两个以上的USB设备,他们的Vendor ID和Product ID都一样,那么无法通过Vendor ID和Product ID来区分它们。需要采取其他方式来指定对应的USB插口和/dev/ttyUSB的序号。有以下两条思路:1,通过设备的序列号(Serial Number)来区分它们。每个USB设备都有一个唯一的序列号,可以在设备的属性中找到。可以通过在udev规则中设置SYMLINK选项来为每个设备指定一个独特的符号链接名,从而将其与/dev/ttyUSB的特定序号关联起来。 阅读详情
AI摘要

探讨了USB设备在Windows系统中的DeviceID命名规则及序列号重复导致的问题,并提出了解决方案。对于某些USB设备(如U盘)的序列号在MaskROM或OTP中固定不变,从而引发系统崩溃的现象进行了深入分析。

最近做了一些关于USB的方案,发现了一个共通的问题。

由于Windows的设备驱动给每个设备一个设备标识(Device ID)。设计的初衷是用来区分每个设备的。
USB设备的DeviceID命名规则很简单。举例来说,如果一个USB设备的VID是0x1234、PID是0x5678、序列号是00001,则它的DeviceID为:
USB\VID_1234&PID_5678\00001
由于VID是USB厂商的唯一标识、PID是厂商定义的产品的唯一标识、序列号理论上应该是同类产品的唯一标识。因此理论上说这样的DeviceID可以区分所有USB设备。
如果没有序列号,Windows则将Device ID的序列号部分用HUB及其端口相关的一串文字来代替,也可以基本保证DeviceID的唯一性。这种Device ID形如:
USB\VID_1234&PID_5678\X&YYYYYYYY&Z
其中X是设备的层次、Z表示设备插到HUB的哪个端口、YYYYYYYY是与HUB有关的某常数。

因此,当USB的设备描述符中指出有序列号时,就必须保证每个产品有一个唯一的序列号。
但不幸的是,现实中序列号存在重号的情况。当一个USB产品的程序是在MaskROM内或写入OTP的话,由于MaskROM和OTP很难做到每个产品都有自己区别于其它相同产品的序列号。因此这种方案如果有序列号,则所有产品都是同一序列号。问题就发生了。

早期Windows驱动完全没有处理Device ID重名,遇到这种情况只能崩溃。例如一直没有更新的HID设备,一插即死。
稍后期的驱动似乎意识到这种情况的严重性(即便不是驱动本身的问题,驱动也不应该在这种情况下使系统崩溃),试图去解决它,但可惜不彻底。例如USBSTOR驱动,当同一个HUB上插多个相同序列号的U盘时,驱动会认为后来者没有序列号,以为这样就解决问题了。但它忘了HUB有层次性。当两个序列号相同的U盘插到不同HUB时(包括有插主机的RootHUB),驱动忘了给后来者改名了。系统还是崩溃。

难道就没有彻底的解决办法吗?有。
事实上,问题的症结不在Class层而在于USB本身,即EP0枚举的处理上。微软似乎已经认识以了这一点,因此并没有打算在Class层彻底解决问题。
解决办法是,在注册表[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\UsbFlags]中添加:
"GlobalDisableSerNumGen"=hex:01
"IgnoreHWSerNum12345678"=hex:01
其中的12345678就是指VID和PID。有多少有问题的VID、PID就要增加多少项。
作这样的处理之后,不管是HID、Mass Storage还是其它设备,都没有问题了。

但毕竟这个问题的根源不在驱动,而在于设备Firmware。因此在写Firmware的时候要留心。Flash方案可以随时升级,问题不大;如果是OTP方案,建议采用烧写时可改写序列号的芯片方案;是MaskROM方案,则建议不要用序列号。
对多个同厂相同ID的USB转串口绑定端口同时解决usb device读写permission denied 对多个同厂相同ID的USB转串口绑定端口同时解决usb device读写permission denied ubuntu下USB设备号从0开始,接入第二个为1,再接入为2 ,我们使用了3个usb转串口的模块,设备号不固定;而且总是会出现读写权限的问题,提示为:Permission denied 解决办法:利用udev的规则 [1] , 将端口重映射到自定义的名称,并修改权限 $ lsus... 阅读详情

相关推荐

通过Windows注册表获取U盘、移动硬盘和USB读卡器等设备的PID、VID和序列号

本文方法通过注册表可以的获取当前插入计算机的U盘、移动硬盘和USB读卡器等设备的PID、VID和序列号,这些信息可以用于标识设备和对设备进行下一步动作,如弹出设备需要PID和VID。

Trust Bo 4万+

windows系统查看USB设备序列号方法汇总

查看USB设备序列号方法汇总

Perfect886的博客 2万+

关于USB通信中使用libusb的心得 (主要是针对VID PID相同的情况下的处理)

前言: 产生问题的情况背景: 现在我有两台打印机设备 分别是 A 和 B 并且A,B 的USB通讯线为同一种 即PID和VID相同 现在的操作 是 A,B两台设备同时连接PC机 并且在不进行拔插的情况下 先后控制A,B设备 具体操作为:A进卡->A后方出卡->B接住A后出的卡->B后出卡 (即两个设备的先后使用 但是时间衔接很近 无法人工干预) 解决办...

爬行的菜鸟的博客 3022

使用正点原子的触摸USB鼠标例程修改产品序列号iSerialNumber为自定义序列号

在使用正点原子mini开发板触摸usb鼠标例程时,通过USB抓包软件USBlyzer抓取到的产品序列号iSerialNumber是一组12位的字符串。如图1所示。通过程序跟踪得知,这个字符串是stm32唯一设备ID号。寄存器地址如图2所示。 图1、产品序列号显示为stm32的唯一设备ID号 图2、stm32唯一设备ID寄存器地址 usb_desc.c程序里面Joystick_StringSerial数组虽然写了“STM32”,如图3所示。但由于在hw_config.c程序里面的void G..

u013072995的博客 1650

Windows10下解决相同型号USB设备重复枚举问题:注册表修改+PsTools实战指南

本文深入解析Windows 10下同型号USB设备重复枚举问题的根源,并提供两种核心解决方案。一是通过修改注册表添加`IgnoreHWSerNum`标志实现一劳永逸的配置;二是利用PsTools工具获取SYSTEM权限,彻底清理设备枚举历史记录。文章还提供了C#自动化脚本的实战指南,帮助开发者和IT人员高效、稳定地解决此问题。

weixin_29199873的博客 291

Windows10下解决相同型号USB设备重复枚举问题:注册表+PsTools双方案实测

本文针对Windows 10系统下同型号USB设备因缺乏唯一序列号导致重复枚举、识别混乱的问题,提供了两种深度解决方案。一是通过修改注册表添加`usbflags`标志,引导系统忽略硬件序列号检查;二是利用PsTools工具获取SYSTEM权限,彻底清理混乱的设备枚举记录。文章详细解析了问题根源、操作步骤、方案优劣及适用场景,帮助IT管理员和开发者实现设备的稳定识别与批量部署。

beer8的博客 505

解决同VID/PID usb设备驱动重复安装的问题

电脑连接同型号usb设备不同机器会为每个设备都安装驱动,这样很麻烦,浪费时间。下面为解决方案: (1)每一台设备使用相同的SN,手机上用的sn一般是flash sn或设备写的sn号 (2)电脑端忽略设备SN差异 WinXP:新建一个reg输入   Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\Current...

u013463707的专栏 9777

修改CH340 VID/PID解决USB转串口驱动冲突的完整指南

USB设备通过VID(厂商ID)和PID(产品ID)唯一标识硬件身份,操作系统依此加载驱动并分配端口。当多块开发板使用相同USB转串口芯片(如CH340)时,默认相同的VID/PID会导致设备识别冲突、COM口漂移甚至无法识别。本文基于官方CH34xSerCfg配置工具,从技术原理到工程实践,讲解如何通过修改芯片内部EEPROM中的PID甚至VID,让每块板卡拥有独立身份,从根源解决驱动“撞车”。该方法不影响串口功能,适用于嵌入式调试、工控设备维护、多设备批量管理场景。文中还整理了常见失败原因与恢复技巧,帮

weixin_34014555的博客 272

USBIP/VHCI(二)实现USB设备唯一序列号iSerialNumber

序言 原版USBIP/VHCI驱动尚未实现“USB设备唯一序列号”功能。 当一个USB设备首次接入虚拟总线时,Windows注册表

flyincat511的博客 244

USB之(二)通讯协议

SYNC PID DATA CRC EOP 1.1 同步

ivy_reny的专栏 8388

使用Wireshark进行USB协议分析:从设备描述符解码到故障排查实战

USB协议作为现代计算机与外围设备通信的基石,其核心在于一套标准化的主从通信模型。理解其工作原理,尤其是设备枚举过程,是进行硬件调试、驱动开发和系统集成的关键。设备描述符作为USB设备插入主机后的第一份“身份证明”,包含了VID、PID、设备类等核心信息,直接决定了主机如何识别并加载驱动。通过协议分析工具捕获和解码这些底层通信,工程师可以直观验证固件行为、定位枚举失败的根本原因,例如设备无响应、描述符数据错误或驱动匹配失败。本文将以Wireshark结合USBPcap为例,详细演示如何捕获USB控制传输,并

weixin_34342207的博客 469

USB设备路径是什么,是什么格式的?

原始博文链接地址:https://www.silabs.com/community/interface/knowledge-base.entry.html/2013/11/21/windows_usb_devicep-aGxD 现整理翻译如下,但鼓励还是看原文好,因为我的英语也很菜o(╥﹏╥)o What is a Windows USB device path and how is it f...

chunfangzhang的博客 7398

Linux下USB摄像头设备名重复问题:C/C++开发中的udev规则与稳定绑定实践

在Linux系统开发中,设备管理是嵌入式与视觉应用的基础环节。其核心原理在于内核通过sysfs暴露硬件信息,并由udev守护进程动态创建设备节点。这一机制虽提供了灵活性,却常导致USB摄像头等视频设备的/dev/videoX节点名随枚举顺序变化,成为多摄像头系统稳定运行的重大技术障碍。从工程实践角度看,直接硬编码设备路径会引发应用配置失效、双目视觉错乱等问题。通过编写udev规则,开发者可依据设备的物理端口路径、供应商ID等稳定属性,创建持久化的符号链接(如/dev/camera_left),从而将设备与系

weixin_30938149的博客 621

Windows电脑无法识别USB设备怎么办?

  您可能已经注意到,如果您使用USB设备并将其插入计算机,Windows会识别并配置它。然后,如果你拔掉它并将其重新插入另一个USB端口,Windows就会出现一连串的健忘症,并认为这是一个完全不同的设备,而不是使用上次插入时应用的设置,或者你的电脑无法识别它,这是为什么?   USB设备的人解释说,当设备缺少USB序列号时会发生这种情况。   USB设备上的序列号是可选的。如果设备有一...

w3cschools的博客 3万+

[005] ubuntu下绑定USB设备的串口名称(KERNELS硬件端口号绑定)

1、为什么要绑定USB设备的串口名称? 用ubuntu系统来做硬件控制的时候,常使用USB串口与传感器或者驱动器进行信息通信。ubuntu系统在开机的时候会为每一个插入的USB设备自动升序命名,如ttyUSB0、ttyUSB1......(有些也会命名为ttyACM0、ttyACM1......),而程序运行时也就直接和这些设备名进行读写操作。 但是这里存在一个问题,每次开机后,USB设备名都...

yhxxhy978的博客 3668

FastAPI + LLM 实战:5分钟搞定本地模型API服务部署(含避坑指南)

本文详细介绍了如何使用FastAPI和LLM(大语言模型)快速部署本地API服务,涵盖环境准备、模型集成、性能优化及避坑指南。通过实战示例,帮助开发者在5分钟内完成从零到生产的部署过程,提升AI应用开发效率。

weixin_29062963的博客 104

ubuntu下绑定USB设备的串口名称(KERNELS硬件端口号绑定)

1、为什么要绑定USB设备的串口名称? 用ubuntu系统来做硬件控制的时候,常使用USB串口与传感器或者驱动器进行信息通信。ubuntu系统在开机的时候会为每一个插入的USB设备自动升序命名,如ttyUSB0、ttyUSB1......(有些也会命名为ttyACM0、ttyACM1......),而程序运行时也就直接和这些设备名进行读写操作。 但是这里存在一个问题,每次开机后,USB设备名都有可能发生窜动,比如上一次开机这个设备被命名为ttyUSB0,这次开机却被命名为ttyUSB3,因此不得不回到程..

https://shixuebin.gitee.io/hexo-blog/ 8935

手写Socket Web服务器:深入HTTP协议底层原理

HTTP协议是Web通信的基石,其本质是一套严格定义的文本格式与状态交互规范。理解它需回归传输层——TCP连接建立、请求响应格式(如状态行、头/体分隔符\r\n\r\n)、字符编码与字节长度一致性等核心原理。这些知识直接决定CORS拦截、中文乱码、Content-Length错误等高频问题的排查效率。在现代框架封装日益厚重的今天,亲手用Socket实现一个可被Chrome识别的极简Web服务器,成为掌握Web运行机制最有效的实践路径。本文即以DebugLZQ经典案例为蓝本,还原从URI解析、DNS查询、So

weixin_40192258的博客 534

usb常用描述符以及一些数据包

USB1.1协议定义的标准描述符有设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。USB2.0相比于USB1.1新增加的两个描述符:限定符描述符(Qualifier Des

感觉身体被掏空 3529

Windows系统离线搭建PyTorch深度学习环境全攻略(CUDA+cudnn实战)

本文提供了一份在Windows系统下离线搭建PyTorch深度学习环境的完整实战指南。文章详细讲解了如何在没有网络连接的情况下,正确安装和配置CUDA、cudnn以及PyTorch,并构建独立的Python虚拟环境。重点强调了版本依赖关系的重要性,并提供了从驱动准备到环境验证的每一步操作,旨在帮助用户高效、稳定地部署可复用的GPU深度学习开发环境。

table的专栏 579

YOLOv11 改进 - 特征融合 | RepGFPN重参数化特征金字塔网络 ,实现高效多尺度特征交互与融合

本文介绍了DAMO - YOLO目标检测方法及其相关技术在YOLOv11中的结合。DAMO - YOLO扩展了多项新技术,如MAE - NAS搜索检测主干网络、Efficient - RepGFPN构建检测neck等。在neck设计上,针对原始GFPN存在的问题,提出Efficient - RepGFPN,包括对不同尺度特征使用不同通道数、删除Queen - Fusion中额外上采样操作、改进特征融合方式等。我们将相关模块集成进YOLOv11,替换部分模块。

魔改工程师的博客 936
上一篇: 当有多个设备online时,命令行窗口通过adb连接指定设备方法
下一篇: linux shell实现随机数多种方法(date,random,uuid)
asmxpl
博客等级 码龄15年 9粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值