目录
- 一、问题现象
- 二、问题排查
- 三、解决方法
-
- [方案 1:直接卸载 brltty(最彻底,推荐)](#方案 1:直接卸载 brltty(最彻底,推荐))
- [方案 2:临时停止服务(测试用,重启后恢复)](#方案 2:临时停止服务(测试用,重启后恢复))
- [方案 3:保留 brltty,修改 udev 规则屏蔽 CH341](#方案 3:保留 brltty,修改 udev 规则屏蔽 CH341)
- 四、问题验证
一、问题现象
复现环境:
- 开发板的串口芯片为CH341/CH340
- VMware虚拟机下的Ubuntu22.04.5
将开发板的串口连接到电脑,并在VMware中将对应设备连接到Ubuntu

查看/dev/下已挂载设备,发现挂载设备并没有新增,多次尝试断开和连接设备,亦无效果

二、问题排查
怀疑被当前运行的其他服务给挤掉了。
通过dmsg实时查看内核日志,命令如下:
bash
dmesg -w
先打开内核日志实时监控,然后连接开发板串口到Ubuntu,对应的日志内容如下:

日志分析:
idVendor=1a86, idProduct=7523→ 识别到南京沁恒 CH341 USB 转串口芯片(ESP32 开发板最常用的下载芯片)ch341-uart converter now attached to ttyUSB0→ 正常挂载为/dev/ttyUSB0interface 0 claimed by ch341 while 'brltty' sets config→ 核心冲突:brltty 服务强行接管这个 USB 接口ch341-uart converter now disconnected from ttyUSB0→ 串口驱动被挤掉,设备断开
因此问题原因就是**brltty服务(Linux 盲文屏幕辅助工具)错误抢占了CH341 串口芯片**,导致 ESP32 的串口刚挂载上就被强制断开,属于串口冲突问题。
三、解决方法
方案 1:直接卸载 brltty(最彻底,推荐)
普通开发用户完全用不到盲文功能,卸载一劳永逸:
bash
sudo apt remove brltty
执行完,拔掉 ESP32 再重新插上,串口就会正常挂载。
方案 2:临时停止服务(测试用,重启后恢复)
bash
sudo systemctl stop brltty
适合临时验证问题,重启系统后 brltty 会重新启动,冲突会复现。
方案 3:保留 brltty,修改 udev 规则屏蔽 CH341
不想卸载 brltty 的话,注释掉对应规则:
bash
sudo vim /usr/lib/udev/rules.d/90-brltty-device.rules
搜索 1a86(CH341 厂商 ID),把对应行注释掉(行首加 #),保存后重载规则:
bash
sudo udevadm control --reload-rules
再重插设备即可。
因brltty功能在开发过程中使用不到,这里采用 方案一 ,直接将 brltty给卸载掉
bash
sudo apt remove brltty

四、问题验证
重新连接开发板到Ubuntu,dmesg -w查看实时内核日志:

通过上面日志可以看到ch341 USB串口正常挂载到了ttyUSB0
再查看下/dev/ 中已有内核导出的设备文件ttyUSB0设备
