USB设备未识别时,应先用dmesg查看内核日志定位问题,再结合lsusb确认枚举状态,检查usbserial等驱动模块是否加载,并通过udev规则配置用户权限,四步缺一不可。

usb设备没被识别?先看 dmesg 实时日志
插上 USB 设备后没反应,不是设备坏了,大概率是内核没正确加载驱动或识别失败。dmesg 是最直接的线索来源,它记录了内核启动和热插拔事件的原始输出。
执行:
dmesg | tail -20,然后立即插拔设备,观察最后几行有没有
usb 1-1:、New USB device、device descriptor read/64, error -71 这类信息。错误码 -71 通常表示供电不足或接触不良;device not accepting address 多见于劣质集线器或 USB 3.0 口兼容问题。
- 别只看
lsusb输出——它只显示“已被枚举成功”的设备,而dmesg能看到卡在哪一步 - 如果日志里有
usbcore: registered new interface driver,说明驱动已加载;若只有usb 1-1: configuration #1 chosen from 1 choice但无后续,可能是设备固件未响应 - 某些 Type-C 或雷电设备需要
lspci配合查看(比如lspci | grep -i usb),因为它们走的是 PCIe 总线
列出所有已识别 USB 设备:用 lsusb 而不是 lshw
lsusb 是专为 USB 总线设计的工具,轻量、实时、层级清晰;lshw 虽全面但常缓存旧状态,且默认不展开 USB 子树。
基础用法:
lsusb显示简略列表;加
-t 查看拓扑结构:lsusb -t;加
-v 看详细描述(慎用,输出极长);加 -d 过滤指定厂商/产品 ID:lsusb -d 046d:0825(罗技摄像头)。
-
lsusb -s 1:2可查看某设备的详细信息,其中1:2来自lsusb第一列,不是设备文件名 - 注意区分
ID 046d:0825中的前四位是厂商 ID(046d),后四位是产品 ID(0825),查不到时去 devicehunt.com 反查 -
lsusb不显示 /dev/ttyUSB* 这类串口设备的映射关系——那是dmesg或udevadm info --name=/dev/ttyUSB0的职责
/dev/ttyUSB* 设备没出现?检查 usbserial 和 ftdi_sio 模块
很多 USB 转串口设备(如 CH340、CP2102、FTDI)需要对应内核模块才能生成 /dev/ttyUSB* 节点。模块没加载,lsusb 能看见设备,但系统里找不到串口文件。
先确认设备是否被识别为串口类:
lsusb -v -d VID:PID 2>/dev/null | grep -i "bInterfaceClass.*02"(
02 表示 CDC ACM 或通信类)。再查模块状态:lsmod | grep -E "(usbserial|ftdi|ch341|cp210x)"。
- 手动加载:
sudo modprobe usbserial+sudo modprobe ftdi_sio(FTDI)、sudo modprobe ch341(CH340)、sudo modprobe cp210x(CP2102) - 永久启用:把模块名写入
/etc/modules,一行一个,避免重启后失效 - 某些新内核(如 6.1+)默认禁用
ch341,需在 GRUB 启动参数加usbcore.autosuspend=-1并重装模块
权限不够导致无法访问?别直接加 sudo,配 udev 规则
普通用户读写 /dev/ttyUSB0 报 Permission denied,本质是设备节点属主为 root:dialout,而当前用户不在 dialout 组。硬加 sudo 有安全风险,且不解决根本问题。
标准做法是将用户加入 dialout 组:
sudo usermod -a -G dialout $USER,然后重新登录。若设备仍不可见(比如某些 CH340 在 Ubuntu 22.04 上),需写 udev 规则:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666", GROUP="dialout"保存为 /etc/udev/rules.d/99-ch340.rules,再运行 sudo udevadm control --reload-rules && sudo udevadm trigger。
- 规则中
idVendor和idProduct必须小写,且来自lsusb -v或udevadm info --name=/dev/ttyUSB0 | grep -E "(idVendor|idProduct)" - 不要用
OWNER="username"—— udev 不支持动态用户名,只认组名或固定 uid - 测试规则是否生效:拔插设备后,
ls -l /dev/ttyUSB*应显示crw-rw---- 1 root dialout
设备枚举、驱动加载、节点生成、用户权限,这四步缺一不可。漏掉任何一环,lsusb 看得见,程序却打不开。尤其注意 dmesg 输出里的错误码和 udevadm info 返回的实际属性值——它们比文档更真实。










