串口打印hello world
286.4.串口打印hello world
void setup() // 定义 Arduino 启动或复位后调用一次的初始化函数。
{ // setup 函数体开始。
Serial.begin(115200); // 初始化串口,设置通信速率为 115200 bit/s。
} // setup 函数体结束。
void loop() // 定义 Arduino 框架反复调用的主循环函数。
{ // loop 函数体开始。
Serial.println("hello world"); // 每轮通过串口发送 hello world,再发送回车和换行。
} // loop 函数体结束;框架会再次调用它。
一、串口打印hello world
本节先认识 Arduino 草图的 setup()、loop() 和注释,再用 ESP32-CAM 的 UART0 与 USB 转 TTL 模块把程序烧入开发板,最后在 Arduino IDE 串口监视器中观察反复出现的 hello world。上方只保留视频实际写入的业务代码,去掉了课堂上为解释语法而写的注释;PPT 里提到的其他接口和 LED 示例没有被误当成本节程序。视频使用 Arduino IDE 2.0.1,板型为上一节选好的 AI Thinker ESP32-CAM。
1.1 Arduino的基本语法
1.1.1 注释
- 新草图通常带有
setup()与loop()两个函数。setup()在每次启动或复位后运行一次,适合初始化串口、设置引脚模式等;loop()在其后被框架反复调用,承担持续执行的任务。讲师把它们比作main()和while (1)是帮助入门的类比,并非setup()就是 C/C++ 的main()。课程附带的 ESP32 Arduino 核心 1.0.6 的cores/esp32/main.cpp明确在loopTask()中先调用setup(),随后在无限循环中调用loop()。 - 单行注释以
//开始,直到该行末尾;块注释以/*开始、以*/结束,可跨多行。原笔记的“/ /”不是正确的块注释语法。注释供人阅读,不会作为程序语句运行。视频把字号调大只是为了看清代码,不影响编译结果。 - 屏幕上写的“
//while (1)”与“/* ... */”只是演示两种注释方式,真正执行的是下面的loop();不能把被注释的while (1)当成本节还运行了一个额外循环。视频 PPT 中用 LED 闪烁解释setup/loop,本节并未将那段 LED 程序写进草图。
1.1.2 串口打印
Serial是 Arduino 框架提供的串口对象;调用其接口即可使用 ESP32 的串口,不需要在这一课手写 UART 寄存器驱动。它不是“任何底层驱动都不必再理解”的承诺,接线、参数和串口选择仍须正确。Serial.begin(115200)放在setup()里,把串口速率设为 115200 bit/s(波特率)。9600也是可选速率,但若改动程序,监视器须同步改成相同数值;本节实际代码和视频中的监视器均为 115200。波特率不是“每秒发送 115200 个字符”,每个字符还要占用起始位、数据位、停止位等传输位。Serial.print()输出后不主动换行;Serial.println()输出后还发送回车\r和换行\n。本节传入的"hello world"是字符串字面量,不是已定义的字符串变量;这些接口也可打印整型变量等数据。loop()中没有等待语句,因此监视器会快速出现一行接一行的hello world。这正是视频最后呈现的现象,不能为了让输出变慢而擅自给上方课程代码加delay()。- PPT 还列了
Serial.available()与Serial.read(),但本节草图没有调用:前者返回接收缓冲区中可读取的字节数,可用于判断有没有收到数据;后者每次读取一个已收到的字节。两者面向“从电脑接收数据”,与本节“向电脑打印文字”方向相反。
1.1.3 接线图展示
**先认清板子。**原笔记写“ESP32-C3 接线图”是识别错误;视频图片、所选板型和课程资料都指向 ESP32-CAM。它的板边标识 U0T 是 UART0 的发送端 TX0/GPIO1,U0R 是接收端 RX0/GPIO3。USB 转 TTL 模块把电脑 USB 数据转换为开发板的 UART 收发信号;它不是 USB 线直接连到 ESP32-CAM 的普通 GPIO。
| 课程接线图中的 USB 转 TTL / CH340 端 | ESP32-CAM 端 | 为什么这样接 |
|---|---|---|
TXD(模块发送) | U0R / GPIO3(板子接收) | 一方发送接另一方接收,电脑才能把烧录数据送进 ESP32。 |
RXD(模块接收) | U0T / GPIO1(板子发送) | 板子的回传信息、程序打印才能到电脑。 |
GND | GND | 两端以同一地电位作信号参考,也构成供电回路。 |
| 模块的 5 V 供电输出 | 板子的 5V 电源脚 | 视频从 USB 转 TTL 模块给 ESP32-CAM 板供电;不可错接板子的 3V3 脚。 |
| 烧录期间另接一根跳线 | 板子的 GPIO0/IO0 → GND | 让 ESP32 在复位时采样到 GPIO0 低电平,进入串口下载模式;这根线不是常驻的电源线。 |
接线前先断开 USB 供电,按实物丝印辨认端子,不要只凭杜邦线颜色猜正负极。板子 5V 脚是给板载稳压电路的供电入口,而 U0R/GPIO3 是 ESP32 的 3.3 V 逻辑输入;供电选 5 V 不代表可以把 5 V UART TXD 信号直接送进 U0R。不同 CH340 小板的“3.3 V/5 V”跳帽可能控制供电,也可能影响串口信号电平,须查看所用模块的原理图或实测 TXD 高电平;若其高电平为 5 V,应使用 3.3 V 逻辑的转换器或电平转换电路。还要确认模块 5 V 输出的供电能力足够,否则板子可能复位或烧录失败。视频也展示了专用 ESP32-CAM 烧录器,它可以替代分立 USB 转 TTL 接线,但其插座方向和自动下载能力须按具体型号确认。
烧录与验证的顺序:
- 按表接好串口、电源和地,并临时将
GPIO0接GND;给板子上电或按Reset,使低电平在复位瞬间被采样。视频口述“Flash 置于 1”不符合 GPIO0 的实际电平条件:GPIO0 低(逻辑 0)才是下载模式;GPIO0 不拉低时才正常从 Flash 启动。 - 在 IDE 中确认板型 AI Thinker ESP32-CAM,选择 USB 转 TTL 在本机出现的串口(视频为
COM3,你的电脑不一定相同),点击上传。IDE 先编译,再通过该串口连接烧录器写入 ESP32 的 Flash;“编译完成”不等于“烧录成功”。 - 如果上传窗口长时间停在
Connecting...,确认GPIO0确已接地、供电及 TX/RX 没接反,再按板上的Reset触发一次复位,让芯片重新进入下载模式。视频就是在此处按复位后继续写入;不要把“每次都必须按复位”当成所有烧录器的通用规律。 - 看到写入及校验完成后,移除
GPIO0与GND的跳线,再按Reset或重新上电,使开发板进入正常运行模式。若不移除这根线,复位后仍会进入下载模式,新程序不会运行。 - 打开“工具→串口监视器”,确认同一个串口和 115200 baud,再次按
Reset,观察监视器持续输出多行hello world。视频末尾已显示这一结果。若只见启动信息而无正文,检查GPIO0是否仍接地及是否已重新复位;若显示乱码,检查监视器波特率;若完全无输出,检查U0T到模块RXD、共地和供电。
这里的关键是两条路径各司其职:供电路径把 USB 的 5 V 送到板子并经板载稳压供给芯片;信号路径把电脑的 TX 送到 ESP32 的 RX,把 ESP32 的 TX 送回电脑的 RX;模式选择则由复位瞬间 GPIO0 的电平决定。三者任一项出错,都可能出现“看见 COM 口却无法烧录/看不到输出”的现象。
核对依据
- 本地视频
videos/286.4.串口打印hello world.mp4及转录transcripts/286.4.串口打印hello world.txt:以视频画面核对实际草图、板型、接线、上传时按Reset和最终串口输出,转录中的 “GPL”“ESP32-C3”“Flash 置 1”不作为电路事实。 - 课程包
源码/7、项目3、项目4资料/项目3:基于ESP32的物联网WIFI小车.zip中的wifi监控避障小车.pptx、接线图和烧入相关图片/ESP32-CAM.jpg、ESP32-CAM烧入.jpg,以及Arduino15添加开发板文件/esp32/hardware/esp32/1.0.6/cores/esp32/main.cpp。配套压缩包内的最终小车程序是后续内容,本节的打印示例以视频实际输入为准。 - Arduino 官方
Serial.begin()、Serial.print()、Serial.println()、Serial.available()和loop()说明。 - Espressif ESP32 启动模式说明与ESP32 下载指南:核对 GPIO0 在复位时为低电平才进入串口下载模式;ESP32 数据手册用于核对 UART/GPIO 的电气边界;安信可 ESP32-CAM 原理图用于核对板级供电与接口。