1. 问题现象与初步排查
最近在Ubuntu 22.04系统上使用CH34x系列USB转串口设备时,遇到了一个典型问题:设备插入后无法正常通信。具体表现为使用minicom等串口工具时提示"cannot open /dev/ttyUSB0: No such file or directory"。这个问题在嵌入式开发中相当常见,特别是使用各种开发板进行调试时。
首先通过lsusb命令确认设备是否被识别:
lsusb如果输出中包含"1a86:7523 QinHeng Electronics CH340 serial converter"这样的信息,说明硬件连接正常。接下来检查驱动加载情况:
ls /lib/modules/$(uname -r)/kernel/drivers/usb/serial这里可能会发现系统自带的ch341.ko驱动文件日期显示是2013年的版本,明显过于陈旧。更奇怪的是,即使更新了驱动,设备节点仍然不会出现在/dev目录下。
2. 驱动冲突的深层原因
2.1 驱动版本不兼容问题
Ubuntu 22.04默认使用的Linux内核版本是5.15.x,而官方提供的CH34x驱动源码(CH341SER_LINUX.ZIP)主要支持2.6.25到3.13.x内核。直接编译时会出现类型定义错误:
error: unknown type name 'wait_queue_t'这是因为新版内核中wait_queue_t类型已被移除。解决方法是从Linux内核源码中获取对应版本的ch341.c文件(路径:drivers/usb/serial/ch341.c),替换驱动包中的源文件重新编译。
2.2 brltty进程抢占问题
即使驱动编译安装成功,使用dmesg查看内核日志会发现关键线索:
sudo dmesg | grep tty输出中会出现类似这样的信息:
[ 44.673749] usb 1-1: usbfs: interface 0 claimed by ch34x while 'brltty' sets config #1brltty是为视障人士提供的盲文显示守护进程,它会自动抢占所有新出现的串口设备。这个设计本意是好的,但对于开发者来说就成了障碍。
3. 完整解决方案
3.1 更新CH34x驱动
- 从官网下载最新驱动包并解压:
unzip CH341SER_LINUX.ZIP- 替换源文件后编译:
make sudo make load- 检查驱动是否加载:
lsmod | grep ch34x3.2 处理brltty冲突
永久解决方案是移除brltty服务:
sudo apt remove brltty或者仅禁用该服务(适合需要保留软件的场景):
sudo systemctl stop brltty-udev sudo systemctl disable brltty-udev3.3 权限设置
为避免每次都需要sudo,可以添加用户到dialout组:
sudo usermod -aG dialout $USER然后设置设备权限:
sudo chmod 666 /dev/ttyUSB04. 验证与使用
重新插拔设备后,检查设备节点:
ls /dev/ttyUSB*现在应该能看到ttyUSB0设备了。使用minicom测试:
minicom -D /dev/ttyUSB0 -b 115200如果遇到权限问题,可以临时使用:
sudo minicom -D /dev/ttyUSB0 -b 1152005. 进阶技巧与注意事项
对于需要频繁切换不同串口设备的开发者,建议安装一个可视化串口工具如cutecom:
sudo apt install cutecom在设备热插拔时,可以通过以下命令强制重新加载驱动模块:
sudo rmmod ch34x sudo modprobe ch34x如果遇到驱动加载失败的情况,检查内核日志通常能快速定位问题:
sudo dmesg | tail -n 30有些开发板可能需要额外的流控设置,在minicom配置中需要关闭硬件流控(Hardware Flow Control)。对于稳定性要求高的场景,建议使用质量可靠的USB转串口模块,劣质模块可能会导致通信不稳定或驱动异常。