串口打印hello world

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 1 Likes: 0 Comments: 0

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(板子发送)板子的回传信息、程序打印才能到电脑。
GNDGND两端以同一地电位作信号参考,也构成供电回路。
模块的 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 接线,但其插座方向和自动下载能力须按具体型号确认。

烧录与验证的顺序:

  1. 按表接好串口、电源和地,并临时将 GPIO0 接 GND;给板子上电或按 Reset,使低电平在复位瞬间被采样。视频口述“Flash 置于 1”不符合 GPIO0 的实际电平条件:GPIO0 低(逻辑 0)才是下载模式;GPIO0 不拉低时才正常从 Flash 启动。
  2. 在 IDE 中确认板型 AI Thinker ESP32-CAM,选择 USB 转 TTL 在本机出现的串口(视频为 COM3,你的电脑不一定相同),点击上传。IDE 先编译,再通过该串口连接烧录器写入 ESP32 的 Flash;“编译完成”不等于“烧录成功”。
  3. 如果上传窗口长时间停在 Connecting...,确认 GPIO0 确已接地、供电及 TX/RX 没接反,再按板上的 Reset 触发一次复位,让芯片重新进入下载模式。视频就是在此处按复位后继续写入;不要把“每次都必须按复位”当成所有烧录器的通用规律。
  4. 看到写入及校验完成后,移除 GPIO0 与 GND 的跳线,再按 Reset 或重新上电,使开发板进入正常运行模式。若不移除这根线,复位后仍会进入下载模式,新程序不会运行。
  5. 打开“工具→串口监视器”,确认同一个串口和 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 原理图用于核对板级供电与接口。