ESP32-S3 Serial Monitor is blank: USB CDC On Boot setting

On ESP32-S3 and ESP32-C3 boards that use the native USB port, Serial prints only if “USB CDC On Boot” is enabled in the board settings.

What the message means

These chips have a built-in USB port. Without the CDC setting, Serial goes to the hardware UART pins and not to the USB cable.

Fix it in this order

  1. In the Arduino IDE open the Tools menu and set USB CDC On Boot to Enabled, then upload again.
  2. Pick the new COM port that appears after the upload. It may change when the sketch starts.
  3. Add a short wait after Serial.begin() so the port is ready before the first print.
  4. If the board does not appear, hold BOOT, press and release RESET, then release BOOT to enter download mode.
  5. Use a data cable and a port on the board that is the native USB one when the board has two.

Why it happens

The ESP32-S3 has native USB. If the sketch prints to Serial but the monitor stays blank, the Arduino setting USB CDC On Boot is probably disabled, or you are connected to the wrong USB port on the board.

Set Tools, USB CDC On Boot to Enabled, upload again, and select the port of the native USB connector. The UART port and the native USB port show up as different serial ports.

If you see this, do this

You seeDo this
Uploads fine, monitor blankUSB CDC setting or port changed.
No port at allCable, or enter download mode.

Serial Monitor shows nothing, wrong boot mode.

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

The ESP32-S3 and C3 chips have a USB interface inside the chip that can act as a serial port, called CDC. This is separate from the older UART that talks to a USB-to-serial chip. When the Arduino setting USB CDC On Boot is disabled, the Serial object in your sketch is connected to the UART pins, and nothing is sent to the native USB port. The sketch runs, but the monitor on the USB connector sees nothing.

The native USB port also behaves differently on reset. When the board restarts, the USB device vanishes and returns, so the port number can change and the monitor loses its connection. Anything printed before the port comes back is lost, which is why a short message at start-up may never appear.

How to confirm the cause

  • Check the Tools menu. USB CDC On Boot should read Enabled for the native USB port to carry Serial.
  • Check which connector you used. Boards with two USB sockets have one for the UART chip and one for native USB, and the port names differ.
  • Look at the list of ports before and after plugging in. A new port appears with the board; a different one can appear after the upload runs.
  • Add a delay at the start of setup and a repeating print in loop. If the repeating print shows and the first one does not, the port came back late.
  • If no port appears, enter download mode with BOOT and RESET and upload again.

Worked example

This sketch waits up to 3 seconds for the port, then prints a line every second. The timeout avoids a block forever if no monitor is open. Use it with USB CDC On Boot set to Enabled and the native USB connector.

void setup() {
  Serial.begin(115200);   // baud rate is ignored by native USB
  unsigned long t = millis();
  while (!Serial && millis() - t < 3000) delay(10);
  Serial.println("hello from ESP32-S3");
}
void loop() {
  Serial.println(millis());
  delay(1000);
}

Common mistakes

  • Setting the option but uploading to the wrong COM port.
  • Using while(!Serial) with no timeout, which freezes the sketch without a monitor.
  • Expecting the same port number after every reset.
  • Using a power-only cable.
  • Changing the setting and not uploading again.

If this did not fix it

  • The UART pins: if you wire a serial adapter to them, the output goes there rather than to USB.
  • A sketch that crashes right at start-up, which makes the port disappear again.
  • The driver on the computer, particularly on older Windows installs.