跳到主要内容

ESP32 串口的理解

板子打印的输出位置

好问题!这是很多刚接触 ESP32 的同学都会遇到的一个疑惑。😊

ESP32 的 “Hello World” 程序里通常是用下面这样的一句(C 或 Arduino 风格):

printf("Hello world!\n");

或者

Serial.println("Hello world!");

那么它的输出到底到哪里去了呢?

你烧录进去的 Hello World 程序,在 ESP32 启动运行后,默认会通过 UART0 → USB 串口 → 电脑 输出。在 Arduino IDE、idf.py monitor,或任意串口调试工具里(波特率 115200)都能看到。

输出位置取决于使用的开发框架:

Arduino 框架

  • 默认情况下,使用 Serial.print()Serial.println() 打印的信息会通过 UART(串口) 输出。
  • 在开发板连接到电脑时,这些 UART 输出会通过 USB 转串口芯片(CH340、CP2102、或板子上的官方 USB-Serial 桥接芯片)传到电脑 USB 的虚拟串口。
  • 你可以在 Arduino IDE 或串口调试助手里(波特率要和程序里 Serial.begin(115200); 设置一致)看到输出。

总结:Arduino 框架的 Hello world 输出 → 串口输出(Serial Monitor 窗口)

ESP-IDF 框架

  • ESP-IDF 里面的 printf / ESP_LOGI 等日志默认也是走 UART0(即 TX0/RX0,通常也接到开发板的 USB 转串口芯片)。
  • 当你用 idf.py monitor 时,实际上就是打开了和开发板 USB 串口的连接,把芯片启动后通过 UART 打印的 log 显示在电脑终端。

总结:ESP-IDF 默认的 Hello world 输出 → idf.py monitor(串口监视器)里

例如:

# 首先检查串口
ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port /dev/tty.debug-console /dev/tty.usbmodem1101

# 可以发现上面的串口就是 /dev/tty.usbmodem1101
screen /dev/tty.usbmodem1101 115200

然后控制台就看看到这个串口内的东西了,注意这个波特率是 115200

alt text

这个 screen 是 macOS 和 Linux 自带的一个终端工具,它的主要功能是“开一个虚拟的终端会话”。除了远程保持一个 shell,它还有一个常见用途:作为串口调试工具,直接打开串口设备并查看输出。

要退出 screen,按下:

Ctrl + A  然后按  K

特别情况

也可以让 ESP32 把日志输出到 JTAG(调试器),或者通过 WiFi / 蓝牙 / SPI / I2C 等外设发送。但默认情况就是通过串口(UART0)输出。

波特率的概念

波特率 = 串口通信的“语速”,默认 ESP32 是 115200。电脑和开发板两端必须设置成一样,才能正常看到输出。

  • 简单说:波特率就是串口传输数据的速度,单位是 bit/s(每秒多少比特)
  • 比如 115200 波特(常见默认值),就是 每秒传输 115200 个二进制位(bit)

ESP-IDF 和 Arduino 框架默认都是 115200。有时某些例子或 bootloader 输出也可能是 921600(烧录更高效时),但一般看程序运行日志就是 115200。

看你的程序初始化代码。在 Arduino 里,通常会有:Serial.begin(115200);,在 ESP-IDF 里,默认 log 输出就是 115200。

如果你不记得,80% 的情况就是 115200,实在不行就试几个常见值:9600、57600、115200、921600。

为什么要设置波特率?

串口通信是一根线“滴答滴答”地传输 0/1 信号。
通信双方(比如 ESP32 和你的电脑)必须以相同的速度(波特率)来收发数据,否则对方就会“听不懂”。

  • 如果 ESP32 用 115200 波特发送,但是你电脑端工具用 9600 波特接收,那电脑会看到一堆乱码。
  • 就好比两个人说话:一个人说得很快,一个人按超慢速在听,肯定对不上。