你把自己刚买的开发板用USB线插到Ubuntu电脑上,兴冲冲地敲下ls /dev/ttyUSB*,结果终端冷冰冰地给你返回一句No such file or directory。别急,这不是你的板子坏了,也不是Ubuntu跟你有仇,这几乎是每个玩嵌入式的Linux新人都会撞上的一堵墙。
这篇文章我就从底层逻辑讲起,梳理一遍设备文件是怎么来的、为什么没出现、以及从驱动到权限再到虚拟机串口直通的完整排查流程。你不光能解决“找不到设备”的问题,还能顺手搞懂CH340、FTDI、ttyACM0这些名词到底是怎么一回事。
1. 先搞清楚:串口设备文件在Linux里到底是个什么存在
很多刚接触Linux+开发板的朋友,对串口的认知停留在Windows的“COM3”或者“COM4”上。Windows帮你把底层的差异全隐藏了,但Linux不是这个玩法,它把一切都抽象成了文件。
1.1 设备文件不是凭空存在的,是内核“上报”的
在Linux的世界里,一切皆文件,串口也不例外。当你的USB转串口芯片(比如板子上自带的CH340、CP2102、FT232)被USB控制器识别后,内核里的USB驱动程序会接手,然后向系统注册一个“串口终端设备”。这个设备会被映射到/dev/目录下,文件名一般是:
/dev/ttyUSB0:最常见,CH340、CP210x、FT232等USB转串口芯片通常都是这个名字。/dev/ttyACM0:抽象控制模型,常见于STM32的板载ST-Link虚拟串口、ESP32的USB-CDC虚拟串口、Arduino Uno等。/dev/ttyS0(或ttyS1、ttyS2等):这通常是主板上自带的原生串口(也就是老式电脑的DB9串口),跟你的USB转串口设备基本没啥关系。
但这里面的关键点是:设备文件是由内核驱动动态创建的。如果内核里压根没有对应的驱动模块,或者驱动没被正确加载,那设备文件就不会出现,ls /dev/ttyUSB*自然什么都查不到。所以排查的第一步,不是去改什么配置文件,而是先确认内核有没有识别到这个设备。
1.2 使用dmesg查看内核日志,眼见为实
把开发板通过USB线连接到Ubuntu主机后,第一件事不是打开串口助手,而是打开终端,输入:
dmesg | tail -n 30这条命令会显示最近30条内核环形缓冲区日志。如果设备被USB控制器发现了,你通常会看到类似下面的输出:
usb 1-2: new full-speed USB device number 5 using xhci_hcd usb 1-2: New USB device found, idVendor=1a86, idProduct=7523 usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-2: Product: USB Serial usb 1-2: Manufacturer: QinHeng Electronics usb 1-2: SerialNumber: 00 01 00 00 ch341 1-2:1.0: ch341-uart converter detected usb 1-2: ch341-uart converter now attached to ttyUSB0看到最后一行now attached to ttyUSB0,说明你的CH340芯片已经被完美识别,设备节点也创建好了。但如果你执行ls /dev/ttyUSB0还是没反应,那就是另一个问题——你这会儿用的是哪个用户?有没有权限?这个我们后面详细讲。
如果输出的日志里连New USB device found都没有,那问题出在物理链路或者USB控制器层面,压根没到驱动那一步。
2. 设备没出现?先按这套思路排查物理链路和系统识别
很多“找不到设备”的情况,其实跟软件配置半毛钱关系没有,纯粹是硬件链路某一环出了问题。我把排查思路按优先级整理了一下。
2.1 确认开发板有没有“上电启动”
这一步看似废话,但真的最容易踩坑。很多开发板(尤其是全志T113、瑞芯微RK系列这类Linux开发板)的USB转串口芯片是由目标板供电的,如果你的开发板没有独立电源、或者电源开关没打开、或者供电电流不够,那USB转串口芯片就不会工作,电脑自然识别不到。
我曾经调试一块全志T113开发板,用一根USB线同时供电和传数据,结果插上电脑后怎么都识别不到。后来发现是因为开发板外接了太多外设,USB口供电电流不够,导致板子一直处于反复重启的状态。换了一根带辅助供电的USB线、或者插座供电,问题立刻消失。
实操检查顺序:
- 开发板的电源指示灯亮不亮?如果闪烁或者不亮,优先解决供电。
- 换一根质量好的USB数据线,不要用那种只能充电不能传数据的线。
- 直接插主机背面的USB接口,不要经过USB Hub,尤其是那种不带供电的Hub。
2.2 确认设备是否被USB层识别,用lsusb一探究竟
如果供电正常,但还是没有设备文件,那就用lsusb看看USB总线上到底挂了什么东西:
lsusb输出类似这样:
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter看到1a86:7523就是CH340芯片,1a86:7523是它的厂商ID和产品ID。如果你能看到这个,说明USB物理链路是通的,至少USB控制器级别的枚举已经成功了。但如果看到的是Bus 001 Device 001: ID 1d6b:0002这种结尾是root hub的信息,那就意味着USB总线上根本没挂任何设备,问题大概率在物理连接。
以下是常见USB转串口芯片的ID对照表,方便你快速确认:
| 芯片型号 | 厂商ID | 产品ID | 常见品牌/场景 |
|---|---|---|---|
| CH340/CH341 | 1a86 | 7523 | 国产低成本板子,ESP32、51开发板 |
| CP2102/CP210x | 10c4 | ea60 | 很多ESP32开发板、GPS模块 |
| FT232/FTDI | 0403 | 6001 | 高可靠USB转串口,工业场景 |
| CH9102 | 1a86 | 55d4 | 新款替代CH340的方案 |
| ATmega16U2 | 2341 | 0043 | Arduino Uno板载串口 |
2.3 设备树(Device Tree)也可能影响板载串口的识别
这里要先区分两种完全不同的“串口连接”场景:
- 场景A:开发板上有一颗独立的USB转串口芯片(比如CH340),用USB线连到电脑。这种情况跟开发板里的系统没关系,是Ubuntu直接跟这颗芯片通信。
- 场景B:你在开发板上跑了一个Linux系统(比如T113、树莓派),想把板子上的UART口通过背板排针引出来,连一个USB转串口模块再接电脑。这种场景下,板子系统里的设备树文件(.dts)需要正确配置UART节点,否则对应的
/dev/ttyS*根本不会出现。
网上有一堆“Xilinx SDK如何生成设备树文件”“设备树文件怎么改”的热搜词,说明很多人都在折腾场景B。如果你确实是在给开发板编译Linux内核,需要检查设备树里UART节点的状态:
&uart3 { pinctrl-names = "default"; pinctrl-0 = <&uart3_pins>; status = "okay"; };如果status被写成"disabled",那这个串口在Linux里就不会注册,你在开发板上跑ls /dev/ttyS*自然看不到。这一点是很典型的“找错方向”问题——你以为Ubuntu识别不到,其实是开发板那边压根就没开放这个串口。
3. 系统有识别但没设备文件:驱动模块与udev规则的暗坑
如果你执行dmesg已经能看到ch341-uart converter now attached to ttyUSB0,但ls /dev/ttyUSB0还是报错,那问题十有八九出在驱动模块没加载或udev规则上。
3.1 检查内核驱动模块是否已加载
USB转串口芯片的内核驱动通常以模块(.ko)的形式存在。以CH340为例,它的驱动模块叫ch341。你可以用以下命令检查驱动是否加载:
lsmod | grep ch341如果啥都没输出,说明模块没加载,手工加载一下:
sudo modprobe ch341加载完再执行dmesg | tail -n 10,看有没有attached to ttyUSB0的新日志。
不过说实话,在正常的桌面版Ubuntu里,CH340和CP210x的驱动都是默认编译进内核的,一般不需要手动加载。真正需要手动装驱动的,往往是以下两种特殊情况:
- 编译内核时把驱动编成了模块(M),但没装进initramfs,导致启动时没自动加载。
- 内核版本太新或太旧,驱动接口变了。比如新内核把
ch341的API改掉之后,老驱动就不匹配了。
3.2 内核模块被占用导致无法识别
有一种很隐蔽的情况:同一颗USB转串口芯片被两个驱动同时认领,导致系统不知道该把设备挂给谁。比如CH340在某些内核版本上,usbserial和ch341模块会对设备产生竞争。你可以在dmesg里看到类似这样的报错:
ch341 1-2:1.0: device already has a claim这种时候,解决办法是把有冲突的模块先禁用,只保留一个对的:
sudo rmmod usbserial sudo modprobe usbserial sudo modprobe ch341但这只是暂时的解法,重启后会失效。要根治的话,可以写一个黑名单文件,把不要的模块禁用掉:
echo "blacklist usbserial" | sudo tee /etc/modprobe.d/blacklist-usbserial.conf当然,这个操作要谨慎,别把系统本来就需要的串口驱动给禁了。我建议你先确认清楚到底是哪个模块在冲突,再动黑名单。
3.3 用udevadm手工触发设备节点的生成
如果内核已经识别了设备,但/dev/ttyUSB0没有自动创建,可能是udev没来得及处理(极少见但确实遇到过)。可以用下面这个命令手工触发一次:
sudo udevadm trigger --subsystem-match=tty然后再看看/dev/tty*下有没有新设备。如果还是没有,再看一下/dev/serial/by-id/目录:
ls -l /dev/serial/by-id/如果这个目录里有设备,说明udev是正常的,只是设备节点名不是你以为的那个。
4. 找到了设备文件但打不开?权限问题的经典形态
排除万难之后,你终于看到了/dev/ttyUSB0,结果串口助手或者screen给你弹了一个Permission denied。这几乎是Linux串口调试里最常见的问题,没有之一。
4.1 为什么普通用户默认没权限访问串口
/dev/ttyUSB0的默认权限是crw-rw----,属主是root,属组是dialout。普通用户既不是root,又不在dialout组里,自然打不开。
解决办法很简单,把你的用户加入dialout组:
sudo usermod -a -G dialout $USER然后注销并重新登录(或者重启虚拟机/电脑),组权限才会生效。注意,光执行newgrp dialout在当前终端是有效的,但新开的终端可能还是不行,最稳的是重新登录一次。
4.2 用udev规则自定义设备权限和符号链接
如果你觉得每次都要记ttyUSB0这个名字很麻烦,或者你有多个板子同时插着,ttyUSB0和ttyUSB1换来换去分不清谁是谁,那你应该写一个udev规则。
创建一个文件/etc/udev/rules.d/99-usb-serial.rules,内容如下:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="tty_t113", MODE="0666"这里面有3个关键点:
ATTRS{idVendor}和ATTRS{idProduct}要根据你实际芯片的ID来填,用lsusb查看。SYMLINK+="tty_t113"的意思是给这个设备创建一个固定的符号链接,以后你直接用/dev/tty_t113访问就行了,哪怕是拔插之后ttyUSB0变成ttyUSB1,符号链接依然指向这颗芯片。MODE="0666"是直接给所有用户读写权限,适合开发调试场景。生产环境不建议这么干,安全性不好。
写完后重载规则:
sudo udevadm control --reload-rules sudo udevadm trigger这一招我强烈建议你学会,尤其是你手头有不止一块开发板的时候。它可以彻底解决“设备文件名飘忽不定”的烦恼。
4.3 串口打开失败的其他系统级原因
如果你的用户已经在dialout组里,权限也没问题,但还是打不开串口,那可能的原因还有:
- 串口被别的程序占用了。比如你之前跑了一个
screen /dev/ttyUSB0 115200没关,现在又重新开一个,肯定报“Device or resource busy”。用sudo lsof /dev/ttyUSB0看看谁占用的,然后杀掉那个进程。 - 串口的默认参数不对。有些USB转串口芯片在上电后需要一点时间初始化,你如果刚插入就立刻去打开,有几率失败。等个1-2秒再操作就好。
- 波特率设置错误。这不一定会导致打开失败,但会输出乱码。115200是绝大多数Linux开发板的默认调试波特率,但也有人用1500000这种高速率,你最好先确认一下板子的实际配置。
5. 虚拟机、USB直通与常见系统问题实录
这一节要说的是另一个重灾区——很多人在Windows上用虚拟机(VMware或VirtualBox)跑Ubuntu,然后发现Ubuntu里永远看不到开发板的串口设备。
5.1 虚拟机为什么识别不到USB串口设备
虚拟机的本质是模拟一套硬件,它不会把你主机上插着的USB设备直接“分享”给虚拟机系统,除非你做了USB直通(passthrough)配置。如果你在VMware里装Ubuntu,插上开发板后记得做这几步:
- 在VMware菜单栏选择“虚拟机” -> “可移动设备”。
- 找到你的USB转串口设备(通常显示为“USB Serial”或者类似的名字)。
- 点击“连接(断开与主机连接)”,让这个设备从主机“断开”,并连接到虚拟机。
连完之后,Ubuntu虚拟机里才能通过dmesg看到这个设备,否则主机的/dev/ttyUSB0跟虚拟机半毛钱关系都没有。
如果你用的是VirtualBox,需要在“设备” -> “USB”里勾选对应的设备,或者在虚拟机的设置里提前加一个USB过滤器。
5.2 VMware USB直通后仍不生效的处理办法
有时候你明明在VMware里点了“连接”,设备看起来已经连到虚拟机了,但Ubuntu里还是识别不了。这时候大概率是VMware的USB控制器兼容性问题。
一种常见的解决办法是修改VMware虚拟机设置里的USB兼容性:
- 关闭虚拟机。
- 打开虚拟机设置 -> USB控制器。
- 把“USB兼容性”调到“USB 2.0”或者“USB 3.1”,根据你开发板的USB类型来选。
CH340这种全速USB设备,在USB 3.0控制器下偶尔会有兼容性问题,改成USB 2.0反而更稳定。我遇到过好几回,全速设备在xHCI控制器下枚举失败,切到EHCI(USB 2.0)立马就好。
5.3 主机是Windows,虚拟机里权限对不上
还有一种是主机上装着CH340的驱动,但虚拟机里的Ubuntu又按自己的那套驱动来。如果你在Ubuntu+VMware的环境里,务必在主机上进行物理连接,而不是通过Windows的远程桌面(RDP)去连虚拟机的USB。很多远程桌面工具不支持USB设备重定向,导致你在远端看着一切正常,实际上设备根本没到虚拟机里来。
另外,如果你在Windows主机上打开过某个串口调试助手,把串口占用了,那虚拟机里拿到这个设备后也可能打不开。先在Windows的设备管理器里确认没有别的程序占用这个COM口,再去做USB直通。
5.4 其他容易被忽略的系统异常场景
- Ubuntu 24.04之后的新内核,有时候会把
ttyUSB改成ttyACM,尤其是新款的CH9102芯片。别死磕ttyUSB0,顺手看看/dev/ttyACM*。 - 系统睡眠恢复后,USB设备可能会重新枚举,导致原来的设备节点消失。这种情况下直接重新插拔一次USB线即可。
- 某些USB线缆的屏蔽层太差,在高速数据传输时会导致枚举失败。这种情况属于玄学范畴,但换线真的能解决。
- 如果你用的是串口调试助手(Windows上的那种)配合WSL2,要特别注意,WSL2默认不共享Windows的串口设备。如果你必须在WSL2里访问串口,需要安装usbipd-win,并手动把USB设备共享给WSL2。
这里顺便提一嘴,/dev/ttyUSB0在WSL1里是可以直接访问的,因为WSL1是一个系统调用翻译层,跟Windows共享/dev。但WSL2是真正的轻量级虚拟机,不共享硬件,所以很多教程里的串口玩法在WSL2里全都失效了。
6. 实操总结:最常见的3块开发板连接异常与解决速查
我见过太多人在群里问“为什么我的开发板连不上Ubuntu”,但细节一问三不知。这里我结合自己踩过的坑,整理一份实战速查,按开发板类型区分。
| 开发板类型 | 常见USB转串口方案 | 典型问题 | 快速解决方案 |
|---|---|---|---|
| 全志T113系列 | 板载CH340/CH9102 | dmesg无输出 | 检查板子是否上电、换线、换USB口 |
| ESP32系列 | 板载CP2102/CH340 | 识别为ttyACM0而非ttyUSB0 | 查看/dev/ttyACM*,设备节点名不一样而已 |
| STM32系列 | ST-Link虚拟串口 | 驱动正常但打开失败 | 确认stlink驱动是编译成模块,检查用户组权限 |
| 树莓派Pico | 板载RP2040 USB CDC | 短按BOOTSEL进入下载模式时串口消失 | 这是正常现象,下载模式不枚举串口 |
6.1 一个屡试不爽的排查命令组合
如果你不确定问题在哪一步,我强烈建议你按顺序执行以下几组命令,输出结果贴出来,几乎所有有经验的人都能一眼看出问题:
# 1. 看USB层有没有识别到设备 lsusb # 2. 看内核日志里关于usb/tty/ch341/ftdi的信息 dmesg | grep -E "usb|tty|ch341|ftdi|cp210x" # 3. 看设备节点是否存在 ls -l /dev/ttyUSB* /dev/ttyACM* 2>/dev/null # 4. 看当前用户在不在dialout组 groups # 5. 试试直接以root身份打开串口 sudo screen /dev/ttyUSB0 115200这个组合拳打下来,问题的环节基本就定位到了。如果是硬件链路问题,第1步和第2步就能看出来;如果是驱动问题,第2步会报错;如果是权限问题,第3步和第4步会告诉你;如果全都没问题,第5步就直接进去了。
6.2 串口调试工具的选型建议
Ubuntu下的串口调试工具有不少,我按使用场景推荐几个:
- screen:系统自带,最轻量。
screen /dev/ttyUSB0 115200即可,退出用Ctrl+A然后按K再按y确认。 - minicom:功能比screen强一点,支持保存配置、硬件流控开关等。安装方式
sudo apt install minicom。 - picocom:最现代化的轻量串口工具,支持快捷键退出(
Ctrl+ACtrl+X),设置波特率很简单:picocom -b 115200 /dev/ttyUSB0。 - cutecom / putty:如果你习惯图形界面,可以选这两个。
个人经验是,日常调试串口用picocom最顺手,界面简洁不花哨,退出也方便。用screen虽然不用装东西,但退出方式反直觉,对新手不太友好。
7. 关于驱动选型与常见系统兼容性的进一步扩展
前面主要讲了CH340/CP210x这种常见USB转串口芯片。但开发板领域的串口方案远不止这几种,很多新板子开始用更高端的方案,比如FTDI的FT232H甚至FT2232H,还有国产的CH343、CH9102U等。
7.1 常见驱动芯片型号对比与适配场景
| 芯片型号 | 接口类型 | 最高波特率 | 驱动加载方式 | 常见应用 |
|---|---|---|---|---|
| CH340 | USB 2.0 Full Speed | 2Mbps | 内核自带 ch341.ko | 低成本开发板,兼容性好 |
| CH9102 | USB 2.0 Full Speed | 4Mbps | 内核自带 ch341.ko(新版内核) | 替代CH340的新方案 |
| CP2102 | USB 2.0 Full Speed | 1Mbps | 内核自带 cp210x.ko | ESP系列经典方案 |
| FT232 | USB 2.0 Full Speed | 3Mbps | 内核自带 ftdi_sio.ko | 工业级可靠性 |
| FT2232H | USB 2.0 High Speed | 12Mbps | 内核自带 ftdi_sio.ko | 多路串口/JTAG/SPI |
关于FTDI芯片,特别提醒一句:市面上有大量假冒的FT232芯片,插上之后Linux会提示ftdi_sio: Device detected but not supported之类的错误。这是FTDI官方在新驱动里加入的防伪机制。如果你买到了假芯片,dmesg里会看到类似Invalid device id的信息,这种情况只有换一颗正品FTDI芯片才能解决,软件层面没法绕过(也不应该绕过)。
7.2 Ubuntu内核模块的加载机制
Linux内核模块的加载顺序是这样的:
- USB核心层检测到新设备插入。
- 根据设备的
bInterfaceClass(接口类)判断这是一个通信设备。 - 遍历已注册的USB驱动列表,按
idVendor/idProduct匹配驱动。 - 匹配成功,调用驱动的
probe函数。 probe函数创建tty设备并注册到内核。
如果第3步匹配失败,dmesg里会看到no driver found的提示。这通常意味着你的内核源码里编译驱动时,把对应的CONFIG_USB_SERIAL_CH341或CONFIG_USB_SERIAL_CP210X给关掉了。
检查当前内核支持哪些USB串口驱动:
zcat /proc/config.gz | grep CONFIG_USB_SERIAL或者(如果/proc/config.gz不存在):
cat /boot/config-$(uname -r) | grep CONFIG_USB_SERIAL如果输出里某个驱动是=m,说明编译成了模块,但系统启动时没加载;如果是=y,说明编译进了内核;如果是is not set,那就得重新编译内核或者换一个预编译内核。
7.3 编译内核模块的正确姿势
如果你确实遇到内核里没有对应驱动的情况,最稳妥的办法是动态编译一个模块,而不要重编整个内核。步骤如下:
先安装内核头文件:
sudo apt install linux-headers-$(uname -r)然后去内核源码树(或者单独下载驱动源码)里编译单个模块:
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules编译完后把.ko文件拷贝到系统的模块目录:
sudo cp ch341.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ sudo depmod -a sudo modprobe ch341这整个过程听起来挺复杂,但本质上就是“编写驱动代码 -> 调用内核编译工具 -> 安装模块文件 -> 加载”。对于绝大多数Ubuntu用户来说,这一步根本用不上,因为发行版自带的内核已经把常见驱动都编进去了。真正需要手动编译驱动的是那些自己裁剪内核的嵌入式开发者,或者特定硬件平台的用户。
7.4 排除USB转串口“假死”状态
还有一种常见的“找不到设备”情况,是USB转串口芯片进入了假死状态。比如你在调试时拔掉USB线但没断开设备,或者板子反复上下电,导致芯片内部状态机错乱了。Linux这边表现就是dmesg能看到有设备插入,但就是注册不了tty。
解决办法很简单,先彻底断开USB设备:
- 拔出USB线。
- 在Ubuntu里执行
sudo modprobe -r ch341卸载驱动。 - 重新插入USB线。
- 再执行
sudo modprobe ch341重新加载驱动。
如果还不行,就重启一下Ubuntu系统,或者把开发板断电甚至拔掉电池再插上。这种假死状态很少见,但一旦遇到,很容易让人抓狂,因为你排查环境、驱动、权限全都没问题,但设备就是不出现。
8. 实操场景实录:一次完整的T113开发板串口连接排查过程
最后分享一个我自己的真实案例,完整走一遍排查流程,把上面所有知识串起来。
8.1 故障现象
手头一块全志T113开发板,通过USB线连接到Ubuntu 22.04主机,运行ls /dev/ttyUSB*没反应,screen /dev/ttyUSB0 115200直接报错。
8.2 排查步骤记录
第一步,先看物理链路:
$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub只有root hub,没有其他设备。这说明USB总线上压根没检测到任何设备。我当时第一反应是:板子没上电。检查电源灯,果然没亮。
换了一根带辅助供电的USB线接上,开发板电源指示灯亮了,再执行lsusb:
Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter设备已经被USB层识别到了。这时候再查内核日志:
$ dmesg | tail -n 10 usb 1-1: new full-speed USB device number 3 using xhci_hcd usb 1-1: New USB device found, idVendor=1a86, idProduct=7523 usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-1: Product: USB Serial usb 1-1: Manufacturer: QinHeng Electronics usb 1-1: SerialNumber: 00 01 00 00 ch341 1-1:1.0: ch341-uart converter detected usb 1-1: ch341-uart converter now attached to ttyUSB0完美,ttyUSB0已经被创建。这时候查看设备节点:
$ ls -l /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 0 Oct 10 10:25 /dev/ttyUSB0设备节点存在,权限是root:dialout,普通用户没权限。检查自己当前用户:
$ groups user1 sudo果然不在dialout组里。执行:
sudo usermod -a -G dialout $USER注销重新登录,再用screen连接:
screen /dev/ttyUSB0 115200成功进入开发板的串口终端,看到了熟悉的登录提示符。
8.3 这个案例踩过哪些坑
这个案例里最迷惑人的地方在于,一开始lsusb都没有任何输出,很容易让人怀疑是不是Ubuntu系统有问题。但其实只是供电问题。换个角度想,如果你上来就装驱动、改udev规则、折腾权限,方向全错了。
所以我一直跟朋友强调一个原则:排查串口设备识别问题,一定要按“物理链路 -> USB枚举 -> 驱动匹配 -> 设备节点 -> 权限访问 -> 串口工具”这个顺序来。不要跳步骤,不要想当然。这个顺序能帮你省下大量时间。
9. 写在最后的几个经验建议
说几句掏心窝子的话。
玩嵌入式开发板,串口是第一道关,也是后来排查问题最重要的工具。很多人买来开发板后第一件事就是截图问“为什么我找不到设备?”,其实只要按上面这套逻辑走一遍,九成问题你自己就能解决。
我的建议是把上面那套排查命令组合存成一个脚本,或者直接记在笔记里。以后不管是换电脑、换虚拟机、换板子,流程都一样的。
另外,如果你经常需要在Linux和不同开发板之间切换,强烈建议养成一个习惯:在板子上面贴一个标签,写清楚它的串口芯片型号和默认波特率。别笑,这事儿太实用了。我前两天翻出一块吃灰很久的ESP32板子,就是靠贴着“CP2102@115200”的标签才想起来怎么连的。
还有一个小技巧是,给不同项目配置不同的udev规则,让每块板子的串口都有一个固定的名字。比如全志T113叫/dev/tty_t113,STM32叫/dev/tty_stm32,ESP32叫/dev/tty_esp32。这样哪怕五六块板子同时插着,你也不会搞混。
开发板串口连接这个事,说难也难,说简单也简单。难在它涉及到USB协议栈、内核驱动、设备节点、权限管理好几个层面,任何一个环节出问题都会让你摸不着头脑。简单在只要你按逻辑顺序排查,每个环节都有明确的验证命令和判断标准,没有什么真正的玄学。
希望这篇文章能帮你少走点弯路。如果你手头正好有一块连不上的板子,不用犹豫,现在就打开破终端跑一遍lsusb吧。