ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CH340驱动安装全攻略:Windows与Linux串口通信配置指南

CH340驱动安装全攻略:Windows与Linux串口通信配置指南 CH340这颗芯片搞过单片机、Arduino、ESP32、STM32串口通信的人基本都绕不开它。便宜、好用、外围电路简单一块小板子几块钱就能把USB转成TTL串口所以市面上大量开发板、烧录器、传感器模块都在用它。但它的驱动安装恰恰是新手最容易卡住的第一道坎——设备管理器里冒出一个带黄色感叹号的USB2.0-Serial或者干脆连端口都不出现插拔半天没反应。这篇内容就把Windows和Linux两大平台下CH340驱动的安装流程、底层逻辑、以及我这些年踩过的各种坑一次性讲透。不管你是刚拿到第一块开发板的小白还是被预安装成功但设备用不了折腾过的老手都能在这里找到对应的解法。1. 先搞清楚CH340到底是什么以及为什么驱动会装不上1.1 CH340的身份一颗USB转串口的桥接芯片CH340是南京沁恒WCH推出的一颗USB总线转接芯片最常见的型号是CH340G、CH340C、CH340B、CH340E、CH340N等。它的核心作用就一句话把电脑的USB接口虚拟成一个传统的串口COM口让那些只会说UART协议的单片机、开发板能和电脑对话。你可以把它理解成一个翻译官。电脑这边说的是USB协议单片机那边说的是TTL串口协议TX、RX、GND、VCC四根线两边语言不通CH340就夹在中间做实时翻译。翻译官要上岗电脑必须先认识他——这个认识的过程就是装驱动。为什么电脑一开始不认识它因为USB协议规定每个USB设备插入时都要向主机报告自己的身份信息包括厂商IDVID和产品IDPID。CH340的VID是0x1A86PID常见的是0x7523CH340和0x5523CH341。Windows系统自带的驱动库里没有这个VID/PID组合的匹配项所以第一次插入时系统只能识别出这是一个USB设备但不知道该用哪个驱动去驱动它于是就在设备管理器里挂一个黄色感叹号提示未知设备或USB2.0-Serial。1.2 为什么预安装成功却依然用不了这是被问得最多的一个问题。很多人在装CH340驱动时会看到一句提示驱动预安装成功。然后兴冲冲插上板子结果设备管理器里还是感叹号或者端口列表里空空如也。这里要理解Windows的驱动安装机制。所谓预安装成功意思是驱动包已经被解压并注册到了系统的驱动仓库DriverStore里系统知道了有这么个驱动存在。但这不等于驱动已经和设备绑定了。真正的绑定发生在设备插入的那一刻系统会根据设备的VID/PID去DriverStore里找匹配的驱动找到后才加载。那为什么预安装成功了还是匹配不上常见原因有三个驱动版本和芯片型号不匹配比如你装的是老版CH340驱动但板子上用的是CH340C或CH340E老驱动的INF文件里没有这些新PID自然匹配不上。系统里已经有一个错误的驱动占了坑Windows有时会自动给未知USB设备分配一个通用的串口驱动这个驱动虽然能创建COM口但通信不正常。你需要先卸载它再重新扫描。数字签名问题尤其在Windows 7和部分Windows 10版本上如果驱动没有通过微软的数字签名认证系统会静默拒绝加载表现就是装了但没反应。提示判断驱动是否真正加载成功不要只看安装程序的提示要看设备管理器里端口COM和LPT下面是否出现了USB-SERIAL CH340 (COMx)且没有黄色感叹号。1.3 不同封装和型号带来的驱动差异CH340家族型号不少驱动兼容性也有细微差别。下面这张表是我实际测试整理的供你对照型号常见封装VID/PID驱动兼容性说明CH340GSOP-161A86:7523最经典几乎所有版本驱动都支持CH340CSOP-161A86:7523内置晶振PID同G驱动通用CH340BSOP-161A86:7523带EEPROM驱动通用CH340EMSOP-101A86:7523小封装驱动通用CH340NSOP-81A86:7523无需晶振驱动通用CH341ASOP-281A86:5523并口/串口/I2C多用途PID不同从表里能看出来大部分CH340型号的PID都是7523所以驱动基本通用。但CH341A是5523如果你买的是CH341A的编程器装CH340驱动是不认的得装CH341的驱动。这一点很多人会搞混。2. Windows平台驱动安装从下载到验证的完整链路2.1 驱动从哪里来官方渠道与版本选择Windows下装CH340驱动最稳妥的来源是沁恒官网。搜索WCH CH341SER就能找到官方驱动下载页驱动包名字通常叫CH341SER.EXE或CH341SER.ZIP。注意虽然名字里写的是CH341但这个驱动包同时包含CH340和CH341的驱动是通用的。版本选择上我建议用较新的版本比如3.5以上。老版本3.3、3.4在Windows 10/11上偶尔会出现签名验证失败的问题。如果你在官网下载不方便很多开发板卖家也会提供驱动包但要注意甄别有些是阉割版或者夹带了其他东西。下载下来如果是ZIP包解压后你会看到这些关键文件CH341SER.EXE图形化安装程序双击就能装CH341SER.INF驱动信息文件手动安装时用CH341SER.SYS驱动核心文件SETUP.EXE另一个安装入口2.2 图形化安装最省事但也最容易出问题的路径双击CH341SER.EXE点安装等进度条走完看到驱动预安装成功就完事了。这是最常规的操作但也是最容易出问题的环节。我遇到过的情况包括安装程序闪退、提示安装失败、提示成功但设备管理器没变化。针对这些我的处理顺序是这样的先拔掉所有CH340设备再运行安装程序。带着设备装系统可能在安装过程中就尝试绑定反而容易出错。右键以管理员身份运行。驱动安装涉及系统目录写入权限不够会静默失败。关闭杀毒软件和Windows Defender的实时保护。有些安全软件会把驱动安装行为当成可疑操作拦截。安装完成后重新插拔设备让系统重新枚举。如果走完这四步还是不行那就别在图形化安装上死磕了直接转手动安装。2.3 手动指定INF安装解决预安装成功但无效的杀手锏手动安装是我最推荐的方式因为它绕过了安装程序的封装逻辑直接让系统去读INF文件匹配成功率最高。步骤如下插上CH340设备打开设备管理器WinX选设备管理器。找到带黄色感叹号的设备通常在其他设备下面名字可能是USB2.0-Serial或未知设备。右键该设备选更新驱动程序。选浏览我的电脑以查找驱动程序。选让我从计算机上的可用驱动程序列表中选取。点从磁盘安装然后浏览到你解压的驱动目录选中CH341SER.INF。如果列表里出现了USB-SERIAL CH340选中它点下一步忽略签名警告完成安装。这套流程的关键在于第6步——直接指定INF文件。系统会读取INF里的VID/PID匹配规则强制把驱动绑定到你的设备上。实测下来这个方法能解决90%以上的预安装成功但无效问题。注意如果在第7步看到多个兼容设备一定要选带CH340字样的那个不要选成USB-SERIAL CH341或其他。2.4 验证驱动是否真正生效装完之后怎么确认真的好了别只看设备管理器有没有感叹号要做实际通信测试。第一步看设备管理器。展开端口COM和LPT应该能看到USB-SERIAL CH340 (COMx)记住这个COM号。第二步用串口工具测试。可以用Putty、SecureCRT或者Arduino IDE自带的串口监视器。打开对应COM口波特率设成9600或115200如果打开时不报错说明驱动层面已经通了。第三步做回环测试可选但强烈推荐。找一根杜邦线把CH340模块的TX和RX短接然后用串口工具发送数据如果收到的和发出的一模一样说明收发链路完全正常。这一步能排除驱动装了但硬件或接线有问题的情况。2.5 Windows 11下的特殊处理Windows 11对驱动签名要求更严有些老版本CH340驱动会被直接拒绝。如果你在Win11上遇到装不上的情况可以试试这几招用最新版驱动3.7以上官方已经做了Win11适配。临时禁用驱动签名强制设置→系统→恢复→高级启动→立即重新启动→疑难解答→高级选项→启动设置→重启→按7选择禁用驱动程序强制签名。装完驱动后再正常重启签名限制会恢复但驱动已经装好了。如果设备管理器里显示该设备无法启动代码10通常是驱动冲突卸载设备并勾选删除此设备的驱动程序软件然后重新插拔再装。3. Linux平台CH340驱动为什么不用装以及出问题怎么办3.1 Linux内核自带的ch341驱动模块和Windows不同Linux内核从很早的版本2.6.x时代就已经内置了CH340/CH341的驱动模块名叫ch341。这意味着在绝大多数现代Linux发行版上你插上CH340设备系统会自动加载驱动直接出现/dev/ttyUSB0设备节点根本不需要手动装驱动。你可以用这条命令确认驱动是否加载lsmod | grep ch341如果输出里有ch341和usbserial说明驱动已经在了。再用dmesg | tail -20插拔设备时看内核日志正常的话会看到类似ch341-uart converter now attached to ttyUSB0的提示。3.2 设备节点权限问题为什么普通用户打不开串口驱动加载了设备节点/dev/ttyUSB0也出现了但用普通用户身份打开串口工具时提示Permission denied。这是Linux下最常见的CH340问题根源在于设备节点的默认权限。默认情况下/dev/ttyUSB0的属主是root权限是crw-rw----普通用户不在dialout组里就没法访问。解决办法是把当前用户加入dialout组sudo usermod -aG dialout $USER执行完要注销重新登录才生效或者重启。之后再用groups命令确认自己已经在dialout组里。有些发行版比如Arch、部分Ubuntu版本用的是uucp组而不是dialout可以先ls -l /dev/ttyUSB0看看属组是哪个再对应加入。3.3 驱动加载了但设备不出现的排查思路如果lsmod能看到ch341但插上设备后/dev/ttyUSB0就是不出现按这个顺序排查换USB线和USB口。很多廉价USB线只有供电线没有数据线插上能亮灯但没数据。换一根确认能传数据的线换一个USB口试试。看dmesg输出。插拔设备时dmesg | tail如果看到usb 1-1: device descriptor read/64, error -71之类的错误说明USB通信层面就有问题可能是线材、供电或设备本身故障。检查是否有其他驱动抢占。有些设备会被识别成cdc_acm而不是ch341用dmesg看具体加载了哪个模块。如果是cdc_acm可能需要手动卸载再让ch341接管。确认内核版本。极老的发行版比如CentOS 6内核可能没有ch341模块需要手动编译。不过现在这种情况已经很少见了。3.4 手动编译ch341模块的场景只有在极少数情况下才需要手动编译驱动比如内核裁剪掉了ch341模块或者你用的是很特殊的嵌入式Linux系统。编译流程大致是# 确认内核头文件已安装 sudo apt install linux-headers-$(uname -r) # 下载官方驱动源码沁恒官网提供Linux版 # 解压后进入目录 make sudo make install sudo modprobe ch341编译前要确保make和gcc已经装好。如果编译报错多半是内核头文件版本和当前内核不匹配用uname -r确认版本后装对应的headers。3.5 udev规则给设备一个固定的名字在多设备场景下今天插上是ttyUSB0明天可能变成ttyUSB1这对脚本自动化很不友好。解决办法是写一条udev规则根据设备的序列号或物理端口给它绑定一个固定的符号链接。创建文件/etc/udev/rules.d/99-ch340.rules内容类似SUBSYSTEMtty, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, SYMLINKttyCH340然后重新加载udev规则sudo udevadm control --reload-rules sudo udevadm trigger之后不管插拔多少次都可以用/dev/ttyCH340这个固定名字访问设备。如果同时有多个CH340设备可以加上ATTRS{serial}具体序列号来区分。4. 那些年我踩过的CH340坑典型故障与排查实录4.1 案例一Mixly识别不到CH340端口有个朋友用Mixly做Arduino图形化编程板子插上后Mixly的端口列表里死活没有COM口但设备管理器里明明有。这个问题的排查过程挺有代表性。先确认设备管理器里有USB-SERIAL CH340 (COM3)说明驱动没问题。然后打开Mixly端口列表为空。这时候问题就不在驱动而在Mixly本身。Mixly依赖Java的串口库如果Java环境有问题或者Mixly版本太老不兼容当前系统就会读不到端口。解决办法换最新版Mixly确认Java环境正常。如果还不行先在Arduino IDE里测试能不能打开COM3如果Arduino IDE能打开说明是Mixly的问题如果Arduino IDE也打不开那还是驱动或权限问题。这个案例的教训是端口不出现不一定是驱动问题要分层排查。先确认系统层面设备正常再确认应用层面能否访问。4.2 案例二CH340如何手动控制RTS电平有些场景需要手动控制CH340的RTS请求发送引脚比如用它来做复位信号或者某些特殊的时序控制。CH340的RTS引脚可以通过串口API来控制。在Windows下可以用EscapeCommFunction函数// 拉高RTS EscapeCommFunction(hSerial, SETRTS); // 拉低RTS EscapeCommFunction(hSerial, CLRRTS);在Linux下用ioctl的TIOCMSETint status; ioctl(fd, TIOCMGET, status); status | TIOCM_RTS; // 拉高 ioctl(fd, TIOCMSET, status); status ~TIOCM_RTS; // 拉低 ioctl(fd, TIOCMSET, status);Python下更简单用pyserialimport serial ser serial.Serial(/dev/ttyUSB0) ser.rts True # 拉高 ser.rts False # 拉低这里有个坑要注意CH340的RTS和DTR引脚在芯片复位后的默认状态可能和你预期的不一样有些板子会用这两个引脚做自动下载电路如果你手动控制了可能会干扰正常的下载流程。所以控制之前先确认板子的电路设计。4.3 案例三RK3566 Android系统下的CH340在RK3566这类嵌入式Android平台上用CH340情况和桌面Linux又不一样。Android虽然底层是Linux但默认可能没有编译ch341模块或者权限管理更严格。处理思路是先确认内核配置里有没有开CONFIG_USB_SERIAL_CH341没有的话要重新编译内核。如果有模块但设备节点权限不对需要在Android的init.rc或者ueventd.rc里加权限规则。另外Android的串口访问通常需要root权限普通应用层访问受限。这个场景比较特殊普通玩家一般遇不到但做嵌入式产品开发的话迟早会碰上。4.4 常见故障速查表把上面这些经验整理成一张速查表遇到问题可以直接对照现象可能原因处理方式设备管理器黄色感叹号驱动未安装或未匹配手动指定INF安装预安装成功但无COM口驱动未绑定设备卸载设备后重新插拔或手动更新驱动有COM口但打不开端口被占用或权限不足关闭占用程序Linux下加dialout组Linux下无ttyUSB0驱动未加载或线材问题检查lsmod和dmesg换线换口通信乱码波特率不匹配确认两端波特率一致通信时断时续供电不足或线材质量差换高质量USB线加外部供电Win11装不上签名验证失败用新版驱动或临时禁用签名强制5. 驱动装好之后串口通信的进阶配置与稳定性优化5.1 波特率、数据位、停止位的正确设置驱动装好只是第一步真正通信稳定还要把串口参数配对。标准配置是波特率115200、数据位8、停止位1、无校验简称115200-8-N-1。但有些老设备用的是9600甚至更低这时候如果两边不一致收到的就是乱码。波特率本质上是通信速率可以理解为两个人说话的语速。你说得快对方听得慢信息就丢了。CH340支持的波特率范围很宽从50bps到2Mbps都能覆盖但实际能跑多高取决于你的主控和线材质量。长线、劣质线材在高波特率下误码率会明显上升。5.2 流控什么时候需要开RTS/CTS流控是防止数据丢失的机制。当接收方缓冲区快满了通过RTS/CTS信号告诉发送方慢点发。在低速、短数据量场景下不开流控也没事。但在高速、大数据量传输时不开流控很容易丢数据。CH340支持硬件流控RTS/CTS和软件流控XON/XOFF。硬件流控需要额外接两根线软件流控只需要TX/RX两根线但会占用数据字符。我的经验是数据量不大就用无流控数据量大且线够用就上硬件流控。5.3 长时间通信的稳定性注意事项做数据采集或者长时间通信的项目CH340偶尔会出现掉线、卡死的情况。几个优化点避免USB口供电不足。有些板子从USB取电电流不够时CH340会工作不稳定。可以给板子单独供电。加看门狗逻辑。在软件层面检测串口是否还在响应超时就重新打开端口。避免频繁开关串口。每次打开关闭都有开销尽量保持长连接。注意缓冲区设置。pyserial里可以设置timeout和write_timeout避免读写阻塞导致程序卡死。import serial ser serial.Serial( port/dev/ttyUSB0, baudrate115200, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeout1, # 读超时1秒 write_timeout1 # 写超时1秒 )5.4 跨平台开发的驱动一致性建议如果你的项目要在Windows和Linux之间来回切换建议统一用pyserial这类跨平台库代码基本不用改只需要改端口名Windows是COMxLinux是/dev/ttyUSBx。另外把驱动安装步骤写成文档换电脑时照着做一遍能省很多重复排查的时间。我个人习惯是在项目仓库里放一个docs/driver-setup.md把Windows和Linux的驱动安装步骤、常见问题都记下来。团队里新人拿到板子照着文档走一遍就能跑起来不用每次都来问我。最后分享一个我用了很久的小技巧判断CH340是不是真的在工作最快的办法不是看设备管理器而是插拔设备时听Windows的提示音或者看Linux的dmesg有没有新输出。有反应说明USB层面通了剩下的就是驱动和权限的事。这个判断方法帮我省了无数次来回折腾的时间。
返回列表