📌 如果你也遇到这个问题

我在调试ESP32-S3时遇到的情况:

代码上传成功(显示SUCCESS),但打开串口监视器按EN重启后,屏幕上只有乱码,没有任何打印信息:

```
�%t)␂␎���N���
���@␝.␀O�H4e
�ƪ
```

手机热点列表里,也始终看不到ESP32连接上来。

如果你也遇到一模一样的问题,按下面的顺序排查:

✅ 第一步:确认是不是软件问题

1. 换一根USB数据线(不要用纯充电线)
2. 在VS Code里确认选择的COM口是否正确
3. 把代码简化到最简心跳版本:
   ```cpp
   void setup() { Serial.begin(9600); Serial.println("活着"); }
   void loop() { delay(1000); Serial.println("我还活着"); }
   ```
4. 在setup()开头加delay(1000),等串口初始化
5. 尝试擦除Flash:
   ```
   pio run --target erase
   ```
   (执行前记得关掉串口监视器,否则会报port busy)

✅ 第二步:如果以上都试了,问题依旧

· 手机热点始终检测不到设备
· 按EN只有乱码,没有任何打印

那大概率不是软件问题,是硬件坏了。
换一块新板子测试。


下面是我完整的排查过程,每一个坑都是这么踩出来的。


一、起因:只是想试一下WiFi控制

事情的开始很简单。

我最近在做一个小机器人项目,已经实现了舵机的基本控制。下一步想加WiFi功能,用手机控制舵机转动。

硬件:ESP32-S3开发板、舵机、杜邦线
软件:VS Code + PlatformIO
目标:让ESP32连接手机热点,打开一个网页,点按钮控制舵机

我把热点名字改成“070517”,密码设成最简单的“12345678”。然后让AI帮忙写了一段WiFi连接的测试代码,上传到板子。

上传成功。终端显示SUCCESS。


二、第一个问题:串口监视器里只有乱码

接下来要做的,是打开串口监视器,看ESP32打印出来的IP地址。

打开串口监视器,按了一下板子上的EN按钮(重启)。

屏幕上出现了一大串乱码,像这样:

```
�%t)␂␎���N���
���@␝.␀O�H4e
�ƪ
```

但没有IP地址,没有任何我预期的“WiFi连接成功”“IP地址:192.168.x.x”之类的信息。

当时冒出一个想法:“这个delay是不是太短了?每次按reset,它吐出来的东西是不是相当于我按了一下,然后翻译成现在看到的这种状态?”

乱码本身是正常的——ESP32刚启动时,在初始化串口之前会用默认波特率吐一些底层信息。但乱码之后应该出现我写的打印信息。

但它没有出现。


三、尝试加delay

第一个猜测:是不是代码跑得太快,打印信息被乱码淹没了?

在setup()开头加了一行delay(1000);,让程序先等1秒,等乱码过去再打印。

上传,按EN,再看监视器。

这次乱码变少了,只有一小段,但之后依然没有打印信息。

再按EN,又吐一小段乱码。再按,再吐。每次按EN,都只有那一点点乱码,没有其他内容。

这说明一个问题:板子在重启,但代码根本没有执行到Serial.println()那一步。


四、排查端口和线

怀疑是不是COM口没选对。

盯着VS Code底部的两个插头图标研究了半天:“左边那个像药水的插头,右边是platform IO new Terminal,还有标着auto的那个……到底哪个是哪个?”

后来搞清楚:左边插头是打开串口监视器,右边插头(Auto)是用来切换和调试COM端口的。

检查当前使用的COM口,显示是COM6。但拔插USB线后,列表里只有COM3、COM4、COM7,COM6不见了。

再插回去,COM6重新出现。说明端口识别正常。

换了一根USB线——之前用这根线上传成功过,说明是数据线,不是纯充电线。

端口对,线对,但问题依旧。


五、关于波特率的插曲

在排查过程中,想起之前代码里写的是Serial.begin(115200);,但串口监视器用的是9600。

当时问了一句:“你当时给我那一串数字,是想让我先测试一下,还是说这是个通用型号?我直接把这个begin后面的改成9600对吧?”

改完之后,乱码依然存在,但至少波特率对上了,排除了这个变量。


六、中间冒出的一些想法

排查过程中,脑子里冒出各种念头:

“原来库是可以帮助翻译的?我还以为库是直接对应我这个板子的某个特定版本。”

“那这个板子是不是更像一种通用语言,就像C++和Python那样?库还是要基于板子适配的吧?那不同板子的语言是相通的吗?”

“我之前的舵机项目,board选的是ESP32-S3不带后缀,后来好像出过问题,是不是因为版本不兼容才改成了带后缀的?如果直接选S3是最全的,但没有下载相应的库,不还是没用吗?”

“那之前选board只需要在platformio.ini里选就行了吧?选了之后上传时会自动下载对应的工具链?工具链应该是下载到某个目录下,以后新建项目要用到同样的库,直接在这个文件里声明就行?”

这些想法后来证明大部分是对的。虽然没能解决当前的问题,但至少把一些概念理清了。


七、尝试擦除Flash

怀疑是Flash里残留了旧数据,导致新代码无法正常运行。

在终端输入擦除命令:

```
C:\Users\HUAWEI\.platformio\penv\Scripts\pio.exe run --target erase
```

执行时报错:Could not open COM6, the port is busy。

原因是串口监视器还开着,占用了COM口。关掉监视器,再执行擦除命令,这次成功。

擦除后重新上传最简测试代码(只打印“Hello from Setup”和“I am alive”)。

打开监视器,按EN。

依然只有乱码,没有打印。


八、一个外部线索:手机热点

在整个排查过程中,手机热点一直开着。

但很长时间里,热点列表里始终没有出现任何新设备。

如果ESP32成功连接WiFi,热点列表里应该能看到它。但始终没有。

这成了一个重要的判断依据:ESP32根本没有成功执行WiFi连接相关的代码。


九、结论:指向硬件问题

到这一步,所有软件层面的排查都做完了:

· 换线
· 换代码(从WiFi代码到最简心跳代码)
· 加delay
· 擦除Flash
· 确认端口
· 正确使用串口监视器
· 按EN重启、按BOOT进下载模式

但结果始终不变:只有乱码,没有打印信息。

手机热点检测不到设备,说明程序根本没有运行到WiFi连接那一步。

综合所有现象,最合理的结论是:这块ESP32-S3开发板存在硬件故障。

可能是Flash损坏、晶振问题、芯片虚焊,或者其他底层问题。无论哪种,都不是通过软件排查能解决的。


十、一点运气问题

回顾整个过程,每一步排查都按逻辑走下来了,该试的都试了,该查的都查了。

最后指向硬件问题,不是逻辑上的失败,只是运气上遇到了一块出厂就可能不稳定的板子。

这种事情在DIY硬件里不算少见。之前玩舵机的时候,也用万用表测出过几万欧的内阻,换一个就好了。

这次只是把同样的流程走了一遍,只不过排查对象从舵机换成了开发板。


十一、这次排查积累的经验

1. 上传成功 ≠ 代码跑通
      SUCCESS只说明数据传进去了,不说明代码能正常执行。
2. 乱码是什么
      刚开机时的乱码是芯片底层信息,和你的代码无关。乱码之后没有打印,说明代码没执行到打印语句。
3. 按EN吐乱码的意义
      按EN后吐乱码,说明板子在重启,但不说明你的代码在跑。
4. 串口监视器的两个图标
      · 左边插头:打开监视器,看打印信息
      · 右边插头(Auto):切换和调试COM口
5. 端口占用问题
      执行擦除等命令时,需要先关掉串口监视器,否则会报“port is busy”。
6. 手机热点是一个判断依据
      如果ESP32成功连接WiFi,热点列表里应该能看到设备。一直没有,说明WiFi连接根本没跑通。
7. 软件排查全对,最后可能是硬件问题
      当所有软件层面的操作都做完了,问题依旧,就要考虑硬件本身。


十二、下一步

换一块新的ESP32-S3开发板,重新测试。

如果新板子能正常打印“Hello”,说明原来的板子确实坏了。
如果新板子也不行,再回头排查电脑端的问题。

但根据目前的所有迹象,大概率是前者。


后记

这次排查持续了几个小时,从兴致勃勃到逐渐接受“可能是硬件坏了”这个结论。

但整个过程不是白费。每一个卡住的地方,都对应一个需要记住的经验。下一次遇到类似问题,就可以直接跳过已经踩过的坑。

只是运气上,遇到了一块出厂可能就不太稳定的板子。


🔗 顺带串一下:乱码和进制的关系

那堆乱码,本质上就是二进制数据。

ESP32刚启动时,在串口初始化之前,会用默认的波特率往外吐一些底层信息。这些信息是二进制的,串口监视器收到后试图翻译成字符,但因为波特率没对上(或者没来得及对上),就翻译成了那些乱七八糟的符号。

你看到的 �、␂、␎,背后都是0和1。

如果当时能用十六进制看这些数据,可能会更清楚一点——比如 0x3F 代表63,0x0A 代表换行。但串口监视器不会自动帮你转成十六进制,它只会按字符翻译,翻译不对就是乱码。

乱码 = 机器在说二进制,但你听不懂。

二进制是机器说的原话,十六进制是人用来“速记”机器原话的笔记本,十进制是人自己习惯的语言。

那堆乱码,如果转成十六进制,可能会变成一串有规律的数字;如果转成十进制,可能就没什么意义。但不管怎么转,它背后都是同一个东西——机器在执行它该执行的程序。

我的板子吐了乱码,但没有后续打印,说明它只执行了最底层的启动代码,没执行到我写的 Serial.println()。这进一步印证了硬件故障的判断。


最后一句

这块狗屎板子,把我折腾了一晚上。

但它让我把二进制、十六进制、乱码、输入输出——这些东西全部串了起来。

如果没有它,这些概念可能永远停留在PPT里。

因为它坏了,我才真的去想了:机器到底在说什么?我怎么才能听懂?

所以,谢谢你,狗屎板子。

虽然你他妈的气死我了。

(写在最后)

第二天,新板子到了。

我插上 USB,打开串口监视器——

“活着。”
“我还活着。”

一行一行,稳稳地往外蹦。

但新的问题接踵而来:网页能打开了,屏幕上却全是这种玩意儿:

小欢牛逼

如果你也遇到过 ESP32 的中文乱码问题,下一篇会从编码的底层逻辑讲起。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐