# Serial Monitor shows nothing: ESP32-S3, baud and Serial.begin

> Fix an empty Arduino or ESP32 Serial Monitor: Serial.begin, the baud rate, the right port and USB CDC On Boot for ESP32-S3 and C3 boards.

Canonical: https://roboticsengineering.in/fix/serial-monitor-shows-nothing/ | Published: 2026-11-03 | Updated: 2026-11-04

**If the monitor is blank, check the port and Serial.begin() before anything else.** On ESP32-S3 and C3 boards with native USB there is one more setting that is often the cause.

## What the message means

Output reaches the monitor only if the sketch starts Serial, the monitor listens on the same port at the same baud rate, and the board is actually running the sketch.

## Fix it in this order

1. Confirm Serial.begin() is in setup() and the baud rate matches the monitor.
2. Confirm the Port under Tools is the board you uploaded to, and the monitor is opened on that port.
3. On ESP32-S3 and C3 boards, set Tools > USB CDC On Boot to Enabled, then upload again.
4. Press the reset button after opening the monitor. Early messages print at start-up.
5. Add a short delay after Serial.begin() on boards that need time to attach, or wait with while (!Serial) on native USB boards.
6. Print something simple in loop() to confirm the board is alive.

## Why it happens

An empty Serial Monitor usually means the wrong port is selected, the baud rate does not match Serial.begin(), the sketch never calls Serial.begin(), or the USB cable carries power only. Boards with native USB, such as the ESP32-S3 or a Leonardo, may also need the sketch to wait for the port.

Select the right port in the Tools menu, match the baud rate at the bottom of the monitor, try a different data cable, and press the reset button after opening the monitor.

```
void setup() {
  Serial.begin(115200);
  while (!Serial && millis() < 3000) {}   // wait briefly for native-USB boards
  Serial.println("hello");
}
void loop() {}
```

Example sketch: change pins and values for your own wiring. It has not been bench-tested on your hardware.

## If you see this, do this

| You see | Do this |
| --- | --- |
| Blank on an ESP32-S3 | USB CDC On Boot is disabled. Enable it. |
| Text appears only after reset | It was printed before the monitor attached. |
| Nothing and the upload also failed | Fix the upload first. |

## Related

[Serial Monitor shows garbage](https://roboticsengineering.in/fix/serial-monitor-shows-garbage-characters/), [Arduino IDE setup](https://roboticsengineering.in/arduino-ide-setup/).

Last reviewed: November 2026. These are the usual causes and the order that finds them fastest. Test on your own board; clones and cables differ.

## Why this happens

A blank Serial Monitor means text is not arriving on the port that the monitor has open. On a classic ESP32 board a USB-to-serial chip carries the UART, so Serial goes where the monitor listens. The S3 and C3 can also expose a native USB interface. With USB CDC On Boot disabled, Serial is routed to the UART0 pins, not to the USB connector, so nothing appears on the native USB port.

Many S3 boards have two USB connectors, one marked UART or COM through a bridge chip and one marked USB for the native interface. Plugging into the wrong one, or choosing the wrong setting for the connector you use, gives a clean upload and a silent monitor. Timing also matters: with native USB the port can disappear and reappear at reset, so early prints are lost.

## How to confirm the cause

- Look at the board labels and note which connector your cable is in. Match the Tools setting to it: CDC On Boot enabled for the native USB connector.
- Open the Windows Device Manager and watch the Ports list while you press reset. A COM port that vanishes and returns is a native USB port.
- Print a counter every second from loop(). If the monitor stays blank, the problem is the port or setting, not the timing of your prints.
- Check the baud rate. A mismatch gives garbage, but a bare blank monitor is more often the wrong port or a missing Serial.begin().
- Try a different cable. A power-only cable uploads nothing and shows no port at all.

## Worked example

This sketch prints a counter and waits briefly for the port, instead of waiting forever.

```
#include <Arduino.h>
int n = 0;
void setup() {
  Serial.begin(115200);
  unsigned long t0 = millis();
  while (!Serial && millis() - t0 < 3000) {}   // gives up after 3 s
  Serial.println("start");
}
void loop() {
  Serial.println(n++);
  delay(1000);
}
```

Upload with USB CDC On Boot set to Enabled for the native connector. If the numbers appear, the sketch is fine and the setting was the cause.

## Common mistakes

- Using a while (!Serial) loop with no time limit. When no monitor is open on a standalone robot, the sketch hangs at start-up.
- Changing the board menu setting but forgetting to upload again; the setting is compiled into the sketch.
- Opening the monitor on an old port number after the board re-enumerates as a new one.
- Leaving the baud rate at 9600 in the monitor while the sketch uses 115200.

## If this did not fix it

- The board is not running the sketch: a boot problem, so look at reset and strapping pins.
- Another program holds the COM port: close other serial tools.
- A driver issue with the USB-to-serial chip: reinstall the driver for the chip on your board.
