Ubuntu 18.04下CH340/CH341驱动安装教程与常见问题排查

发布时间:2026/10/17 1:36:13
Ubuntu 18.04下CH340/CH341驱动安装教程与常见问题排查 玩嵌入式开发的朋友十有八九都绕不开CH340/CH341这颗USB转串口芯片不管是开发板调试、Arduino下载程序还是接个GPS模块、单片机通信几乎都能看到它的影子。我见过太多人在Ubuntu 18.04下插上设备电源指示灯亮了但ls /dev/ttyUSB*就是不出设备折腾半天发现是驱动没装对。这篇就把我在Ubuntu 18.04上安装CH340和CH341驱动的完整过程、踩坑记录和排查思路分享出来照着操作基本能一次搞定。先说清楚这篇文章能解决什么问题让系统正确识别CH340/CH341芯片正常生成串口设备节点并且保证读写稳定、权限可用。它适合刚接触Linux嵌入式开发的新手也适合被驱动问题折腾得头疼、想搞清楚底层原因的老手。1. 先搞懂这俩芯片和驱动的关系1.1 CH340与CH341到底是个什么物件CH340和CH341是常见的USB转串口芯片本质上是把USB协议转换成UART串口信号让电脑通过USB口就能和单片机、传感器、路由器等设备通信。CH340最常见几乎所有廉价的USB转TTL模块都在用它CH341功能更多一点除了串口还能切到并口或者I2C/SPI模式但大多数人用到的还是串口功能。为什么在Windows下插上就能用因为系统自带或者自动更新的驱动里已经包含了对应设备安装过程被隐藏了。而Ubuntu 18.04这类Linux发行版则不同内核里虽然集成了名为ch341的驱动模块但它能覆盖的芯片版本有限而且很多坑都藏在内核版本和芯片版本的匹配关系里。如果不了解这层关系出问题的时候就会毫无头绪。1.2 Ubuntu 18.04下驱动问题的根源Ubuntu 18.04发布时的内核版本是4.15这个版本里的ch341驱动对后来市场上出现的部分CH340改版芯片尤其是一些非原厂兼容芯片支持不完整。内核自带驱动虽然能识别设备ID但和某些芯片的握手时序不匹配结果是dmesg能看到USB设备枚举成功但串口设备节点根本不出或者出了也不工作。另一个典型问题在于18.04默认自带的一些服务会抢占串口设备比如某些无障碍辅助服务会自动尝试操作USB连接的HID设备导致驱动加载时出现“device or resource busy”的错误。这个我在下文会专门讲。搞清楚根源之后安装思路就清晰了优先让内核自带的ch341驱动发挥正常作用如果失败就用芯片原厂提供的Linux驱动源码自己编译加载。这两种路线分别适配不同场景没有绝对的好坏全看你的芯片型号和内核版本。2. 安装前的设备体检与方案选型2.1 第一步确认系统是否已经识别芯片不管打算走哪条安装路线安装前必须先做一次体检搞清楚三件事芯片插上后USB层是否被系统发现、内核是否已经加载了相关驱动模块、串口设备节点到底出没出来。把USB转串口模块插到电脑上然后在终端依次执行以下命令lsusb这条命令会列出所有USB设备找一个带有1a86厂商ID的项。CH340和CH341的USB厂商ID几乎都是1a86比如常见的1a86:7523就是CH3401a86:5523是CH341。如果lsusb里能看到这个ID说明芯片和电脑之间的物理链路没问题USB枚举阶段已经通过了。dmesg | tail -n 20这条命令能看内核日志的最近输出。插拔USB设备后这里会留下类似usb 1-1: new full-speed USB device的枚举记录也会显示驱动加载是否成功。如果日志最后几行有ch341相关的字样说明内核驱动模块参与了工作。ls /dev/ttyUSB*如果一切正常执行完这一条会看到/dev/ttyUSB0这样的设备节点这就是应用程序要打交道的串口入口。2.2 三条路线怎么选体检结果不同安装路径也不同。我按实际操作经验把方案分成三种你在动手之前先对照一下自己属于哪种情况。第一种最省事lsusb能看到设备dmesg里也有驱动加载信息/dev/ttyUSB*也出现了设备节点。这说明内核自带驱动已经够用不需要再折腾任何安装步骤直接跳到第4节做权限配置和收发测试就行。驱动不是越新越好能稳定工作的就是最好的。第二种最常见lsusb能看到设备但/dev/ttyUSB*下没有节点或者dmesg提示驱动加载失败。这种情况优先尝试重新加载内核自带的ch341模块还不行就走源码编译路线。第三种最麻烦lsusb里完全看不到1a86这个厂商ID或者设备名显示为Unknown。这说明USB枚举本身就没成功和驱动程序无关通常要检查USB线、供电、模块焊接质量或者换一台电脑交叉验证。我把三种情况整理成了下面的对照表方便你快速定位。体检现象可能原因推荐方案lsusb可见ttyUSB节点存在驱动正常直接配置权限并测试lsusb可见ttyUSB节点不存在内核驱动未加载或版本不匹配手动加载或源码编译lsusb完全不可见USB枚举失败检查硬件、换线、换口dmesg提示resource busy系统服务占用设备禁用冲突服务后重试3. 驱动安装实操从内核自带到源码编译3.1 先让内核自带的ch341驱动正常工作Ubuntu 18.04默认内核携带ch341驱动模块但有时候它没有自动加载。第一件事是手动检查模块是否加载lsmod | grep ch341如果没有任何输出说明这个模块还没有加载。手动加载试试sudo modprobe ch341执行完再查看/dev/ttyUSB*如果没有报错且设备节点出现那就成功了。但要注意modprobe只是临时加载重启后会失效后面我会讲怎么让它开机自动加载。如果modprobe报错比如提示module not found说明当前内核确实没有可用的ch341模块或者该模块被编译成了别的名字。这时候需要确认一下当前内核版本uname -rUbuntu 18.04如果手动升级过内核版本号会变成诸如5.4.x之类的新版本。新内核里ch341驱动的覆盖率会好很多但对应模块名可能已经变成了ch341或ch_wch。如果找不到模块最干脆的方式是走下一步源码编译。3.2 源码编译安装通用方案源码编译是覆盖面最广的一条路也是我在原厂芯片上实测最稳的方法。目前的Linux驱动源码包下载之后解压、编译、安装三步走。先安装编译环境依赖sudo apt update sudo apt install gcc make linux-headers-$(uname -r)注意linux-headers这一步必须安装否则编译时头文件缺失会直接报错。然后解压源码包并进入目录tar -xzf ch341ser_linux.tar.gz cd ch341ser_linux/driver不同版本的源码目录结构不太一样有的把驱动代码直接放在解压根目录有的放在driver子目录。如果你下载的包结构不同就灵活找一下包含Makefile和.c源文件的目录。接下来编译并安装make sudo make install编译过程如果顺利会在当前目录生成ch341.ko这样的内核模块文件。make install则负责把它安装到系统模块目录中。这里有一个容易坑到新人的点编译时报错大多数都是因为内核头文件版本和正在运行的内核版本不一致。Ubuntu 18.04系统会同时存在多个内核版本如果升级过内核重启后版本没对上编译就会失败。这时候重新执行一次uname -r确认安装的头文件版本和它完全对应。3.3 让驱动开机自动加载无论是modprobe手动加载成功还是编译安装成功都要解决一个持久化问题重启系统后驱动模块能不能自动加载。手动加载的方式可以这样临时插入sudo insmod ch341.ko但开机自动加载更推荐的做法是把模块名写入系统模块配置文件echo ch341 | sudo tee -a /etc/modules这个文件里的模块会在系统启动时按顺序加载。另外如果是编译安装的模块还可以依赖modprobe的依赖关系自动加载但写进/etc/modules是最简单直接的办法。做完这步最好验证一下sudo reboot # 重启后执行 lsmod | grep ch341 ls /dev/ttyUSB*看到设备节点回来说明开机加载没问题了。4. 装完之后怎么验证和日常使用4.1 检查设备节点和通信状态驱动装好之后先别急着接外设先确认设备节点稳定存在ls -l /dev/ttyUSB*正常情况下会看到类似crw-rw---- 1 root dialout 188, 0的输出。这个dialout用户组很关键当前用户必须隶属于它否则即使有设备节点也没有读写权限。Ubuntu 18.04默认不会把普通用户加进dialout组这就是很多人明明装了驱动却打不开串口的原因。把当前用户加进组并重新登录sudo usermod -aG dialout $USER这条命令执行后需要注销重新登录或者重启系统组权限才会生效。如果不想重新登录也可以临时用sudo运行串口工具但那只适合应急长期开发不推荐。4.2 配置udev规则固定权限和名称如果你经常在多台设备之间切换或者同时插好几块开发板那肯定遇到过设备名漂移的问题。今天插的是ttyUSB0明天变成ttyUSB1脚本里写死的设备名立刻失效。解决办法是写udev规则根据芯片的序列号或物理端口位置固定设备名。先在插着设备的状态下查看芯片属性udevadm info --attribute-walk --name/dev/ttyUSB0输出里能找到ATTRS{serial}这一项不同模块的序列号不一样有的模块出厂时烧录了唯一序列号有的则是全零或空值。找到有效的区分信息后在/etc/udev/rules.d/下新建规则文件sudo vim /etc/udev/rules.d/99-ch340.rules内容参考如下SUBSYSTEMtty, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, ATTRS{serial}你的序列号, SYMLINKttyCH340保存后重载规则sudo udevadm control --reload-rules sudo udevadm trigger拔插一次设备再看/dev/ttyCH340节点已经按规则固定了。这种做法在同时管理多套硬件的时候尤其省心脚本里永远只认固定的符号链接。4.3 一次回环测试快速确认收发正常驱动装完、权限到位还不能百分之百确认串口通信正常。最可靠的验证方式是做一次回环测试把USB转串口模块的TXD和RXD引脚用杜邦线短接然后往串口发数据如果模块正常数据会从TXD发出去再经RXD收回来形成自发自收。先在终端打开一个串口调试工具比如minicom或者screensudo minicom -D /dev/ttyUSB0 -b 9600如果系统没装先安装sudo apt install minicom打开工具后随便敲几个字符屏幕上如果能看到这些字符回显说明收发链路完全正常。需要注意的是回环测试默认不带回显的话需要开启本地回显功能。minicom里可以通过CtrlA然后按E开启本地回显。不想装图形化工具的也可以用一条命令快速验证echo test /dev/ttyUSB0发送之后在接收端看不到数据是正常的因为没有接收方。回环测试才能真正验证数据是否在硬件层面走了个来回。这里我踩过坑有一次回环测试不通过排查了半天发现是杜邦线接触不良模块本身一点问题没有。5. 常见问题与排查实录5.1 插上没反应、dmesg无任何输出dmesg里完全没有USB插入信息这是最让人头疼的情况。我遇到过几次总结下来基本是三类原因。第一类是供电不足。USB转串口模块如果同时给外部设备供电特别是接了STM32这类功耗较高的板子USB口的500mA上限很容易被突破。表现就是设备偶尔识别、经常掉线或者插上之后dmesg完全没反应。解决方法是换一个带独立供电的USB HUB或者用额外电源给外部板子供电不要从串口模块取电。第二类是USB线质量问题。很多USB转串口模块用的是Micro-USB或者Type-C接口某些线材只支持充电不通数据。判断方法很简单换一根确定能传输数据的线试试。我手里一堆线能传数据的就那两根其他的插上只会充电。第三类是芯片焊接问题。有些便宜的模块用的是CH340G贴片封装引脚细密虚焊的情况时有发生。用放大镜观察芯片引脚或者用手轻压芯片看是否恢复连接基本就能确认。这种情况只能补焊没有别的捷径。5.2 设备名一闪而过或被占用USB设备枚举成功设备节点也出现过但立刻消失或者报告权限错误无法打开。这种问题在Ubuntu 18.04里有一个很隐蔽的元凶系统自带的无障碍服务会自动扫描并接管USB设备把串口设备当作HID设备打开导致驱动无法绑定到设备上。判断方法还是看内核日志dmesg | tail -n 30如果出现了cannot claim interface或者device or resource busy之类的字样基本就是它了。处理方式是把相关服务停用sudo systemctl stop brltty-udev.service sudo systemctl disable brltty-udev.service这里直接禁用服务即可不影响日常使用。很多人在网上搜到类似问题重复卸载重装驱动无效真正元凶就是后台服务抢占。5.3 多颗芯片同时插拔搞混设备名同时插两颗CH340模块时系统会按枚举顺序分配ttyUSB0和ttyUSB1但谁对应哪个物理接口不一定而且重新插拔后顺序可能互换。这会直接影响设备识别比如两个设备分别是不同设备但脚本里用的是固定设备名结果数据就会错乱。解决方案就是前面提到的udev规则。如果两颗芯片的序列号都是0或者空无法用序列号区分可以退一步用KERNELS匹配物理端口路径也就是根据芯片插在哪个USB口来确定设备名。比如SUBSYSTEMtty, KERNELS1-1.2, SYMLINKttySensorA这种规则和硬件插入的物理口强绑定换一个USB口就不生效但对固定场景来说足够稳定。5.4 其他稀奇古怪的坑有些情况下即使驱动安装成功串口通信依然不正常表现是波特率设对了还是乱码或者发送几条命令后设备失去响应。这时候先用排除法连接一个GPS模块或串口调试助手工具到另一台电脑上测试先把模块硬件是否正常确认掉。再考虑是不是波特率误差问题。CH340的时钟基准来自内部振荡器某些非原厂芯片的振荡器精度不够在115200以上波特率时帧错误率会明显升高。遇到这种情况可以把波特率降低一档到57600或者38400如果乱码消失就能确认是时钟精度问题。还有一个容易被忽略的点是电平标准。CH340和CH341输出的是TTL电平如果你的外设是RS232电平或者RS485总线直接连接会烧芯片或者完全不通。必须先经过电平转换芯片。这一点在接线前就要确认清楚别怪到驱动头上。故障现象排查方向解决动作dmesg无任何输出供电、USB线、焊接换线、换口、补焊设备节点反复消失服务抢占设备禁用无障碍相关服务打开串口提示权限不足用户不在dialout组usermod加组高波特率下乱码芯片时钟精度不足降波特率或换原厂芯片多设备名漂移缺少udev规则添加固定符号链接最后的一点经验折腾过的驱动安装没有十次也有八次心得体会就是先体检再动手别一上来就编译源码。很多看似复杂的问题其实只是权限没配好或者一个后台服务占了设备真正需要编译源码的场景比想象中少得多。如果你用的是国产兼容芯片而不是原厂芯片源码编译时可能会碰到芯片型号无法识别的情况这通常是源码包版本太老换一个新版就好。另外强烈建议装完驱动后马上做一次回环测试硬件、驱动、权限一次全验证到位省得后面出问题时还要回头拆解是哪一环的问题。最后分享一个小心得设备节点名称不稳定的时候与其每写一个脚本都去改设备名不如花十分钟配置好udev规则一劳永逸。这种一次投入长期受益的事情越早做越划算。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询