Debugging Your ESP32 Project with a Serial Terminal
The ESP32 is a powerhouse microcontroller, beloved for its built-in Wi-Fi, Bluetooth, and dual-core processor. But with great power comes great complexity. When your ESP32 project isn't working—whether it's failing to connect to Wi-Fi or crashing unexpectedly—the serial terminal is your single most important debugging tool.
~7 minutes

The ESP32 is a powerhouse microcontroller, beloved for its built-in Wi-Fi, Bluetooth, and dual-core processor. But with great power comes great complexity. When your ESP32 project isn't working—whether it's failing to connect to Wi-Fi or crashing unexpectedly—the serial terminal is your single most important debugging tool.
The ESP32's Secret Language: The Boot Messages
Unlike a simple Arduino, the ESP32 prints a stream of diagnostic messages to the serial port every time it boots or resets. To see this, you need to set your serial terminal to the correct baud rate, which for the ESP32's bootloader is typically 115200.
If you connect to an ESP32 at 115200 baud and press its "RST" or "EN" button, you'll see something like this:
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:0x118c
load:0x40078000,len:0x13134
load:0x40080400,len:0x3a6c
entry 0x40080698
This is the bootloader telling you exactly how it's starting up. Seeing this message is your first "hello world"—it confirms your board is alive and your serial connection is working. If you see garbled text (G⸮J⸮), your baud rate is wrong. Double-check that it's set to 115200.
After these messages, your own application's code begins to run.
Basic Debugging with Serial.printf
Just like with Arduino, you can print messages from your own code. The ESP32 framework (whether using the Arduino core or ESP-IDF) provides a powerful printf function for formatted output.
Here's a simple example for the Arduino IDE that connects to Wi-Fi and reports its progress:
#include <WiFi.h>
const char* ssid = "Your_WiFi_SSID";
const char* password = "Your_WiFi_Password";
void setup() {
// It's common to use a faster baud rate for ESP32 applications
Serial.begin(115200);
delay(100); // Allow time for serial to initialize
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// Your main code here
}
When you run this, the serial terminal becomes your mission control center:
- It first shows the ESP32 bootloader messages.
- Then, it prints
Connecting to Your_WiFi_SSID. - You'll see a series of dots as it tries to connect.
- Finally, it will print
WiFi connected!and show you the IP address.
If it gets stuck on the dots, you know you have a Wi-Fi problem (e.g., wrong password). Without the serial output, you'd have no idea what it was doing.
Understanding Crash Reports (Guru Meditation Error)
Sometimes your ESP32 will crash and reset. When this happens, it often prints a "Guru Meditation Error" report to the serial port just before it reboots. It looks like a terrifying block of hexadecimal numbers:
Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x400d12a4 PS : 0x00060030 A0 : 0x800d12b0 A1 : 0x3ffb1f70
A2 : 0x00000000 A3 : 0x3ffb1f9c A4 : 0x000000ff A5 : 0x0000ff00
...
Backtrace: 0x400d12a1:0x3ffb1f70 0x400d12ae:0x3ffb1f90 0x400d130e:0x3ffb1fb0 0x40088215:0x3ffb1fd0
Rebooting...
This is not random garbage! It's a crash dump. While decoding it is an advanced topic (requiring a tool called esp-exception-decoder), simply capturing this output in your serial terminal is the crucial first step. It tells you that a crash occurred and provides the evidence a developer needs to figure out why.
A web serial terminal like serialterminal.app is perfect for this, as you can easily copy and paste this entire block of text into a forum post or a GitHub issue when asking for help.
From deciphering boot messages to catching crash reports, the serial terminal is the non-negotiable, indispensable tool for any serious ESP32 developer.