尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

ESP32烧录报错No serial data received?Boot键与esptool排查全攻略

发布时间:2026/9/28 20:11:54

资讯中心
01
ARTICLE

ESP32烧录报错No serial data received?Boot键与esptool排查全攻略

ESP32烧录报错No serial data received?Boot键与esptool排查全攻略
ESP32烧录的时候最让人血压飙升的报错是什么我投“No serial data received”一票。Arduino IDE里点完上传日志区先刷一串“Connecting........_____.....”然后过几秒直接给你甩出一句“A fatal error occurred: Failed to connect to ESP32: No serial data received”。我第一次烧ESP32就撞上这玩意儿网上搜了半天答案一个比一个玄。后来搞明白了这个报错九成九和代码没关系就是芯片压根没进入下载模式或者串口这条物理链路根本没打通。今天我就把Boot键的正确用法、手动下载模式、esptool验证方法以及我踩过的坑一次讲清楚尤其适合刚拿到开发板、第一次烧录就失败的读者。1. 先把“No serial data received”这个报错看懂1.1 烧录时电脑和ESP32到底在做什么很多人一看到报错就慌觉得是板子坏了其实不是。要解决这个问题得先搞懂烧录这件事的本质是什么。Arduino IDE、PlatformIO这类工具点“上传”按钮后真正在干活的其实是一个叫esptool的命令行工具。它会先打开你选中的串口COM口然后通过串口向ESP32发送一段同步握手数据等待芯片回应。ESP32如果正处于下载模式就会正确回应这些数据esptool接着把编译好的固件擦除、写入Flash完成烧录。这个过程有点像你去火车站接人你先在出站口等着打开串口然后给对方发消息说“我到了你在哪”发送同步信号对方如果也到了就会回你一句“我也到了这就出来”回应握手。如果对方压根没收到消息或者人还在高铁上手机没信号你发再多消息都收不到回复。电脑这边也是一样esptool发了一堆同步请求但ESP32一个字节都没回最后只能报“No serial data received”。这里有个关键点esptool走的是UART0也就是ESP32的串口0对应GPIO1TXD0和GPIO3RXD0。开发板上那个USB口之所以能烧录是因为板上有一颗USB转串口芯片常见的是CH340、CP2102、FTDI等把USB信号转换成了UART0的串口信号。所以“串口没数据”的意思就是esptool和ESP32之间的UART0链路没有建立有效通信。1.2 为什么“没收到串口数据”就失败既然根因是“芯片不回话”那进一步就得问芯片为什么不回话最常见的情况是芯片根本没有进入下载模式。ESP32上电复位的瞬间会检测一个关键引脚的电平——GPIO0。如果GPIO0是低电平芯片进入下载模式等待外部工具通过串口发指令如果GPIO0是高电平芯片正常启动去Flash里找固件运行。也就是说ESPressif的芯片不是任何时候都听你指挥的它只在“下载模式”下才理会esptool的同步请求。很多人第一次烧录时直接把开发板用USB线插电脑上点上传然后眼睁睁看着它报错。原因很简单开发板正常上电后跑的是普通启动模式GPIO0默认被板载上拉电阻拉高芯片在跑程序或在等启动根本不会响应esptool的同步指令。这就像对方手机开着但他没在看消息你发再多“收到请回复”都没用。另外还有一种情况即使芯片已经进入了下载模式但串口链路本身有问题比如RX/TX接反、USB线只供电不传数据、串口被其他软件占用、选错了COM口等同样会导致“No serial data received”。所以排查这个报错要分两层看一层是芯片有没有进下载模式另一层是串口通不通。下面我按从简单到复杂的顺序把排查流程完整走一遍。2. 基础排查接线、驱动和串口占用先把地基打牢2.1 确认USB转串口芯片和驱动排查这个报错第一步不是去按Boot键而是先确认电脑到底有没有识别到板子的串口。Windows下打开设备管理器展开“端口COM和LPT”如果板子插上后能看到一个类似“USB-SERIAL CH340 (COM3)”或者“CP2102 USB to UART Bridge Controller (COM4)”的条目说明驱动没问题。如果设备管理器里显示的是黄色感叹号或者直接就是个“未知设备”那是驱动没装好。CH340的驱动需要去官网下载CP2102一般Windows 10/11能自动识别但遇到不便时也别嫌麻烦手动装一次驱动基本能解决。macOS下用ls /dev/cu.*查看一般能看到/dev/cu.usbserial-xxx或者/dev/cu.SLAB_USBtoUARTLinux下通常是/dev/ttyUSB0或/dev/ttyACM0。如果你插上板子后这些设备一个都没出现先别折腾Boot键大概率是USB线的问题——很多配着开发板一起卖的USB线实际上只有电源线没有数据线充电能用传数据就是不通。这种线是“No serial data received”的头号帮凶多备几根好线能省下大量时间。确认了设备存在再把Arduino IDE里“工具 端口”选成对应的COM口“工具 开发板”选成正确的ESP32型号。选错端口或者开发板不对也会出现各种古怪报错。这个基础项不检查清楚后面所有操作都是空中楼阁。2.2 外部USB转TTL怎么接线如果你是直接用开发板上的USB口烧录这一步可以跳过。但如果你用的是裸模组或者你的板子没有板载USB转串口芯片需要外接一个USB转TTL模块时接线就非常容易翻车。正确的接法是这样的USB转TTL的TXD - ESP32的RXD0GPIO3USB转TTL的RXD - ESP32的TXD0GPIO1USB转TTL的GND - ESP32的GNDUSB转TTL的3.3V - ESP32的3V3ESP32的IO0 - 接一个轻触开关到GND或者直接先接到GNDESP32的EN - 通过10kΩ电阻上拉到3.3V这里最容易错的是TX和RX。串口通信要求“交叉连接”发送端接接收端接收端接发送端。很多人下意识接了“同名”引脚导致两个设备都在发、没人听自然收不到数据。ASCII码脑补一下A说话B要拿耳朵听A的嘴得对着B的耳朵而不是对着A自己的耳朵。USB转TTL模块的TXD就是嘴ESP32的RXD0就是耳朵两者要连在一起。反过来同理ESP32的TXD0要和USB转TTL的RXD相连。如果你发现自己接成了TXD接TXD、RXD接RXD立刻改过来这个问题能解决一大半。另外用外部供电时要注意电流。ESP32在WiFi开启的瞬间电流可以冲到几百毫安很多廉价的USB转TTL模块上的3.3V输出能力根本不够会导致板子复位、握手失败。排查阶段我建议直接用USB转TTL的5V输出接到开发板的5V/VIN引脚或者干脆用一根单独的数据线供电让USB转TTL模块只负责串口收发这样能少踩很多供电的坑。2.3 串口被占用一个容易被忽略的坑还有一个特别常见、但排查时很容易忽略的问题是串口被其他软件占用了。Arduino IDE本身有个“串口监视器”如果你开着串口监视器再点上传Arduino IDE一般会自动断开串口这倒是没事。但如果你用的是第三方串口助手、Plotter、或者其他上位机软件打开了同一个COM口再点上传esptool就打不开这个串口了。此时报错往往不是“No serial data received”而是类似“Serial port COM3 is already in use”或者“Failed to open serial port”。不管报什么思路是一致的把占用串口的软件全部关掉只留一个烧录工具。我见过不少新手犯这个错一边开着串口监视器看打印日志一边点上传发现报错后原地蒙圈。这个习惯一定要改过来——烧录前先关掉所有可能占用串口的程序再点上传。否则哪怕你按Boot键按出火花来该失败还是失败。3. Boot键正确用法手动把ESP32拽进下载模式3.1 下载模式的原理GPIO0和EN的一次握手现在进入正题Boot键到底怎么用为什么有人说烧录时要按Boot有人说不用这要从ESP32的启动流程说起。芯片上电或者按下EN键复位时会立刻采样GPIO0的电平状态。如果此时GPIO0为低电平芯片进入“下载模式”Download mode也就是UART烧录模式如果GPIO0是高电平芯片走正常启动流程从Flash里读取固件并运行。开发板上那个写着“BOOT”或“IO0”的按键本质就是一颗把GPIO0接到GND的轻触开关。按下去GPIO0被拉低松手GPIO0恢复高电平因为板子上通常有上拉电阻。所以“按住BOOT再上电/复位”的意思就是告诉芯片“你别跑正常程序了先停下来等我刷固件。”这里最核心的动作是“在GPIO0为低的时候让芯片复位一次”。很多人只按住BOOT然后直接点上传却忘了让芯片复位这时候芯片已经在上电时完成了启动判断GPIO0后面再怎么拉低都没用。正确的手动下载流程一定要包含“复位”这个动作按住BOOT - 按一下EN - 松开EN - 保持按住BOOT - 等电脑端开始握手 - 再松开BOOT。整个过程简单说就是先告诉芯片“我要进下载模式”按住BOOT再让它重新做决定按EN复位它复位时发现GPIO0是低电平于是进入了下载模式然后才开始回应esptool的同步请求。3.2 手动下载模式的完整操作步骤如果你是第一次手动烧录我建议你严格按照下面这套步骤来熟练了之后自然会形成肌肉记忆。先在Arduino IDE或esptool里设置好端口和开发板类型准备好待烧录的程序但先不要点上传。用一只手按住开发板上的BOOT键不放。这个键通常标着“BOOT”“IO0”或“Download”位置一般在板子边缘。另一只手快速按一下EN键也叫RST、RESET键。按完EN后松开EN但BOOT键继续保持按住。此时芯片已经在GPIO0为低电平的情况下完成复位进入下载模式。现在点击IDE里的“上传”按钮或者运行esptool烧录命令。留意日志区当屏幕上出现一串“Connecting........_____.....”时就说明esptool正在向芯片发送同步信号。看到日志开始出现“Chip is ESP32-D0WDQ6 (revision v1.0)”之类的字样时说明握手成功这时候可以松开BOOT键了。后续的擦除Flash、写入固件流程不再依赖GPIO0状态松手不会影响烧录。等待进度条走到100%出现“Hash of data verified”和“Hard resetting via RTS pin...”日志后烧录完成。此时按一下EN复位芯片程序就会正常启动运行。很多教程说“看到Connecting后立刻松开BOOT”为什么不是全程按着因为下载模式下只要芯片进入了bootloaderGPIO0的电平就不影响后续通信了。全程按着也不会刷坏板子但万一你刷完了忘记松手下次上电又会进入下载模式导致程序不运行容易产生“烧录成功但没反应”的误会。所以养成好习惯握手成功就松手。还有一点要提醒如果你的板子上没有EN键只有BOOT键怎么办那就在按住BOOT的同时把USB线拔掉再插上用“重新上电”代替“按EN复位”。或者用跳线瞬间短接EN引脚到GND也能实现复位。3.3 自动下载电路为什么有的板子不用按Boot用惯了NodeMCU-32S、官方DevKitC这些开发板的人可能会疑惑我烧录从来没按过Boot键不是也能成功吗原因在于这些开发板上有“自动下载电路”。板载的USB转串口芯片除了TXD/RXD还引出了DTR和RTS两个流控信号。这两个信号经过三极管、二极管等元器件会被连接到一个关键控制逻辑上一个控制EN一个控制GPIO0。点击上传时esptool先通过DTR/RTS的组合把GPIO0拉低然后给EN一个复位脉冲等芯片启动后完成一次“自动按BOOT 自动复位”的操作。整个过程全部由软件控制所以你的手完全不用碰板子看起来就像“插上USB直接烧录”。但是并不是所有板子都有这套电路。一些国产精简板、面包板自组模块、最小系统板USB转串口芯片可能没有引出DTR/RTS或者干脆省略了自动下载电路。这种情况下你必须老老实实用手动Boot键方式。如果你发现某块板子插上USB后怎么点上传都是“No serial data received”先别急着怀疑板子坏了去查一下它的原理图看看到底有没有自动下载电路。判断方法很简单看板子上有没有标注DTR和RTS的排针或者看原理图里USB转串口芯片的DTR/RTS脚是否接了东西。如果没有那你就是在跟一个没装自动下载电路的板子死磕手动进下载模式才是正解。4. 实操全流程Arduino IDE和esptool双管齐下4.1 Arduino IDE里的关键配置Arduino IDE烧录ESP32除了装好ESP32开发板包有几项配置会直接影响烧录成功率。首先是“工具 开发板”。不同开发板对应不同的Flash大小、PSRAM、分区表。比如经典的ESP32 Dev Module和NodeMCU-32S虽然都是ESP32但Flash Size可能需要手动改成4MB或16MB。选错Flash大小有时候能烧进去但程序运行后反复崩溃有时候则直接烧录失败。所以拿到板子先看清楚芯片型号和Flash容量再在IDE里对应选择。其次是“Upload Speed”上传速度。默认可能是921600甚至更高的波特率。如果你的USB线质量一般、线缆太长、或者周围电磁干扰比较大可以把它降到115200。虽然慢一点但稳定得多。我遇到过在921600下反复“No serial data received”降到115200后一次成功的案例。这不算稀奇串口通信就像两个人在嘈杂环境里喊话喊快了容易听不清放慢语速反而容易沟通。再就是端口。上传前确认“工具 端口”选中的是你那块板子的COM口别选成鼠标键盘的COM口。很多开发板不止一个串口特别是ESP32-S3这类带原生USB的芯片可能会虚拟出两个串口选错一个也是白搭。最后如果你之前打开过串口监视器记得先关掉。Arduino IDE新版本在上传时会自动关闭串口监视器但如果你用的是第三方工具一定要手动关。4.2 esptool命令行烧录与验证Arduino IDE封装了底层工具但有时候你需要更直接的验证手段。这时候可以用esptool命令行。esptool是乐鑫官方提供的烧录工具Python写的安装很简单pip install esptool装好后先做一次最简单的通信测试验证串口链路和下载模式是否正常esptool.py --port COM3 chip_id如果你用的是Windows端口就是COM3、COM4之类的macOS或Linux则使用类似/dev/cu.usbserial-xxx或/dev/ttyUSB0的路径。执行这条命令时如果板子有自动下载电路esptool会自动控制复位进入下载模式如果是不支持自动下载的板子就需要先手动按住BOOT并复位让板子停在下载模式再执行命令。命令如果成功会输出类似这样的内容Detecting chip type... ESP32 Chip is ESP32-D0WDQ6 (revision v1.0) Features: WiFi, BT, Dual Core, 240MHz MAC: 24:6F:28:XX:XX:XX Uploading stub... Running stub... Stub running... Chip ID: 0xXXXXXXXX看到Chip ID就说明握手成功芯片已经进入了下载模式。反过来如果这步就报“No serial data received”说明你在AT命令层就已经失败更不用谈后续烧录。还有一个好用的参数--before no_reset适合那些自动下载电路失效、但你已经手动让板子进入下载模式的情况。比如你先手动按住BOOT复位然后执行esptool.py --port COM3 --before no_reset chip_idesptool就不会再尝试自动复位而是直接和当前处于下载模式的芯片通信。如果你确认板子已经在下载模式但普通命令仍然失败用这个参数往往能绕过复位时序问题非常实用。擦除Flash也是排查问题的高频操作esptool.py --port COM3 erase_flash这个命令会把整个Flash清空适合板子处于半砖状态、怎么也启不动时用来恢复。擦除之后再重新烧录你需要的固件。如果你要手动往指定地址写固件可以这样esptool.py --port COM3 write_flash 0x1000 bootloader.bin但注意ESP32的烧录地址不是随便填的bootloader通常写在0x1000、分区表在0x8000、Boot辅助数据在0xe000、应用程序在0x10000。手动烧录时地址写错会导致启动失败。对大多数普通用户而言直接用Arduino IDE或PlatformIO自动生成的烧录参数更省心esptool的主要价值在于“验证通信”和“擦除/恢复”。4.3 看懂烧录日志对症下药烧录失败的时候日志就是最好的诊断依据。我建议你养成一个习惯每次点上传先把日志从头到尾看一遍而不是只盯着最后那行红色报错。正常烧录流程的日志大致是这样Connecting........_____....._____....._____....._____....._____....._____....._____....._____..... Chip is ESP32-D0WDQ6 (revision v1.0) MAC: 24:6F:28:XX:XX:XX Uploading stub... Running stub... Stub running... Changing baud rate to 921600 Configuring flash size... Flash will be erased from 0x00001000 to 0x00005fff... Compressed 19136 bytes to 12236... Writing at 0x00001000... (100 %) ... Hash of data verified. Leaving... Hard resetting via RTS pin...如果你看到的是这样一长串“Connecting........_____.....”刷了十几秒然后直接失败那说明esptool一直在发同步信号但芯片完全不回应。这时候别犹豫立刻切到手动下载模式按住BOOT按一下EN保持BOOT按住再点上传。多数情况下手动模式一出手日志就能从“Connecting”走向“Chip is ESP32-D0WDQ6...”后面就是一片坦途。如果日志里出现了“Chip is ESP32-D0WDQ6”但又卡在“Uploading stub...”或“Writing at 0x...”阶段那就不是进入下载模式的问题了而是通信过程中途断线。原因大多是供电不稳、USB线接触不良、波特率太高、或者线缆太长。对策依次是换一条短而粗的USB线、降低Upload Speed、给板子单独供电、检查杜邦线是否松动。日志里的关键节点其实就几个出现Chip is ESP32表示握手成功出现Hard resetting via RTS pin表示烧录完成且板子自动复位而Hash of data verified则说明数据校验通过固件写入没有损坏。把这些节点记住以后再遇到烧录问题扫一眼日志就知道卡在哪一步了。5. 高频问题速查表与避坑经验5.1 高频问题速查表这些年帮别人排查烧录问题我发现绝大多数“No serial data received”逃不出下面这几类原因。整理成表方便你对照排查。现象大概率原因解决办法一直刷Connecting...然后报No serial data received芯片没进入下载模式手动按住BOOT再按EN复位保持BOOT直到握手成功能看到启动日志但上传失败芯片在正常启动模式不在下载模式进入下载模式后再上传串口监视器开着时上传报错串口被占用关闭串口监视器和其他占用串口的软件设备管理器里根本没有COM口USB线只供电不传数据 / 驱动缺失换一根好的USB数据线装对应驱动前期握手成功写到中途失败供电不足 / 线材接触不良 / 波特率过高换线、降波特率到115200、单独供电每次烧录都要手动按Boot自动下载失效板子没有自动下载电路或DTR/RTS电路故障直接用手动下载模式或检查原理图烧录成功但程序不运行启动时GPIO0被拉低比如还按着BOOT松开BOOT按EN复位检查GPIO0外接设备报错Serial port already in useCOM口被其他程序占用关掉占用串口的程序重新插拔板子这张表不能覆盖所有情况但能覆盖九成。剩下的零头大多和硬件损坏、特殊芯片配置有关需要具体问题具体看。5.2 几个我踩过、希望你绕开的坑第一个坑劣质USB线。我大概有三分之一的不稳定烧录问题最后都栽在USB线上。很多线外观完好插上电脑也能充电但就是没有数据线芯或者线芯极细导致信号衰减严重。判断方法很简单插上板子后看设备管理器里有没有出现COM口。如果怎么插都没反应别怀疑人生先换根线再说。我现在手边至少备三根质量靠谱的数据线就是当年被坑出来的习惯。第二个坑烧录时串口监视器没关。Arduino IDE在这个版本里会自动断开串口监视器但一些第三方串口助手不会它们会把串口死死占住。我见过有人开着一个串口调试软件然后问为什么“No serial data received”其实esptool根本没拿到串口权限。遇到这种情况把后台工具全关了再重试。第三个坑GPIO0被外部设备拉低。有些外设模块会占用GPIO0比如某些传感器、LED、按键电路。如果GPIO0在启动时被外部设备强制拉低板子就会一直进入下载模式表现为“烧录成功的固件上电却不运行”。这时候即使你烧录了正常程序拔掉BOOT也没用因为GPIO0被别的东西按住了。检查一下你的GPIO0外部电路能省掉大量排查时间。第四个坑烧录过程中手贱按EN。很多人因为不放心烧录时总想按一下EN看看情况结果在写Flash的半途复位了芯片导致写入中断。这种操作轻则烧录失败重则留下一个不完整的固件需要重新擦除再刷。烧录过程中手离开板子让它安静地写完这是最基本的尊重。第五个坑用面包板和外部串口模块时供电不足。USB转TTL模块上那个3.3V带一个ESP32全速跑WiFi是带不动的。一旦握手成功开始擦写Flash芯片功耗上升电压跌落通信立刻中断。排查时单独给板子供电或者用5V接VIN引脚别指望从串口模块的3.3V取电。5.3 其他ESP32芯片和模组的注意点标题虽然说的是ESP32但你现在买的板子很可能是ESP32-S3、ESP32-C3甚至是ESP32-C6。这些芯片的下载模式原理类似但细节有差异。经典ESP32和ESP32-S3下载模式由GPIO0控制跟前面讲的完全一致。但ESP32-C3和ESP32-C6是个例外它们的BOOT引脚通常不在GPIO0上而是IO9。也就是说如果你拿一块ESP32-C3开发板按着标着“BOOT”的按键实际上是通过IO9来控制进入下载模式。所以在操作前最好看一眼板子的丝印或者原理图确认BOOT键接的是哪个引脚不要想当然地以为所有板子上的BOOT都控制GPIO0。另外很多ESP32-S3开发板带原生USB接口可以直接用USB CDC方式烧录不需要走UART0。这种模式下省掉了USB转串口芯片但电脑上会出现像/dev/ttyACM0这样的端口。如果选择错误同样会触发类似“No serial data received”的报错排查思路依然是先确认端口再确认芯片是否进入了下载模式。还有一类是裸模组比如ESP32-WROOM-32模组没有板载USB转串口也没有BOOT/EN按键。这种模组需要自己接USB转TTL并把IO0、EN的复位电路搭好。手动进入下载模式的方法是用杜邦线把IO0接到GND然后给EN一下低电平复位再开始烧录。相比之下开发板已经把这些电路都集成好了新手阶段用开发板能省掉大量麻烦。5.4 烧录前我只做这三件事最后分享一个我自己养成的操作习惯不算什么高深技巧但真的能少走弯路。第一件先开串口监视器看一眼。把串口监视器波特率调到115200按一下EN键如果能看到启动日志说明串口通路、USB线、供电都是正常的。如果连日志都看不到说明物理链路就有问题这时候去折腾烧录就是浪费感情。第二件确认没有问题后关闭串口监视器再点上传。上传时如果出现Connecting后迟迟没有回应我就直接启用手动下载模式按住BOOT按一下EN保持BOOT按住直到日志出现Chip is ESP32再松手。这个动作多练几次就会形成条件反射比查任何资料都快。第三件烧录完成、日志显示Hard resetting之后我会再按一次EN让板子彻底重新上电。很多程序烧完不自动跑不是固件的问题而是复位时序的小差异。手动按一下EN板子走一遍正常启动流程问题往往就没了。这套操作流程看起来很基础但每一步都在验证一个关键点串口通不通、芯片进没进下载模式、固件有没有写全。把这些基础环节管住了“No serial data received”这个报错基本不会再有机会出现在你的屏幕上。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。