烧录与查看日志

固件编好了,现在把它送进板子,然后连上串口看设备输出。这两件事是一次连续的动作,所以放在一篇里——「烧录前先断开 Console」这条正好横跨两者。

一览

浏览器要求Chrome 或 Edge。Firefox 和 Safari 没有 WebSerial,浏览器里烧不了
耗时取决于固件大小。ESP 系列按 460800 的速率写入,1MB 左右的固件通常在 10–30 秒之间。弹窗里会显示固件的字节数和实时百分比
会覆盖什么板子上原来的程序
不会怎样不会弄坏板子。烧多少次都行,随时能烧另一个进去
串口默认速率115200
日志存在哪只在你浏览器本地,不上传后端。缓存上限是 2 万行或 8MB,以先达到的那一项为准
没有 Chrome 怎么办下载固件,用你惯用的工具烧。见 下面

⚠️ 开始之前:先断开 Console。

一个串口一次只能被一个程序占着。本页的 Console 连着的时候,顶栏的「烧录」是灰的、点不动,面板上会写着这句提示:请先断开本地 Console 后再烧录,避免同一串口被占用。

更麻烦的是本页之外的占用者——Arduino IDE 的串口监视器、另一个开着这个项目的浏览器标签页。平台看不见它们,按钮照样是亮的,而报错完全看不出是这个原因:你会看到 Failed to open serial port.,这句话像是权限问题,实际上并非如此。(如果你不是在浏览器里烧,而是用命令行的 esptool.py,同一件事在 Windows 上的措辞是 Access is denied.)烧录前一并关掉。

烧录

要烧录:

  1. 确认板子插着,用的是能传数据的线(不确定就看 需要准备的物品)。
  2. 断开 Console(上面那条警告)。
  3. 点顶栏的 烧录
  4. 弹窗里等它把固件下载到浏览器,会显示 Firmware ready 加字节数。然后点 开始烧录
  5. 浏览器弹出端口选择框——这是 Chrome 自己的窗口,不是我们的界面。选中你的板子,点「连接」。
  6. 等进度条走完。

看到什么算成功:进度条到 100%,日志最后一行出现「烧录完成」。板子上的灯通常会闪一下——那是它在重启。

烧录会覆盖什么,不会覆盖什么

会:板子上原来那个程序,将不再保留。不会:板子本身不会因此损坏;你随时可以烧另一个进去,次数不限。

中途断了怎么办?拔了线、关了标签页、点了取消——都不会把板子损坏。板子会停在一个没写完的状态,重新烧录一次即可。要是重烧时连不上,按住 BOOT 键、按一下 RESET、先松 RESET 再松 BOOT,然后立刻重试。

浏览器不支持?下载下来自己烧

Firefox 和 Safari 没有 WebSerial,这是浏览器厂商的决定,不是我们的限制。界面上会明说:当前浏览器不支持串口烧录(请用 Chrome 或 Edge)。

两条路:

  1. 换 Chrome 或 Edge,重新打开这个页面。这是最简便的方式。
  2. 点顶栏的「下载」获取固件文件,用你惯用的工具烧——esptool、乐鑫官方烧录工具、Arduino IDE 都行。

下载链接有时效,过期了回来重新点一次。

连上 Console,看板子在说什么

烧完之后固件已经在跑,但你看不见它在做什么。接上串口就能看见。Console 是整个平台上最有用的一处——所有调试都从这里开始。

  1. 切到 Console 面板。
  2. 点工具栏最左边的 连接设备,弹出「连接串口」窗口——波特率是在这个窗口里选的,不是工具栏上的控件。
  3. 在窗口里把波特率选成 115200——默认约定就是这个,选错读出来就是乱码——然后点 连接
  4. 这时浏览器才弹出端口选择框,选同一个端口。
  5. 按一下板子上的 RESET,让它从头启动一次——这样你能看到完整的启动过程。

Console 的工具栏从左到右是:连接设备(连上之后这个按钮变成 断开设备)、连接状态、暂停滚动清空,以及一个本地缓存指示器 0.0MB / 8.0MB——界面上只有这个位置会出现 8MB 这个数字。

看到什么算成功:按 RESET 之后,Console 里输出几行启动信息,然后是你固件里写的那些输出。

波特率正确时的 Console:启动信息、Wi-Fi 连上后打印的 IP,以及每秒一行的距离读数
波特率对上了就是这个样子:先滚过一段启动信息,接着是一秒一行的读数 Distance: 44 cm,Wi-Fi 连上之后打印出 sta ip: 192.168.0.15,再往下读数继续一秒一行。每一行都是词句和数字,不是乱符号,就说明速率选对了。长行会被折成两行,出现 g:0x0 这样的半截内容,那是折行,不是速率的问题。

开头几行是乱码,后面正常?那不是故障。ESP32 上电时 bootloader 会用另一个速率打印几行,那几行乱是正常的,继续往下查看即可。全程乱码才是波特率选错了:点 断开设备,再点 连接设备,在弹窗里把波特率改回 115200,点 连接,然后按一下板子上的 RESET。照这样做还是乱码,见 串口全是乱码

波特率选错时的 Console:整屏都是无法辨认的字符
波特率选错就是这个样子:一秒之内刷出几十行认不出的字符——左边的时间戳整屏几乎都压在 06:26:12 这一秒里,到末尾才跳到 06:26:1306:26:14。和上面那张对照着看,一眼就能分辨。

日志只在你本地

串口日志不上传后端,只留在你浏览器里。缓存上限是 2 万行8MB,先达到其中任何一项,就从最旧的行开始丢弃。按串口日志一行几十个字符算,通常是 2 万行这一项先达到——也就是说,工具栏上的数字离 8.0MB 还差得远,最早那些行就已经被丢掉了。刷新页面后即不再保留——要留着就先复制出来。

把日志回传对话:这是整个调试闭环

设备行为不对的时候,最快的办法不是自己读代码,是把设备打出来的日志原样交回去

  1. 在 Console 里选中你要的那一段(从「复位」到出问题的地方通常就够)。
  2. 复制。
  3. 粘到项目对话框里。
  4. 加一句你想让它看什么。只贴日志不说话,它不知道你想问什么。
这是烧录后的串口日志,HC-SR04 的距离读数一直是 0。 帮我看看是哪里的问题。 [把复制的日志粘在这里]

为什么这一招管用:日志中包含它编写代码时无法获知的信息——你板子的真实芯片型号、真实的启动参数、真实的失败点。它获得这些信息之后改代码的命中率会高很多。

日志太长贴不进去?项目对话单条上限 8000 字,但超长直接粘贴也可以:粘贴内容超过上限时,输入框会自动把它转成一条 .log 附件;自己存成 .log 文件拖进输入框,效果一样。两种方式都仍然要写一句话说明你想让它看什么。

让固件自带一个「仪表盘」

一个很值的小习惯:让它在启动时打印一遍基本信息。

在启动时打印一遍:芯片型号、flash 大小、当前使用的引脚,以及一个 build 标记 2026-09-07-a。

这句为什么管用:以后任何问题,第一句都是「把你的启动日志贴上来」。让固件自带这段,等于给自己装了个仪表盘。那个 build 标记还能直接告诉你——板子上跑的到底是不是你刚烧的那一版,这是唯一能确认这件事的办法。

如果你熟悉软件开发

烧录相当于 docker run,只不过这台机器一次只能装一个程序,而且没有 docker stop——新固件覆盖旧固件,没有第二个容器,也没有回滚。所以「改了代码」和「设备上跑的变了」是两件事,中间隔着编译和烧录两步。

Console 就是 docker logs -f,区别是:它只在连着的时候有,断开就什么都没有,没有历史。没人替你留日志,你想留就得自己复制。也正因为如此,那个自打的 build 标记特别值——它是你唯一的 image tag。

常见问题

烧录的时候能同时开着 Console 吗?

不能。同一个串口一次只能一个程序占着。烧完之后再连 Console。

我可以烧其他固件进去吗?

可以,板子是你的。用 esptool 之类的工具随时可以烧回原厂固件或者其他内容。从这里烧录的固件没有任何锁定。

为什么烧录时有进度条,编译时没有?

因为烧录的进度是真的——已经写了多少字节、总共多少字节,这个数字是确定的。编译没有这样的量,给个百分比只能是编的。

日志会不会被上传?

不会。串口日志只在你浏览器本地,界面上也写着这句。你要把它交给平台的唯一方式,就是自己复制粘贴到对话框里。

板子没接屏幕,怎么知道它在做什么?

就靠 Console。这也是为什么描述需求时值得多加一句「读失败也打印一行」——串口是你唯一的眼睛。