ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

USB设备描述符请求失败?代码43报错排查从原理到实战全解析

USB设备描述符请求失败?代码43报错排查从原理到实战全解析 插上一个U盘或者调试板结果系统托盘弹出来“未知USB设备设备描述符请求失败”打开设备管理器黄色感叹号下面写着“Windows 已停止此设备因为其已报告问题。 (代码 43)”。这个画面搞硬件和搞软件的朋友应该都见过而且大概率不止一次。这个报错在USB生态里属于最经典也最折磨人的疑难杂症U盘、移动硬盘、USB转串口板、无线网卡、打印机、下载器都可能中招。麻烦的地方在于它不像“驱动没装”那么直白而是设备在系统层面连“身份信息”都没交上来导致Windows根本不知道该拿它怎么办。我早期遇到这个错误也踩过不少坑甚至重装过系统结果该报错还是报错。后来把USB枚举协议、供电、线材、驱动这些环节挨个摸了一遍才算理清排查思路。这篇文章我就按“从易到难、从软件到硬件、最后上协议抓包”的顺序把这个错误彻底讲透。普通用户跟前三步走大概率能解决一大半问题搞嵌入式开发的同行可以直接跳到后面的抓包和硬件排查部分这部分才是真正值钱的内容。1. 先搞懂这个报错到底是怎么产生的1.1 USB设备是怎么“自我介绍”的枚举流程很多朋友一看到“设备描述符请求失败”就懵了这词太专业了。我用大白话解释一下USB设备插上电脑之后不是立刻就能用的它要经历一个“面试”过程这个面试在USB协议里叫枚举。面试流程是这样的设备插上后主机先通过D/D-线上拉变化感知到有设备接入然后对总线复位接着向地址0的设备发送一个“请出示你的身份证”的请求也就是GET_DESCRIPTOR(Device)请求。设备收到这个请求后必须返回一个18字节的数据包这就是设备描述符里面包含USB版本号、厂商IDVID、产品IDPID、设备类型、最大包长度这些关键信息。主机拿到之后再给设备分配一个唯一的地址重新读取设备描述符和配置描述符最后加载对应驱动、激活配置设备才算正式上岗。“设备描述符请求失败”这个提示字面意思就是卡在了第一个环节主机向设备要“身份证”设备要么没回应要么回了一堆乱码主机核对不上只能把设备标记成“未知USB设备”。所以这个错误严格来说不是“驱动问题”而是“驱动不知道该装什么”的问题——因为你连VID/PID都没报上来系统拿什么去找驱动USB枚举过程本身很值得花时间研究尤其是做嵌入式或者USB外设开发的朋友。我推荐《圈圈教你玩USB》这本书老书了但枚举讲得非常细比直接啃USB 2.0规范舒服得多。想深入的话USB协议里关于标准设备请求、描述符结构、端点0通信这几章至少读两遍。1.2 为什么偏偏报“代码43”而不是别的设备管理器里的错误代码其实是一套“暗号”不同代码对应不同类型的问题。代码43属于“设备报告了问题Windows已停止该设备”的范畴常见于枚举失败、固件异常、供电不稳定这些情况。它和代码28未安装驱动、代码10设备无法启动不是一回事——代码28通常意味着设备枚举成功了系统识别到了VID/PID但找不到匹配的驱动而代码43往往连枚举这一步都没走完。我遇到过不少朋友拿着代码43问我“该装哪个驱动”这就是把方向搞反了。如果一个设备报的是代码43并且显示“设备描述符请求失败”先别急着找驱动优先怀疑三件事供电够不够、线材好不好、设备端固件/硬件有没有正常工作。驱动反而是后面才要考虑的环节。当然代码43也可能出现在“枚举成功但驱动加载失败”的情况下比如设备返回了描述符但驱动在初始化时出错Windows同样可能报代码43。所以也不能一棒子打死说代码43就完全是硬件问题得结合具体现象判断。下面几章我会把排查路径一步步铺开。2. 第一轮自救系统侧的排查与设置2.1 先交叉验证换口、换线、换电脑接到这类报错我的第一反应永远是先做交叉验证这是成本最低、信息量最大的一步。把设备拔下来换一个USB口插最好从机箱前置面板换到后置主板接口——前置面板的USB口经常因为接线不规范导致供电不足和信号干扰问题率远高于后置接口。如果换口好了那就是原来那个接口或前置面板排线有问题。换口没用就换线。这里必须强调一句USB线不是“能通电就行”。我见过太多人拿一根充电线去接移动硬盘或者调试板结果设备灯亮了、系统就是不识别因为充电线里压根没有D/D-数据线只有电源和地。判断方法很简单线坏了或者只有充电线的话换一根确定能传数据的线再试。最后是换电脑。如果设备在别的电脑上也报同样的错那基本可以锁定设备本身有问题如果别的电脑上正常那问题出在你原来那台主机的USB控制器、供电或者系统环境上。这一步能帮你把排查范围缩小一大半别嫌麻烦这几分钟换来的信息量比瞎猜半天强太多了。2.2 设备管理器里的“三板斧”卸载、扫描、重启很多人看到“未知USB设备”第一个念头是右键点它然后点“更新驱动程序”这个方法在代码43面前基本没用因为系统连设备身份都没拿到更新的意义不大。正确的操作是右键设备选“卸载设备”如果弹窗里有“删除此设备的驱动程序软件”选项先别急着勾——除非你手头已经准备好了正确的驱动否则卸载完再想装回来可能更麻烦。卸载之后点击菜单栏的“操作”→“扫描检测硬件改动”让系统重新枚举一次。如果这一套下来还是原样报错别犹豫直接重启电脑。注意这不是玄学Windows的USB驱动栈是有状态缓存的设备枚举失败后控制器的状态可能一直停留在异常模式重启能把这个状态清干净。我甚至遇到过设备管理器里怎么扫描都认不出来的情况重启之后插上就正常了。所以“卸载设备→扫描硬件改动→重启”这三板斧顺序别乱收益很高。2.3 关掉快速启动和USB选择性暂停Windows这两项电源管理功能是USB设备“莫名其妙失灵”的头号帮凶。先说快速启动。Win10/Win11默认开启快速启动它的原理是关机时把内核会话和驱动状态写入磁盘开机时快速恢复。听上去很美妙但问题在于有些USB控制器/驱动的状态恢复得并不干净设备枚举就会出错。解决办法控制面板→电源选项→选择电源按钮的功能→更改当前不可用的设置然后取消勾选“启用快速启动”。这一步对笔记本尤其重要改完再开机试试设备。再说USB选择性暂停。这个功能允许系统在USB设备空闲时切断它的供电美其名曰省电但实际上很多设备“醒来”的时候状态已经乱了尤其是USB转串口、USB网卡这类设备恢复不过来就会出现枚举异常。关闭路径电源选项→更改计划设置→更改高级电源设置→USB设置→USB选择性暂停设置设为“已禁用”。我个人的习惯是只要电脑上经常插USB外设就直接把这个功能关掉省那点电还不够折腾的。2.4 安全模式与干净启动大法如果系统设置都调过了设备还是认不出来那就得考虑是不是第三方软件捣乱。最容易惹事的几类杀毒软件、虚拟机软件VMware/VirtualBox自带的USB服务、USB过滤驱动、各种外设厂商的所谓“管理助手”。判断方法很简单——进安全模式或者做一次干净启动再插设备。安全模式下Windows只加载最基本的驱动和服务如果设备在安全模式下能正常识别那基本可以断定是某个第三方驱动或服务和它冲突了。做干净启动的方法是WinR输入msconfig在“服务”选项卡里勾选“隐藏所有Microsoft服务”然后点“全部禁用”再在“启动”选项卡里点击“打开任务管理器”把所有启动项都禁用重启电脑。如果这样设备正常了再一个个启用服务定位元凶。做嵌入式开发的朋友还要留意虚拟机。很多人用VMware跑Kali或者Ubuntu插USB网卡或者调试器的时候宿主机能识别但虚拟机里lsusb看不到设备。这时候先排查宿主机的设备管理器如果宿主机里都是“未知USB设备设备描述符请求失败”那就别怪虚拟机——你宿主机的设备压根没枚举成功虚拟机当然直通不了。VMware里还要确认VMware USB Arbitration Service服务正在运行这个服务停了的话菜单栏的“虚拟机→可移动设备”里什么都看不到。3. 驱动的问题识别芯片、找对驱动、避开版本坑3.1 别急着重装系统先确认“该装什么驱动”我见过太多人在网上发帖问“未知USB设备怎么办”底下好多人一上来就说“重装系统”看得我血压都上来了。重装系统大概率是白费功夫——如果问题出在供电或线材上你重装十遍系统设备也还是报代码43。建议大家在折腾重装之前先花两分钟看一眼设备管理器里的硬件ID右键设备→属性→详细信息→硬件ID你会看到类似“USB\VID_0403PID_6001”这样的字符串。VID是厂商IDPID是产品ID这两个值就是USB设备的“身份证号”。比如VID_0403对应FTDIVID_10C4对应Silicon LabsCP210x系列VID_1A86对应WCHCH340/CH341VID_0CF3对应Qualcomm/Atheros。拿到VID/PID之后去搜索引擎一查基本就知道该装什么驱动了。这一步是排查驱动问题的万能钥匙比任何驱动工具都靠谱。需要强调一点如果设备管理器的硬件ID显示“USB\UNKNOWN”或者根本没有VID/PID那说明设备还没枚举成功这时候装驱动没用得回到上一章做硬件和系统排查。只有当硬件ID能正确显示VID/PID设备却还是有个感叹号的时候才需要进入下面的驱动安装环节。3.2 USB转串口芯片FT232、FT231X、CP2102、CH340、PL2303的驱动选择热搜词里出现了一大堆USB转串口相关的词比如“ft231x usb uart驱动”“ft232r usb uart驱动安装”“cp2102n usb to uart bridge驱动下载”“ztek力特usb转232驱动”。这确实是最容易踩坑的品类我一个个说。如果是FTDI家的芯片FT232R、FT231X、FT2232等驱动去FTDI官网下载VCPVirtual COM Port驱动就是那个“FTDI VCP Driver”64位系统记得下64位版本。FTDI的芯片质量好但市面上假货极多尤其是那种几块钱包邮的绿色小板子很多是打磨片或者假冒片。这里提醒一句FTDI早年的驱动对非授权芯片做过“PID归零”处理假冒片装上正版驱动之后会被改掉产品ID从此只能识别为未知设备——所以买USB转串口板子尽量选正规渠道。Silicon Labs的CP2102、CP2104、CP2102N用官方驱动“CP210x Universal Windows Driver”从Silicon Labs官网下载。旧版系统可能需要装单独的VCP驱动新版Windows一般联网就能自动装好。顺便说一下CP2102N和老版CP2102的硬件ID不一样但驱动是通用的不用纠结。CH340/CH341是国内用得极广的芯片驱动去WCH官网下载“CH341SER.EXE”。Win10新版本系统有时候会自动装好驱动但如果设备还是报错用官方驱动手动更新一次选“从计算机设备驱动程序列表中选取”然后指向CH341SER解压出来的目录。最坑的是Prolific的PL2303。这个芯片老版本PL2303HXA在Win10/Win11下基本没法用新版官方驱动明确不支持老芯片强行装会提示“设备无法启动”。而新版本芯片PL2303HDA/RA/GC/TA必须用新版驱动老驱动反而不认。所以遇到PL2303先看芯片丝印如果是HXA结尾的老芯片别折腾驱动了直接换一块CP2102或者CH340的板子更省心。至于“Z-TEK力特USB转232”这类品牌成品驱动其实就在它内部那颗芯片上——把外壳拆开看主控丝印或者插上后用硬件ID查芯片型号然后按对应芯片装驱动。品牌不影响驱动选择芯片型号才是关键。3.3 从USB网卡、蓝牙、手机共享到老下载器都是同一个套路USB转串口是重灾区但不是唯一灾区。红米USB网卡认不到大概率是Realtek芯片去官网下对应网卡型号的驱动老版本驱动在Win10/11下可能需要用兼容模式安装。ar5b22这种Atheros/Qualcomm蓝牙模块硬件ID通常长这样“USB\VID_0CF3PID_E003”直接拿VID/PID去搜驱动或者下载大厂笔记本官方的蓝牙驱动包。苹果手机USB网络共享在Windows上识别不了常见原因有两个一是数据线只支持充电二是缺Apple Mobile Device USB Driver。前者换线后者安装iTunes或者单独装苹果设备驱动。HP USB网络打印适配器hp usb network print adapter认不到优先去HP官网下载固件和驱动工具这个设备比较特殊它本身是个打印服务器配置工具很重要。老下载器也是重灾区。Xilinx Platform Cable USB在Win10下经常提示“无法加载这个硬件的设备驱动”因为它的驱动是ISE时代的东西没数字签名。解决办法是去Xilinx官网下对应版本的驱动然后在设备管理器里手动更新驱动路径指向ISE安装目录里的drivers文件夹如果还不行就需要临时禁用Windows强制驱动签名高级启动→启动设置→禁用驱动程序强制签名装完驱动再恢复。这个办法对很多老USB设备都通用。3.4 驱动安装的冷知识和避坑清单最后把驱动相关的经验列成几条驱动版本不是越新越好。有些老硬件用了新驱动反而出问题。如果更新驱动后设备从正常变异常第一时间在设备管理器里点“驱动程序→回退驱动程序”。装驱动优先去官网驱动精灵/驱动人生这类工具偶尔能救急但经常给你装错版本或者植入全家桶我反正不推荐。卸载驱动要卸干净。有些芯片厂商自己做卸载工具比如FTDI就有FTDI Uninstaller比直接在设备管理器里卸载靠谱。卸完再装新驱动能避开一堆奇怪冲突。64位系统必须用64位驱动32位驱动在64位系统上大概率装不上或者加载时报错。Windows的“Windows Update可选更新”有时候会自动推送USB设备驱动如果你装的驱动和推送的版本冲突去“设置→Windows更新→高级选项→可选更新”里看看有没有待安装的驱动更新。4. 硬件与设计层面的排查供电、线材、信号和EMC4.1 供电不足是最常见的“真凶”交叉验证之后如果设备在多个电脑上都不识别那大概率是硬件层面问题排第一的就是供电。USB 2.0接口标准供电是5V/500mAUSB 3.0是5V/900mA看起来不少但实际传输线上有压降接触电阻、劣质线材都会让电压掉得更厉害。如果设备需要的电流比较大比如移动硬盘、USB无线网卡供电不足时最常见的表现就是设备灯亮但枚举总失败或者偶尔成功偶尔失败。排查方法很简单优先接带外部供电的USB HUB或者直接用可调电源给设备单独供5V电注意共地看能不能正常枚举。如果是自己开发的设备直接用万用表量板上VBUS对地电压如果低于4.5V就要提高供电能力。我修过不少“USB设备描述符请求失败”的移动硬盘盒换了根粗短线或者插后置USB口就好这就是典型的供电/线阻问题。4.2 线缆、连接器、差分信号质量USB是靠D/D-两根差分线传数据的这两根线的信号质量直接影响枚举成功率。差分信号对线缆的阻抗一致性有要求USB 2.0要求90Ω差分阻抗劣质线材的阻抗根本没法保证短线还好一旦长了就出问题。USB线缆规范建议最长不超过5米实际工程中3米以上就建议用带供电的延长线或者HUB了。所以如果你用了一根特别长的USB线换根短线试试经常有奇效。连接器接触不良也是重灾区。有些设备接口用久了松动设备微微晃动一下就断连重枚举反复几次就报“设备描述符请求失败”。一个很实用的排查动作插上设备后轻轻晃动插头看设备管理器里设备是不是一会儿消失一会儿出现。如果是果断换线或者换一个插得紧的USB口。另外USB 3.0的Type-A口有9个引脚USB 2.0的D/D-触点在前面SuperSpeed收发器触点在后面如果USB 3.0线缆的SuperSpeed信号接触不良设备会退化为USB 2.0连接但不至于“描述符请求失败”真正导致描述符失败的主要还是D/D-本身不通或者信噪比太差。4.3 自制设备/开发板上拉电阻、时钟、PCB设计做嵌入式开发的朋友如果自己画板子做了USB设备比如基于STM32、AT32、Zynq的USB应用报“设备描述符请求失败”优先检查这几个地方D/D-上拉电阻。USB全速/高速设备需要D上拉1.5kΩ至3.3V低速设备是D-上拉。这个上拉是主机识别设备是否接入的关键信号没有上拉或者上拉电压不对主机根本不知道有设备插入更别提枚举了。很多MCU内部有USB上拉但STM32这种通常需要程序里开启DP上拉或者外部接电阻别焊了个板子不加外部上拉还以为能直接用。时钟。USB模块需要48MHz时钟全速模式下对时钟精度有要求。如果你的MCU用外部晶振晶振没起振或者频率不对USB模块工作就不正常表现为设备偶尔枚举成功偶尔失败或者完全枚举失败。用示波器量晶振引脚确认起振或者直接检查固件里PLL配置。D/D-接反。这个低级错误我见过不止一次尤其在转接板或者自己画封装的时候。USB插座引脚顺序搞反D和D-一换设备铁定枚举失败。量一下主板到USB插座之间的连通性确认线序。另外提醒一下MCU如果没有USB差分信号引脚怎么办这个问题说起来有点残酷——如果你的芯片本身不带USB PHY比如选型失误选了个没有USB外设的MCU那就只能外接方案了。主流做法是外接USB转UART桥接芯片CH340、CP2102、FT232等把串口信号转成USB或者如果你的MCU有ULPI接口可以外置USB3300这类PHY芯片补上USB功能。但如果你只想简单做调试通信老老实实用USB转串口是最省事的。4.4 EFT/ESD导致USB掉线的整改思路做产品认证或者工业现场的朋友可能会遇到EFT电快速瞬变脉冲群测试时USB口掉线重启后恢复不了的情况。这类问题本质是干扰串进了USB链路破坏了枚举或通信状态。整改思路我从实操经验里总结几条信号线加共模电感。USB D/D-上串共模电感比如ACM2012系列可以有效抑制共模干扰但注意选型要适配USB信号速率别把信号本身也滤没了。VBUS上串磁珠。电源线上的高频干扰用磁珠能吸收一部分。TVS/ESD保护管必须靠近接口。用低电容TVS阵列比如USBLC6-2如果选型不当电容太大寄生电容会破坏差分信号质量同样导致枚举失败。接口地做干净。USB接口的金属外壳接地推荐通过一个磁珠或者直接与系统地连接别让机壳噪声灌进信号地。线缆用屏蔽线屏蔽层单端接地。如果干扰特别恶劣这一步几乎是必须的。5. 进阶USB抓包从协议层找到底谁在撒谎5.1 软抓包工具怎么用Windows Linux如果系统设置、驱动、硬件都查过了问题还在那就得上专业手段了——USB抓包。设备管理器只能告诉你“失败了”抓包能告诉你“到底哪一步失败了”这是两个完全不同的信息层级。Windows下最容易上手的组合是Wireshark加上USBPcap。USBPcap是免费开源的USB抓包驱动装完之后用管理员权限打开Wireshark选择一个USBPcap接口开始抓包然后插拔一次故障设备就能看到完整的枚举过程。它的局限在于对USB 3.0 SuperSpeed支持不好很多情况下只能抓到USB 2.0部分但对排查“设备描述符请求失败”这种发生在枚举早期的问题基本够用了。更直观的工具是USBlyzer和Bus Hound。USBlyzer有试用版图形化界面直接显示URBUSB请求块和描述符数据哪个请求失败一眼就能看到。Bus Hound是老牌工具免费版能记录URB层面的通信信息密度很大需要一点协议基础才能快速读懂。Linux下更简单插入设备后直接dmesg看内核日志。最典型的几个错误码error -110表示设备无响应超时error -71表示协议错误EPROTO设备回了不完整或者无法解析的数据error -62表示对方没反应。看到这几个数字再配合lsusb -v和usbmon抓包定位问题就很容易了。usbmon的用法是sudo modprobe usbmon然后在Wireshark里选usbmonX接口抓包。5.2 三种典型的“设备描述符请求失败”抓包结果根据我抓过的包这类问题在协议层基本只有三种表现第一主机发出GET_DESCRIPTOR请求设备完全没有响应反复重试后超时。这种情况的根源几乎都在设备侧固件没跑起来、时钟没起振、VCC没供上、USB中断没配置好或者设备压根没检测到总线复位。开发板上电后先确认主控在运行串口打印正常再查USB时钟和上拉。第二设备响应了但返回的数据不合法。比如只回了2个字节就断掉或者设备描述符里的字段值明显错误主机校验不过。这种情况要么是D/D-信号质量太差线材、接触、干扰要么是固件里的描述符数组写错了要么是PHY配置有问题。用抓包数据里的原始字节反推很快就能定位到具体是哪个字段坏了。第三第一次GET_DESCRIPTOR成功了地址也分配成功了但在后续重新读取设备描述符或者读配置描述符时设备又失联了然后主机整个重置重来。这种情况常见于设备固件的状态机处理有bug——Set Address之后没有正确切换地址或者USB中断处理不及时丢了事务。我在Zynq裸机USB通信方案里就遇过类似问题后来在固件里加了USB复位回调在Set Address之后重新初始化端点状态才解决。5.3 我这几年排查这个错误形成的顺序最后分享一套我个人一直在用的排查顺序照着走基本不会走偏第一步永远是交叉验证换电脑、换线、换口五分钟内缩小问题范围。第二步量供电VBUS电压低于4.5V直接换供电方案。第三步看设备管理器里的硬件ID如果有VID/PID就去装驱动如果没有就继续往下查。第四步上dmesg或者USB抓包工具看是超时还是协议错误。第五步才轮到重装驱动、刷固件、改硬件设计。说实话这么多年下来我发现“未知USB设备设备描述符请求失败”这个错误九成以上不是驱动问题而是供电、线材、接触不良和设备端固件/硬件的问题。一上来就重装系统、下载各种驱动工具是性价比最低的做法。先花几分钟做交叉验证再用抓包工具确定具体卡在枚举的哪一步你就能像老手一样三两下把这个折磨人的错误揪出来。排查完一轮你会发现USB技术并不神秘它就是一套有规矩的“你来我往”协议只要掌握了协议节奏所有报错都有迹可循。
返回列表