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

手机烧录ESP32:Termux+Debian+esptool实战指南

发布时间:2026/9/29 19:43:11

资讯中心
01
ARTICLE

手机烧录ESP32:Termux+Debian+esptool实战指南

手机烧录ESP32:Termux+Debian+esptool实战指南
以前出门带着笔记本十次有八次不是为了写代码而是为了给现场的设备烧固件。ESP32这东西调试期改动频繁电脑不在手边就只能干瞪眼。直到我把手机上的Termux配上Debian环境再通过OTG线直连ESP32开发板用esptool完成烧录之后我才确认一个事在手机上做嵌入式开发调试并不是什么噱头而是真的能落地的工作流。这篇文章就是想把整套方法分享出来。你可能会问手机烧录ESP32跟常规的电脑烧录有什么本质区别区别在于整套链路从“USB转串口驱动”到“烧录工具运行环境”全都跑在手机里而ESP32开发板只是通过OTG线挂在手机上。换句话说手机既是电脑也是烧录器。整套方案适合已经玩过ESP32、能看懂基本命令行操作、并且偶尔需要在没有电脑的环境下救急或调试的开发者。即使你目前还不太懂Linux的权限体系我也会把每一步的前置条件和坑都摆出来照着做基本能成。1. 项目思路与方案选型1.1 为什么非要用手机烧录先说一个很现实的场景设备在弱电井、在温室大棚、在朋友公司的机柜里你带了一台ESP32去现场替换或升级固件结果发现笔记本忘在办公室了。这时候掏出手机只要具备两个条件——一个支持OTG的Type-C口或者Micro USB口加转接头一台已经配置好环境的手机——就能直接把固件写进去。你可能觉得这个场景太小众。实际上我遇到最多的是两类人一类是做物联网项目现场实施的技术人员他们包里随时有几块ESP32开发板平时却只带手机和平板另一类是学生党在实验室或宿舍里没有固定电脑但手机不离手。对他们来说“手机能烧录”不是炫技而是实打实解决设备周转问题。更深一层的原因是Termux里跑Debian之后你不仅能烧录还能顺手写MicroPython脚本、编ESPHome固件、SSH登录服务器把手机变成一个随身开发终端整套环境是通用的。1.2 技术路线对比GUI软件、Web Serial、终端直连在动手之前我建议你先了解市面上已有的几条手机烧录路线这样才能明白为什么我最终选择Termux加Debian加esptool。第一条路线是Android图形化工具。比如网上常见的“ESP32 Flash Tool”安卓版界面简单适合零基础用户但它的问题也很明显芯片支持不全自定义分区表偏移量的能力弱而且很多工具已经很久没更新对比较新的ESP32-S3、ESP32-C3支持不完整。第二条路线是Web Serial。手机浏览器配合支持WebUSB/WebSerial的浏览器确实能直接烧录但浏览器API对串口芯片和Android内核的要求很挑剔实测在Chrome上偶尔会断连而且你依然需要一个能生成固件包的电脑环境。第三条路线就是本文要说的终端直连在Termux里装Debian然后在Debian里跑官方esptool。三条路线对比下来终端直连的优势是它和电脑端烧录几乎完全一致所有命令、参数、脚本都能复用不会出现“图形工具能烧但命令行工具不能烧”的偏差。它的劣势是需要一定的命令行基础而且在使用proot方式运行Debian时串口设备的权限处理比电脑上要麻烦一些。但考虑到esptool是ESP32官方工具它支持的芯片型号和烧录模式最全出现问题也更容易在官方issue里搜到答案所以这条路线长期来看最靠谱。1.3 这个方案的前置条件先别急着动手我先把丑话说在前面。网上很多教程会告诉你“Termux装Debian之后直接就能烧录”但实际并不是这么简单。你可能会刷到一些视频手机OTG插上ESP32然后Termux里直接ls /dev/ttyUSB0就有设备。我只能说这通常是在已root的手机上或者手机内核和SELinux配置都相对宽松的情况下才能做到。我把前置条件列成一张清单你对照一下条件说明是否必须手机支持OTG看手机参数或插上设备后是否有提示必须手机已ROOT普通Android应用无法直接访问/dev/ttyUSB0需要真root提升权限或调整设备节点权限强烈建议内核包含串口芯片驱动CP210x、CH340、FTDI等驱动需编入内核或可加载必须数据线而非充电线很多USB线只能充电不能传数据会把你坑哭必须固件文件准备至少准备好待烧录的bin文件必须如果你看到这里发现自己手机没有root也不用急着关掉文章。我在最后一章会给出无root用户也能用的替代路线。不过主流程我会围绕root手机来写因为那才是能实现“一键直连烧录”的最稳定形态。2. 环境搭建手机里的Debian2.1 Termux 基础配置与源替换Termux本身就是Android上的Linux终端模拟器它不像那些图形化的“手机Linux”应用那么花哨但能力很强可以直接通过apt安装大量软件包。首先你要安装Termux我建议去F-Droid或者GitHub Releases下载最新版本不要用Google Play商店里的旧版本因为Play版更新滞后有些包会装不上。安装完Termux后第一件事是更新包管理器和升级基础软件包终端里执行pkg update pkg upgrade这一步可能会比较慢因为默认软件源在国外。国内用户建议先换成清华源。Termux的源配置在$PREFIX/etc/apt/sources.list你直接编辑这个文件把下载地址前缀改成清华镜像即可。以当前Termux的源格式为例通常是https://packages.termux.dev/apt/termux-main对应清华源是https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main。改完之后再次执行pkg update确认源生效。这里有个小细节不要直接删掉原文件重写先用cp备份一份万一镜像同步延迟导致某些包版本不一致你还能秒切回官方源。2.2 用 proot-distro 装 DebianTermux里跑Debian的常见方式有两种chroot和proot。chroot需要root权限且要手动去下载Debian的rootfs压缩包配置比较繁琐相比之下proot-distro是Termux社区维护的工具它利用proot技术模拟一个Linux用户空间不需要root也能启动Debian安装和维护都简单很多。虽然proot方式在性能上有损耗但烧录ESP32这种操作主要是串口I/O不是CPU密集型计算proot的性能完全够用。真正影响串口访问的是宿主机Android对设备节点的权限这一点我们下一章专门说现在先专注环境安装。安装proot-distro只要一行命令pkg install proot-distro装完之后安装Debian并登录proot-distro install debian proot-distro login debian第一次登录后你会看到shell提示符变成类似rootlocalhost的样子这时你已经处在Debian 12bookworm的用户空间里了。先做基础更新apt update apt upgrade -y如果你在apt update时遇到GPG签名或者源连接问题通常是网络原因或者镜像源没配好。Debian的软件源配置文件是/etc/apt/sources.list和/etc/apt/sources.list.d/下的文件同样可以换成国内镜像这个和正常Debian服务器操作完全一致网上资料很多这里不再展开。2.3 在 Debian 里装好必要工具进入Debian之后我们先把烧录会用到的工具装上。需要的有Python 3esptool是基于Python的、pip、usbutils用来查看USB设备和vim或nano编辑脚本用。apt install python3 python3-pip usbutils vim -y安装esptool时有坑。Debian 12的Python默认开启了PEP 668保护直接用pip3 install esptool会报错提示externally-managed-environment。这时候有两种选择一是用虚拟环境我个人更推荐二是加--break-system-packages参数强制安装省事但有污染系统Python环境的隐患。我想大多数人图省事直接用了第二种但我的建议是先建个虚拟环境哪怕每次用之前激活一下也无所谓cd ~ python3 -m venv esptool-env source esptool-env/bin/activate pip3 install esptool虚拟环境的好处是以后如果你在Debian里还要装其他Python工具比如platformio或者esphome不会出现依赖冲突。如果你实在不想每次激活环境可以在.bashrc里加一行source ~/esptool-env/bin/activate登录Debian时自动激活。装完验证一下esptool.py version能输出esptool版本号说明环境就绪了。接下来要解决的是让Debian“看见”ESP32。3. OTG直连让手机“看见”ESP323.1 硬件准备与接线避坑手机直连ESP32硬件上就是一条OTG链路。简单来说手机发出的USB信号通过OTG转接头到达ESP32开发板上的USB转串口芯片再转换成UART信号给到ESP32芯片。所以关键点就在两个地方一是OTG转接头和数据线必须支持数据传输二是开发板上的USB转串口芯片能被手机内核识别。没有OTG转接头直接买一根Type-C转USB-A母口的转接头几块钱到十几块钱不等。有些手机是Micro USB接口就买Micro USB转USB-A母口。注意那些只能给手机充电的转接头比如带有充电协议芯片的可能不允许做数据传输所以买的时候要认准“支持OTG数据传输”。数据线方面真的得单独提醒。我踩过不止一次坑随手抓一根线插上去手机没反应换了一根线立刻就好了。判断方法是把线插到电脑上看电脑能不能识别出USB设备。识别不出多半是纯充电线。接线本身不复杂但供电问题容易被忽略。某些ESP32开发板在WiFi开启时电流需求会突然飙升手机OTG口能提供的电流通常在200mA到500mA之间如果同时给开发板供电很容易出现电压跌落导致烧录中途复位。我的经验是如果开发板是单独供电的比如插着充电宝或者USB电源那就把GND和手机侧的GND连起来确保共地否则串口电平参考电位不一致通信会不稳定。如果开发板只能靠OTG供电建议使用带外部供电的USB HUB或者干脆给手机充电宝也插上。3.2 识别串口设备与驱动排查插入ESP32之后在Termux里先看看USB层面有没有识别到设备。执行lsusb正常情况下能看到类似ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge或者ID 1a86:7523 QinHeng Electronics CH340 serial converter的输出这对应CP2102和CH340芯片。如果有这一行说明手机USB控制器已经检测到设备接下来就看内核中有没有对应的串口驱动。设备节点一般在/dev/ttyUSB0或者/dev/ttyACM0。在Termux里先试ls /dev/ttyUSB* /dev/ttyACM*如果看不到任何输出大概率是内核缺少相应的驱动。这里就要用到root权限了在Termux里执行su切换到root然后尝试加载模块su modprobe cp210x modprobe ch341如果手机内核把串口驱动编成了模块modprobe一下设备节点就会立刻出现但很遗憾大多数手机内核并没有把这类驱动编进去。这时候有两个方向一是刷第三方内核比如LineageOS或某些内核项目会包含USB串口驱动二是自己编译内核时选上驱动并把选项编译成模块或者直接编译进内核。对于不想折腾的用户我建议直接买一个支持USB串口功能的USB HUB或转换器比如有些工业级USB转串口模块用的是FTDI芯片FTDI驱动在Linux内核中默认支持的范围更广而且很多Android内核也带了ftdi_sio驱动。3.3 权限设置最常见的拦路虎当你终于看到/dev/ttyUSB0出现时离成功只差一步权限。大多数Android系统的/dev由SELinux严格管控即使你手机已经rootTermux里的进程如果没有对应的SELinux允许规则也无法直接打开这个设备节点。我的做法是先把SELinux设为宽容模式su setenforce 0然后修改设备节点权限chmod 666 /dev/ttyUSB0这样所有用户都能读写串口。如果你不想关闭SELinux也可以尝试用chcon修改设备节点的SELinux标签但在不同ROM上规则差异很大可复现性差我实战中还是觉得setenforce 0最直接。需要注意setenforce 0在重启手机后会失效所以每次烧录前可能都要设置一次这一点我会在最后的脚本里一并处理。在proot的Debian环境下设备节点能不能看见取决于proot-distro启动时是否绑定了宿主机的/dev目录。通常proot-distro会默认把/dev映射进来所以在Debian里执行ls -l /dev/ttyUSB0一般能看到这个节点。如果看不到可以在proot启动时额外绑定目录命令是proot-distro login debian --bind /dev:/dev实际验证下来大多数情况下默认参数就已经绑定了/dev不需要额外处理。为了保险起见在烧录脚本里加一个判断如果设备节点不存在就提示检查宿主机驱动和权限。4. 一键烧录esptool实战与脚本化4.1 安装 esptool 与芯片自检现在环境已经具备了。先激活虚拟环境然后做一个最基本的芯片自检确保esptool能通过串口和ESP32正常通信source ~/esptool-env/bin/activate esptool.py --port /dev/ttyUSB0 --baud 115200 chip_idchip_id命令会读取ESP32的MAC地址和芯片型号执行后如果看到类似Chip is ESP32-D0WD-V3 (revision v3.0)的信息就说明链路完全通了。这里把波特率设成115200是为了稳妥因为芯片自检需要复位操作波特率过高在某些廉价OTG线缆上会出现瞬间通信失败。如果你的开发板需要手动进入下载模式也就是按住BOOTIO0按钮再复位的操作那在运行chip_id之前先按住BOOT键然后短按EN键复位看到esptool输出连接成功后再松开BOOT。如果开发板支持自动下载电路比如常见的NodeMCU板载的自动复位电路就不需要手动按任何按键。4.2 固件备份这一步少不得我见过太多人拿到新板子直接开烧烧完发现原厂固件没备份后悔都来不及。ESP32的整个flash通常是4MB或者8MBesptool的read_flash命令可以完整读取esptool.py --port /dev/ttyUSB0 --baud 460800 read_flash 0x0 0x400000 esp32_backup.bin如果你不确定自己flash大小可以用flash_id命令查看。备份出来的bin文件可以用电脑上的esptool.py write_flash随时恢复回去。整个读取过程可能需要几分钟但考虑到原厂固件里可能包含出厂校准数据、partitions表和bootloader这一份备份就是你的后悔药。还有一点如果你的板子是ESP32-S3或者ESP32-C3flash地址和分区布局和经典ESP32不完全一样。备份前建议先用esptool.py flash_id确认flash大小然后执行esptool.py read_flash_status确认芯片状态正常再做完整备份。4.3 一键烧录脚本的编写与参数解析接下来进入重头戏把整个烧录过程写成一个可复用的脚本。在Debian的~目录下新建flash.sh#!/usr/bin/env bash set -e PORT/dev/ttyUSB0 BAUD460800 APP_BIN${1:-app.bin} BOOTLOADERbootloader.bin PARTITIONSpartitions.bin BOOT_APPboot_app0.bin # 检查设备节点 if [ ! -e $PORT ]; then echo [ERROR] $PORT not found. 请检查OTG连接、内核心USB串口驱动和SELinux状态。 exit 1 fi # 确保权限可写 if [ ! -w $PORT ]; then echo [INFO] 尝试调整 $PORT 权限需要真root权限... su -c chmod 666 $PORT fi # 芯片自检 esptool.py --port $PORT --baud $BAUD chip_id # 擦除flash read -p 是否擦除整片Flash? 默认否输入y确认擦除: -n 1 -r echo if [[ $REPLY ~ ^[Yy]$ ]]; then esptool.py --port $PORT --baud $BAUD erase_flash fi # 写入固件 esptool.py --port $PORT --baud $BAUD write_flash \ 0x1000 $BOOTLOADER \ 0x8000 $PARTITIONS \ 0xe000 $BOOT_APP \ 0x10000 $APP_BIN echo [OK] 烧录完成这个脚本的关键参数是每个bin文件的烧录地址。对于经典ESP320x1000是bootloader的固定地址0x8000是分区表地址0xe000是boot_app0.bin的地址而应用固件则根据你在menuconfig或platformio.ini里设置的CONFIG_APP_OFFSET来定默认是0x10000。如果你用的是Arduino IDE编译生成的固件它实际上是把所有内容打包成一个合并bin你只需要烧录一次0x0偏移即可。实际使用中我建议别照搬这个脚本就完事。把BOOTLOADER、PARTITIONS、BOOT_APP这些变量单独抽出来后以后遇到不同的引导程序版本只需要换对应文件不用改脚本逻辑。4.4 自动下载与手动进入下载模式关于下载模式我想多说几句。ESP32上电时如果GPIO0为低电平芯片就会进入UART下载模式如果GPIO0为高电平则正常启动执行flash里的程序。esptool之所以能做到“一键烧录”是因为它通过串口的DTR和RTS信号自动切换EN复位和GPIO0的电平顺序完成复位进入下载模式的过程。但前提是串口芯片的DTR/RTS线确实连到了ESP32的EN和GPIO0上。绝大多数开发板会做这个电路比如NodeMCU、ESP32 DevKitC都支持自动下载。如果你用的是自己画的板子或者某些精简核心板这些线可能根本没引出那你就只能手动操作了先按住BOOT键再按一下EN复位最后松开BOOT。在脚本运行时看到Connecting...提示就要操作否则会一直等不到芯片回应。我在脚本前面加了chip_id这一步其实是故意留给你的手动进入下载模式窗口期。波特率也值得说。460800在大多数情况下都很稳921600能更快写完大固件但通过OTG线、proot环境以及可能存在损耗的线缆时高速率容易产生不确定的丢字。我建议烧录8MB级别的大镜像时先用460800如果连续两次都成功再提升到921600不用一上来就追求极速。5. 问题排查与经验扩展5.1 串口找不到、权限不足的排查清单把我在实操中反复遇到的几类问题整理一下你按顺序排查基本都能定位到原因现象排查思路lsusb看不到USB设备换数据线确认OTG口正常手机是否支持OTGlsusb能看到但/dev/ttyUSB0不存在内核没有串口驱动尝试modprobe cp210x/ch341/ftdi_sio或更换串口芯片的开发板设备节点存在但报Permission denied需要root执行chmod 666或者把SELinux设为宽容模式esptool长时间卡在Connecting...手动进入下载模式检查EN/GPIO0接线烧录到一半断开供电不足使用外部供电并共地降低波特率换一根更短更粗的数据线这里要特别强调一下权限问题。我在proot里遇到过一种现象明明已经chmod 666 /dev/ttyUSB0了esptool还是报权限错误。后来发现是Android系统里还有一个叫/dev/bus/usb的访问控制Termux的proot环境虽然能看到设备的char设备节点但打开时还要经过USB权限管理。这个在部分ROM上无解只能换一个对USB外设支持更好的内核或者系统。5.2 烧录失败与超时的处理思路如果你看到A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected这个报错实际上是在告诉你设备连接了但芯片没有进入下载模式。处理方法很明确手动进入下载模式或者在程序里把RTS/DTR的时序修正一下。有的开发板自动下载电路里的三极管接法不同导致esptool的控制信号逻辑反相这种情况可以用--dtr和--rts参数手动指定电平时序。还有一种常见情况是Timed out waiting for packet header。这个通常和波特率太高、OTG线缆干扰、供电不足有关。最简单的做法是把波特率降到115200然后在同一环境下连续烧录测试如果115200能成功而460800失败那么问题基本确定是信号完整性问题。5.3 无root用户的替代方案如果你不想root那Termux直连这条路确实走不通因为普通Android app打开/dev/ttyUSB0会受到内核权限和SELinux双重限制。但还有几种替代方案一是Web Serial方案。手机浏览器访问https://esphome.github.io/esp-web-tools/用支持Web Serial的浏览器连接ESP32可以完成擦除和固件写入。这个方法好处是免驱坏处是只能烧录那些支持通过浏览器直连的固件格式而且浏览器兼容性是个变量。二是串口转WiFi方案。如果你手头有ESP32的开发板并且已经烧录过支持以太网或WiFi OTA的固件那么后续烧录完全可以通过网络进行。比如ESPHome固件就自带OTA接口你可以直接在手机浏览器里上传新的bin文件让设备通过WiFi完成更新。这个方案不需要电脑不需要root甚至不需要OTG线但它要求设备已经处于可联网且已运行固件的状态。三是使用专门的Android烧录App。部分商业的串口调试助手或厂家提供的App允许你通过USB连接后写入固件但这类工具往往只支持特定芯片和特定固件格式灵活度和esptool没法比。5.4 我的一点经验和后续扩展最后分享几个我实践下来的心得。第一proot环境下运行esptool最大的不稳定因素不是性能而是Android的后台进程管理。烧录过程中如果屏幕被锁屏或者手机进入深度休眠USB串口通信可能会中断。我的做法是在烧录期间用adb shell settings put system screen_off_timeout 1800000把息屏时间调到30分钟或者直接用Termux里的termux-wake-lock保持CPU运行。这个细节看起来不起眼但能避免你辛辛苦苦烧了一个大固件最后在99%时因为手机休眠断线。第二把整个Termux环境包括proot Debian做成开机启动或者快捷方式。我用Termux:Widget在桌面放了锁屏唤醒和进入Debian的快捷方式这样在户外应急时基本能做到“亮屏、点一下、进入Debian、跑脚本”四步就绪。环境配置好后日常维护成本非常低。第三这套环境不止能烧录。后面我还在Debian里装过ESPHome配合手机浏览器直接编译并OTA推送智能家居固件也在同一个环境里跑过MicroPython的mpremote工具管理远程的MicroPython设备。你会发现一旦手机里的Debian稳定运行它的想象空间远不只是一个烧录器。我现在的习惯是无论去哪只要包里塞一条OTG转接头和一块ESP32开发板就相当于随身带着一台电脑级的开发环境。手机、Debian、esptool三者组合起来几乎覆盖了我90%的现场调试需求。如果你也经常遇到出门在外却要改固件的尴尬这套方案值得你花一个下午时间配好之后就是一劳永逸的事。
02
RELATED NEWS

相关资讯

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

03
WHY YAOTU

想打造同款高转化官网?

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

◈

场景化定制

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

◐

营销型架构

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

▲

全周期服务

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

免费获取你的建站方案

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