Fix: ESP8266 prints garbage in Serial Monitor after reset (74880 baud)
The junk characters at reset are the ESP8266 boot log sent at 74880 baud. Set the monitor to 74880 to read it, or ignore it — your 115200 output follows.
Community draft — report a mistake
What you see
--- Serial Monitor at 115200 ---
rl␀l��|␀�l�|␂␌␌␌�␌l�␌b|��␂�␒�r�b�␌b��on�␀␌�l��on␌␌␌�␂␌␌␌␌b␌␌␌␂␌
=== FlashReady ESP8266 reset report ===
Reset reason : 6 = External System
--- Same reset at 74880 ---
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 3460, room 16
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4
tail 4
chksum 0xc9
csum 0xc9
v00062e60
~ld--- Serial Monitor at 115200 --- rl␀l��|␀�l�|␂␌␌␌�␌l�␌b|��␂�␒�r�b�␌b��on�␀␌�l��on␌␌␌�␂␌␌␌␌b␌␌␌␂␌ === FlashReady ESP8266 reset report === Reset reason : 6 = External System --- Same reset at 74880 --- ets Jan 8 2013,rst cause:2, boot mode:(3,6) load 0x4010f000, len 3460, room 16 tail 4 chksum 0xcc load 0x3fff20b8, len 40, room 4 tail 4 chksum 0xc9 csum 0xc9 v00062e60 ~ld
The ESP8266’s ROM bootloader prints a short status message every time it starts. Because of the crystal fitted to nearly every module, that message goes out at the odd speed of 74880 baud. At 115200 it shows up as a burst of junk characters.
That’s normal and harmless. When the board is misbehaving, though, switch the monitor to 74880. The boot log tells you why it reset.
Quick fix — try in order
- 1
If your own text follows, ignore the junk
The garbled line is the chip's ROM talking at a different speed. Your sketch's Serial.begin(115200) output comes right after it.
- 2
To read the boot log, set the monitor to 74880
Serial Monitor → baud drop-down → 74880. Now you see “rst cause” and “boot mode”, which tell you why the chip reset.
- 3
Or run your sketch at 74880 too
Serial.begin(74880);and set the monitor to 74880 — then both the boot log and your output are readable. - 4
Garbage all the time? Match the baud rate
If nothing is ever readable, the monitor speed doesn't match Serial.begin(). Set both to the same value. See Serial Monitor shows garbage.
Diagnostic sketch
// FlashReady diagnostic: why did my ESP8266 reset?
// Prints the SDK reset reason (with the exception details after a crash), the real flash
// chip size versus the size chosen in Tools -> Flash Size, then a heartbeat every 5 s.
// Open Serial Monitor at 115200. The ROM's own boot line ("rst cause:..") is printed at 74880
// baud and shows up as a few garbage characters first - that is normal.
#include <user_interface.h>
void setup() {
Serial.begin(115200);
delay(200);
Serial.println();
Serial.println("=== FlashReady ESP8266 reset report ===");
rst_info *info = ESP.getResetInfoPtr();
// SDK numbering: 0 power-on, 1 hardware WDT, 2 exception, 3 soft WDT, 4 soft restart,
// 5 deep-sleep wake, 6 external reset (RST pin). Not the same numbers as the ROM's "rst cause".
Serial.printf("Reset reason : %u = %s\n", info->reason, ESP.getResetReason().c_str());
Serial.printf("Reset info : %s\n", ESP.getResetInfo().c_str());
if (info->reason == REASON_EXCEPTION_RST) {
Serial.printf("Exception : (%u) at epc1=0x%08x - paste the stack into the Exception Decoder\n",
info->exccause, info->epc1);
}
uint32_t real = ESP.getFlashChipRealSize();
uint32_t ide = ESP.getFlashChipSize();
Serial.printf("Flash (chip) : %u KB (id 0x%06x)\n", real / 1024, ESP.getFlashChipId());
Serial.printf("Flash (IDE) : %u KB\n", ide / 1024);
if (real != ide) {
Serial.println("WARNING : Tools -> Flash Size does not match the chip. Fix it and re-upload.");
}
Serial.printf("Core / SDK : %s / %s\n", ESP.getCoreVersion().c_str(), ESP.getSdkVersion());
Serial.printf("Free heap : %u bytes\n", ESP.getFreeHeap());
Serial.println("=======================================");
}
void loop() {
static uint32_t last = 0;
if (millis() - last >= 5000) {
last = millis();
Serial.printf("alive, uptime %lu s\n", millis() / 1000);
}
}// FlashReady diagnostic: why did my ESP8266 reset?
// Prints the SDK reset reason (with the exception details after a crash), the real flash
// chip size versus the size chosen in Tools -> Flash Size, then a heartbeat every 5 s.
// Open Serial Monitor at 115200. The ROM's own boot line ("rst cause:..") is printed at 74880
// baud and shows up as a few garbage characters first - that is normal.
#include <user_interface.h>
void setup() {
Serial.begin(115200);
delay(200);
Serial.println();
Serial.println("=== FlashReady ESP8266 reset report ===");
rst_info *info = ESP.getResetInfoPtr();
// SDK numbering: 0 power-on, 1 hardware WDT, 2 exception, 3 soft WDT, 4 soft restart,
// 5 deep-sleep wake, 6 external reset (RST pin). Not the same numbers as the ROM's "rst cause".
Serial.printf("Reset reason : %u = %s\n", info->reason, ESP.getResetReason().c_str());
Serial.printf("Reset info : %s\n", ESP.getResetInfo().c_str());
if (info->reason == REASON_EXCEPTION_RST) {
Serial.printf("Exception : (%u) at epc1=0x%08x - paste the stack into the Exception Decoder\n",
info->exccause, info->epc1);
}
uint32_t real = ESP.getFlashChipRealSize();
uint32_t ide = ESP.getFlashChipSize();
Serial.printf("Flash (chip) : %u KB (id 0x%06x)\n", real / 1024, ESP.getFlashChipId());
Serial.printf("Flash (IDE) : %u KB\n", ide / 1024);
if (real != ide) {
Serial.println("WARNING : Tools -> Flash Size does not match the chip. Fix it and re-upload.");
}
Serial.printf("Core / SDK : %s / %s\n", ESP.getCoreVersion().c_str(), ESP.getSdkVersion());
Serial.printf("Free heap : %u bytes\n", ESP.getFreeHeap());
Serial.println("=======================================");
}
void loop() {
static uint32_t last = 0;
if (millis() - last >= 5000) {
last = millis();
Serial.printf("alive, uptime %lu s\n", millis() / 1000);
}
}Why it happens
Why 74880?
The ESP8266 ROM was written for a 40 MHz crystal and talks at 115200 with it. Most modules use a 26 MHz crystal, so the real speed is 115200 × 26 / 40 = 74880 baud.
Why does this matter?
The boot log is the only place you see crash and boot-mode information: rst cause:4 (watchdog), boot mode:(1,6) (GPIO0 low) and so on.
Board-specific notes
ESP-01: With a USB-TTL adapter, the same garbage appears every time the module powers up. It's normal.
Did this fix it?
Thanks — that helps us keep this page right.