
很多新接触Arduino的人第一次碰上CH340不是因为它有多高级而是拿着USB线插上电脑设备管理器里冒出来一个无法识别的设备烧录程序时只能看到一行行报错然后整个人开始怀疑人生。还有一种常见场景更让人头大你手里没有Arduino原装板只有一块几块钱的CH340 USB转TTL模块想直接给Pro Mini或者裸的Atmega328P芯片烧录程序却不知道哪根线接哪根线DTR、RTS、TXD、RXD这几个引脚到底有什么用为什么有人告诉你按一下复位键就能解决有人又非得让你把DTR接上去才能自动烧录。这篇文章我不打算照着手册念所有内容都围绕实际烧录过程中的典型翻车现场来讲。先搞明白CH340和USB转TTL模块在Arduino里扮演什么角色再把DTR自动复位和非DTR手动复位两种方案的接线、操作时序、注意事项逐一拆开最后把驱动安装和各种烧录报错整理成一套排查清单。适合正在用Arduino UNO、Nano、Pro Mini或者想用最小系统裸板跑ATmega328P的读者看完之后你会发现烧录程序这件事本质上没有想象中那么玄。1. 从烧录失败说起CH340在Arduino系统里到底负责什么1.1 USB转TTL和串口通讯的关系先彻底把“USB转TTL”这个词说清楚。电脑上的USB接口传输的是USB协议数据而Arduino这样的单片机和外部通信用的是UART串口协议两者不是同一个东西。USB转TTL模块负责在USB协议和UART串口协议之间做翻译。模块上的核心芯片常见就是CH340、CH341、FT232、CP2102这几颗。CH340是其中性价比非常高的一颗所以大量Arduino兼容开发板都直接把CH340集成在板子上市面上单独卖的所谓“USB转TTL模块”也绝大多数是CH340。Arduino UNO原版用的是ATmega16U2做USB转串口但国内能买到的很多UNO兼容板用的是CH340。对Arduino IDE来说它根本不关心你是原版还是兼容版只会通过操作系统的串口驱动打开一个COM口然后通过这个虚拟串口向单片机发送固件数据。CH340的职责就是让电脑以为你在操作一个普通的串口设备实际上数据都已经变成TTL电平从TXD、RXD引脚出去了。TTL电平这个词听着吓人其实很简单。数字电路里用电压高低表示0和1。对于5V供电的Arduino高电平大概是接近5V低电平是0V附近对于3.3V系统高电平就是接近3.3V。所以“TTL”描述的是一套电压范围规则不是某一种具体芯片。在Arduino开发板内部CH340和ATmega328P之间就是通过这一对TTL电平的TXD、RXD引脚互相传数据的。1.2 DTR是什么为什么它和自动烧录关系这么大DTR的全称是Data Terminal Ready数据终端就绪最早是RS-232串口标准里的一根控制线。放到CH340的场景里DTR可以被Arduino IDE用来控制单片机的复位引脚。这里要引入一个关键概念Arduino的bootloader。拿ATmega328P来说芯片出厂后内部其实没有程序。我们通过USB转TTL烧录程序时芯片里必须提前有一段叫bootloader的小程序。这个bootloader的作用是单片机每次上电复位后先留出一小段时间窗口在这个窗口里等待电脑发送固件数据。如果等到了就开始写入Flash如果没等到就跳转去运行用户之前烧好的程序。那么问题来了怎么让单片机复位很多板子的设计方案是通过CH340的DTR引脚产生一个下降沿脉冲经过一个100nF电容耦合到ATmega328P的RESET引脚。这样Arduino IDE点击上传时软件会自动控制DTR让单片机复位进入bootloader窗口电脑随后发送固件数据实现全程自动烧录。这就是为什么你在IDE里点一下Upload几乎什么事情都不用做程序就进去了。如果这个DTR信号没有接或者模块根本没有引出DTR引脚那单片机就不会自动复位。它还在那跑着旧的用户程序电脑发送的烧录数据自然没人接收avrdude上传工具就会报错。非DTR方案要解决的就是这个场景手动按一下复位键人为制造一个复位脉冲让bootloader窗口出现从而把程序烧进去。所以DTR和非DTR的差别本质是自动复位和手动复位的差别。2. 方案一DTR自动复位烧录接线接对了就真省心2.1 DTR自动复位的完整链路现在把整个自动烧录链路画一遍你就明白为什么DTR方案最常用。Arduino IDE点击Upload先编译然后通过CH340的虚拟串口打开COM口。打开串口这个动作会让DTR引脚产生一次电平变化。这条线通常通过一个104电容接到ATmega328P的RST引脚电容只允许边沿变化通过所以在RST引脚上产生一个短暂的低脉冲。ATmega328P检测到RST引脚的低脉冲内部复位开始运行bootloader。bootloader初始化串口监听外来的数据。与此同时电脑端的avrdude工具开始通过串口发送同步字符bootloader收到后握手成功avrdude将编译好的hex文件数据逐段发送过去bootloader把数据写入Flash。写入完成后程序指针跳转到用户程序单片机开始运行烧录结束。整个过程几秒钟你不需要碰任何按键。这里最容易被忽视的是那个104电容。如果直接把DTR和RST硬连接DTR的高电平或低电平会一直锁住复位引脚单片机可能反复复位甚至直接跑不起来。串一个104电容后静态电平无法通过只有跳变沿能触发复位相当于做了一个边沿触发器。这个设计在UNO、Nano这种板子上已经内置了你不需要管但如果你在面包板上搭建最小系统自己接DTR到RST时必须记得加一个100nF电容。2.2 DTR接线方案按板型不同分开看第一种场景你用的是自带CH340的UNO或者Nano兼容板。这种板子的CH340和单片机之间的DTR电容复位电路已经焊好了你只需要把USB线插上电脑装好驱动在IDE里选择对应端口和板卡然后点上传完全不需要额外接线。第二种场景你用单独的CH340 USB转TTL模块给Arduino Pro Mini烧录。Pro Mini板上本身带DTR引脚头而且板内已经设计了复位电路所以要做的接线是模块TXD接Pro Mini的RXI模块RXD接Pro Mini的TXO模块VCC接Pro Mini的VCCGND接GND模块DTR接Pro Mini的DTR。这里TXD和RXD必须交叉接原因很简单模块的发送脚必须连到单片机的接收脚模块的接收脚必须连到单片机的发送脚。如果接成同名对接谁都不收谁的数据烧录必然失败。第三种场景你用的是面包板上的最小系统ATmega328P裸芯片。这时你在芯片的RST引脚和CH340模块的DTR引脚之间需要自己串一个100nF无极性电容同时RST引脚接一个10kΩ上拉电阻到VCC。然后模块TXD接芯片Pin 2也就是PD0/RXD引脚模块RXD接芯片Pin 3也就是PD1/TXD引脚VCC和GND按芯片供电连接。注意芯片供电电压必须和模块逻辑电平匹配如果模块是5V芯片也必须是5V如果是3.3V系统模块也要选3.3V版本或者用逻辑电平转换。2.3 DTR方案里容易忽略的几个前提DTR方案虽然省事但也有前提。第一芯片里必须有bootloader。如果你买的是全新裸芯片里面什么都没有DTR自动复位只会让芯片跑进一个空状态电脑发什么它都不认。这种时候得先用别的方式烧录bootloader常见办法是用另一块Arduino当ISP或者用USBasp编程器。第二DTR信号不是所有USB转TTL模块都引出了。有些几块钱的模块只做了TXD、RXD、VCC、GND四个脚没有DTR那自动复位就无从谈起。我建议买模块时优先选带DTR和RTS引脚的这类模块通常会有两排插针一排是TXD、RXD、VCC、GND另一排是DTR、RTS、CTS。后者在后续玩ESP8266、ESP32时也用得上。第三Arduino IDE版本不同自动复位的时间点略有差异。在IDE 1.8.x时代上传时会有一个明显的“上传中”状态在IDE 2.x时代编译和上传的日志更详细但DTR控制逻辑基本一致。如果换IDE版本后出现了“能打开串口监视器但上传失败”的诡异情况先检查是不是驱动版本太老或者DTR接线松动。3. 方案二非DTR手动复位烧录没有自动复位就这么自己动手3.1 为什么非DTR方案依然重要很多人会觉得既然DTR自动方案这么好何必去折腾手动复位。但现实里非DTR方案的使用频率非常高。你手里可能是一个只引出TXD、RXD、VCC、GND四个引脚的便宜模块也可能是某个最小系统扩展板没有专门的复位输入还可能是芯片DTR引脚悬空、连线断了总之你必须在没有自动复位的情况下完成烧录。另一个典型场景是给ESP8266、ESP32这类模块烧录。虽然它们通常也有GPIO0和EN引脚做下载模式控制但如果你只用CH340模块的TXD、RXD给它们连串口同时得手动控制GPIO0接地再给EN一个低脉冲这也是手动方案的变体。所以理解非DTR方案的原理能让你在碰各种型号芯片时都不慌。非DTR方案的唯一差异就是复位的来源变成了你的手。烧录原理并没有变必须先让单片机进入bootloader的监听窗口再让avrdude把固件发过去。你手上要做的就是精确地在正确时间点按一下复位按钮。3.2 手动复位烧录的完整操作流程最稳妥的手动烧录流程是这样的。先把CH340模块和Arduino板子按TXD接RXD、RXD接TXD、GND接GND的方式接好需要供电就接VCC。接着在Arduino IDE中完成板卡和端口选择点击上传按钮。这时IDE先进入编译阶段编译时间取决于代码量可能几秒也可能几十秒。你要忍住不要在编译阶段就着急按复位。等IDE日志中出现类似“上传中”或者avrdude开始执行的提示立刻按一下板子上的复位按钮或者把复位引脚和GND短接一下然后松开。按下复位的瞬间单片机重启进入bootloader窗口。只要时机正确avrdude会在窗口期内完成握手并开始烧录。为什么特别强调等avrdude开始执行后再按复位因为复位后bootloader并不会无限等待它只在一小段时间窗口内监听串口数据。这个窗口通常只有一两秒Optiboot引导程序为了不影响用户程序启动速度等待窗口很短。如果你在编译阶段就按了复位等编译完成、avrdude开始发送数据时bootloader早就超时退出去运行旧程序了自然是烧录失败。3.3 手动复位烧录失败时怎么调整节奏如果第一次没掐准时间别急着怀疑硬件。常见情况是按下复位太早bootloader窗口过期。第二次试试等日志出现“正在上传”后再按或者反其道在上传日志滚动到一半、能看到一堆点号或者avrdude相关输出时再按。多试几次就能找到手感。还有一个技巧在Arduino IDE的设置里开启“显示详细上传日志”功能。打开之后你能看到avrdude的具体执行状态当画面出现avrdude: waiting for programmer这类提示时表示它在等待bootloader应答这时候按复位成功率非常高。我的经验是当上传日志打印到avrdude: Send: 0 [30]之后立刻按下去几乎百发百中。如果反复按复位都失败也别一直怀疑自己的手速。要检查被烧录芯片里是否真的有bootloader。判断办法很简单给板子重新上电看它能不能通过串口打出点什么或者看看能不能用串口监视器正常收发数据。如果芯片里连程序都没有bootloader也不存在那手动复位再怎么按也没有意义。4. 从零开始完整跑通驱动、IDE设置与两种方案的实操记录4.1 CH340驱动安装和Windows 11的那些坑CH340在Windows下的驱动安装是小白劝退重灾区。Windows 10早期版本经常要去设备管理器里手动指定驱动路径而Windows 11下还会遇到驱动签名或者旧版CH340芯片无法识别的问题。实际上WCH官方驱动的兼容性这几年已经好了很多最新版驱动可以直接在Windows 11上安装。安装时右键以管理员身份运行安装完成后插上设备再看设备管理器正常情况下会多出一个“COM和LPT”分类下面显示“CH340 Serial Port (COMx)”那个x就是你的串口号。有个很容易误解的地方很多Charmer写了“驱动预安装成功”但设备管理器里始终找不到CH340。这是因为预安装成功只是把驱动文件放进了系统真正生效要等USB设备插上。如果你插上设备后依然显示未知设备或者没有反应先换一根USB线试试。市场上不少USB线只能充电不能传数据就是那根既便宜又细的一根。烧录这种对通讯可靠性要求高的场景最好用一根质量可靠的品牌数据线这是无数人踩过的坑。Windows 11特别容易出现CH340驱动加载异常的情况。我的处理顺序是打开设备管理器找到带感叹号的设备右键选择更新驱动自动搜索驱动如果失败就去WCH官网下载最新版驱动重新安装再不行把设备的相应驱动删除拔掉USB线重启电脑重新插入设备并安装驱动。这套流程几乎能解决九成以上的驱动问题。4.2 Arduino IDE端口的正确选择和板卡设置驱动装好后打开Arduino IDE进入“工具”菜单看“端口”子菜单里有没有CH340对应的COM口。如果有多个COM口比如蓝牙串口也占了一个不知道怎么选就先把USB转TTL或Arduino板子的USB拔掉再看看端口列表里少了哪个剩下的那个就是你要选的。板卡选择同样不能随意。你用UNO板就选“Arduino Uno”用Pro Mini就选“Arduino Pro or Pro Mini”然后在处理器子选项里选对应型号常见是ATmega328P 5V 16MHz如果是自己搭的最小系统处理器是ATmega328P加16MHz晶振可以选“Arduino Duemilanove or Nano w/ ATmega328P”或者直接选Uno。端口和板卡选对烧录成功概率直接翻倍。4.3 DTR方案实操记录从连线到一键烧录我现在用一个CH340 USB转TTL模块给手头一块Arduino Pro Mini烧录程序完整过一遍DTR方案。Pro Mini板上排针标注有RXI、TXO、VCC、GND、DTR这几个关键引脚。我把CH340模块的TXD接到Pro Mini的RXIRXD接到TXOVCC接VCCGND接GNDDTR接到DTR。Pro Mini的DTR引脚内部已经接好100nF电容不需要额外加。接好后把CH340模块插入电脑USB口确认设备管理器出现COM口号。打开Arduino IDE写一个最简单的Blink程序板卡选Pro MiniSelector的Processor选择ATmega328P 5V 16MHz端口选CH340对应的COM口。点击上传按钮可以看到IDE先进行编译随后日志提示正在上传进度条走完右下角提示上传成功整个过程大概几秒钟手完全不用碰板子。如果Pro Mini采用的是Optiboot引导程序上传完成后程序会自动开始运行。4.4 非DTR方案实操记录没有DTR线的自救过程再来一遍非DTR方案。这次我特意找了一个只引出TXD、RXD、VCC、GND四个引脚的迷你CH340模块给一块同样的Pro Mini烧录。接线方式还是TXD接RXI、RXD接TXO、VCC接VCC、GND接GND不接DTR。点击上传后IDE会先编译。等日志里出现上传相关提示我按下Pro Mini板上的复位按键马上松开。第一次按的时候IDE日志里跳出一堆avrdude: stk500_recv(): programmer is not responding这说明我按慢了或者按早了bootloader窗口没跟avrdude对上。第二次我盯着日志当看到avrdude: Send: 0 [30]样式的输出时顺便按下复位日志里开始出现写入进度很快就提示上传成功。这里要注意一点非DTR方案中有些板子的复位引脚不是独立按键而是一个焊盘或者插针你需要用杜邦线把RST和GND短接一下再断开。短接时间不用太长低电平保持几个毫秒就足够触发复位短接太久也没有意义。手动复位的精髓就是制造一个下降沿让单片机重新启动进入bootloader窗口。5. 常见问题与排查技巧实录烧录报错别再盲目重试5.1 设备管理器里看不到CH340或者COM口时有时无这种情况九成是驱动和USB接触的问题。首先确认你把USB转TTL模块插上去后电脑有没有“叮咚”的设备插入音。如果完全没有反应换USB口换USB线再做一次驱动安装。COM口时有时无大概率是USB线内部线芯断断续续或者接触不良。不要在这种线上纠结直接换线。部分USB转TTL模块用的是三针或六针插针插杜邦线时比较容易松烧录过程中晃动一下模块COM口可能就消失了。解决办法是使用较短的杜邦线或者焊接排针后用热缩管固定保证物理接触稳定。偶尔还会遇到CH340模块和电脑USB3.0接口兼容性不佳的情况可以插到USB2.0接口试试不要小看这个细节很多人这样解决了问题。5.2 avrdude stk500_recv错误的最常见原因avrdude: stk500_recv(): programmer is not responding是Arduino烧录最常见、也最容易让人困惑的报错。它表面意思是“编程器没有响应”实际含义是avrdude工具无法和bootloader正常通信。结合我自己的经验这个报错按概率排最重要的几个原因如下一是没有选对端口或者板卡。选到一个不存在的端口或者选了波特率不对的板卡都会导致握手失败。二是TX和RX没有交叉连接。这是接线时最经典的失误TXD必须接RXDRXD必须接TXD。三是芯片复位时机不对这就是非DTR方案需要解决的核心问题。四是被烧录芯片没有bootloader。五是最小系统供电或者晶振不稳定导致芯片根本没跑起来。排查时建议按从上到下的顺序检查。我自己调试时先会打开串口监视器波特率设置为9600看能不能收到板子发来的内容。如果串口监视器可以收发数据说明基本链路没问题问题多半出在复位时序和bootloader上。如果串口监视器完全没反应那先从接线和供电开始查。5.3 DTR接上了但依然不复位问题出在哪很多人会遇到明明把DTR接到了复位引脚电容也加了点击上传却还是报错看起来像是DTR完全没起作用。这时你要先区分是“没复位”还是“复位了但bootloader不在”。判断方法依然是打开串口监视器观察板子重新上电后有没有打印信息。如果板子在手动按复位后能进入bootloader并正常烧录那就说明DTR路径本身出了问题。常见原因有三模块的DTR引脚根本不是你想象中的那根。有些CH340模块把DTR和RTS标为“DTR”“RTS”但物理位置靠近容易插错还有些模块的DTR默认电平方向和Arduino期待的相反。第二个原因是电容选得不对用了太大如10uF的电解电容边沿太慢可能触发不了复位。第三个原因是DTR到RST之间的杜邦线太长或者接触不良导致边沿被干扰。如果你用的是面包板测试试着换短一点的线。5.4 最小系统烧录时最容易踩的三个坑自己搭的ATmega328P最小系统虽然芯片和UNO是同一颗但烧录起来翻车概率高很多。第一个坑是晶振没起振。Arduino的bootloader以及大部分程序依赖外部16MHz晶振提供时钟如果晶振两脚接的22pF电容不对或者瓷片电容虚焊芯片可能无法正常运行。我遇到过看上去电路都接了但晶振不起振的情况解决办法是用示波器量没有示波器就干脆换一颗新晶振和一对新电容成本很低。第二个坑是复位引脚处理不当。饥饿的复位信号会导致芯片不断重启烧录时反复失败。最小系统上RST引脚要有10kΩ上拉电阻到VCC同时串一个0.1uF电容到地这种经典接法能提供稳定的复位条件。DTR接入位置也要注意应该接在复位电容和复位引脚之后不能用电容把外部复位信号一直拉低。第三个坑是供电不足。USB转TTL模块的5V输出通常只能提供较小电流如果你同时给最小系统、面包板上的LED、传感器供电电压可能跌到4.5V以下芯片工作不稳定。最简单的排查方法是手头备一个数字万用表烧录时量芯片VCC引脚电压。如果电压偏低就用独立5V电源供电把模块和芯片的GND连在一起共用参考地。6. 再深入一层104电容、自锁复位和更复杂的自动下载电路6.1 为什么DTR信号需要串一个104电容才能接RST这部分理解透了以后遇到任何支持串口下载的芯片你都能自己设计下载电路。CH340的DTR引脚输出的是电平信号不是边沿信号。如果直接把DTR接到RST当DTR为低电平时单片机一直被按住复位根本没法运行当DTR为高电平时又和RST引脚原有的电平冲突可能引发电平打架。串入100nF陶瓷电容的目的是把DTR的直流电平隔断只允许电平变化沿通过。平时DTR保持高电平电容两端都接近高电位不会产生电流当DTR突然拉低一瞬间电容另一端会被耦合出一个负脉冲也就是RST引脚短暂被拉低待电容充电完成后RST电压又恢复为上拉电平从而产生一个干净利落的复位脉冲。这个电容推荐用100nF也就是标注104的瓷片电容容量太大会让脉冲变宽变慢太小则可能没有足够能量触发复位。看到这里你也许会明白为什么有些芯片比如ESP32的自动下载电路比Arduino复杂。Arduino只需复位进入bootloader而ESP32还涉及GPIO0的电平控制所以ESP32下载电路里会同时使用DTR和RTS再配合三极管或者逻辑门实现“EN先拉低、GPIO0接地、EN再拉高”的时序。原理还是边沿和电平的组合明白了104电容的用法再看那些免按键下载电路就不会觉得陌生。6.2 用一块带DTR的CH340模块实现最小系统一体式下载如果你手头有带DTR引脚的CH340模块还有一个ATmega328P最小系统推荐直接把DTR通过104电容接到RST。这样你会得到一个体验几乎和UNO一样的最小系统。我常做的一个小实验是把ATmega328P、16MHz晶振、两个22pF电容、一个10kΩ电阻、一个100nF电容集成在一块面包板上再在面板旁边固定一个CH340模块做成一个迷你Arduino。接线时100nF电容一端接CH340的DTR另一端接ATmega328P的RST; ATmega328P的RST还要接10kΩ上拉电阻到VCC并通过一个小电容到地。通讯两端用TXD接RXD、RXD接TXD的方式连接。每次在IDE里点上传时复位脉冲由CH340自动产生不需要手动按键。这个方案非常稳定甚至可以长期用来给各种传感器实验提供Arduino烧录环境。实践下来有一点需要注意CH340模块的VCC选择5V引脚3.3V引脚别接芯片除非芯片供电是3.3V并且模块支持3.3V逻辑。另外面包板上的长跳线可能带来干扰建议每次烧录前先把容易松动的线重新压一遍。如果你经常做这类实验可以考虑单独买一块带DTR引脚的USB转TTL小板挑选时看准有DTR、RTS引脚并且支持5V和3.3V切换的型号。6.3 从Arduino扩展到其他芯片烧录的思路这套DTR和非DTR的逻辑同样适用于很多支持串口Bootloader的芯片。先举例STM32来说新款STM32芯片自带ROM Bootloader通过BOOT引脚选择启动模式进入串口下载再用ST的Flash Loader或者CubeProgrammer通过USART1发送固件这本质上也需要手动控制复位和BOOT引脚非DTR思路。像STM32F103C8T6这种蓝色板子一键下载电路里同样涉及DTR和RTS的组合控制原理和Arduino自动复位一脉相承。再比如ESP8266它需要GPIO0拉低进入烧录模式还需要EN引脚给出上电复位信号。很多开发板用CH340的DTR和RTS组合实现一键下载而如果你用非DTR手动方案就是先让GPIO0接地再短接EN或重新上电。这些芯片的下载拨动开关和按钮本质就是手动做复位和模式选择。所以学完Arduino的DTR方案不只是解决了眼前一块板子的问题而是掌握了一种串口下载的通用思维。凡是以后碰芯片都可以先问自己三个问题芯片有没有bootloader需不需要手动选模式复位怎么触发把这三个问题想清楚绝大多数串口烧录问题都不再是玄学。说句实在话我在玩单片机初期也被CH340和DTR折腾得够呛每次上传失败都会瞎换线、乱点按钮。后来把DTR电容复位的那套逻辑真正想明白后再看各种烧录报错就清晰了要么让单片机听复位要么让bootloader等着核心就这两件事。建议你手头常备几颗104电容、一根好用的USB数据线、一把杜邦线下次再遇到烧录失败先复刻一遍我上面说的接线方案基本上都能稳下来。进一步的话可以再做一个带一键下载的CH340下载板这个扩展过程本身也挺有意思。