A serial console is the cable I reach for when a Raspberry Pi is alive enough to boot but not alive enough to join the network. It shows kernel messages before SSH could possibly work and gives you a login without a monitor. It can also damage GPIO in an instant if a 5 V adapter is involved, so we will begin with electricity rather than software.

Confirm the board and adapter before wiring

  • The adapter must expose 3.3 V TTL logic; a DB9 RS-232 adapter uses incompatible voltage levels.

  • Raspberry Pi 4 and earlier normally expose the primary UART on GPIO14 and GPIO15 of the 40-pin header.

  • Raspberry Pi 5 exposes its primary Linux console on the dedicated three-pin debug header by default.

  • Wire colours are not a standard. Trust the labels or adapter documentation, never an old photograph.

Wiring Raspberry Pi 4 and earlier models

  • Pi GND, physical pin 6 → adapter GND: both sides need a common reference.

  • Pi GPIO14/TXD, physical pin 8 → adapter RXD: the Pi transmitter feeds the host receiver.

  • Pi GPIO15/RXD, physical pin 10 → adapter TXD: the host transmitter feeds the Pi receiver.

  • Adapter VCC/5V/3V3 → not connected: power the Pi separately.

TX and RX must cross

A transmitter talks to a receiver. If both sides are labelled from their own perspective, TX connects to RX and RX connects to TX. A console that shows output but ignores keyboard input often has only one direction correctly wired.

Raspberry Pi 5 uses a different default console header

On Raspberry Pi 5, use the dedicated debug UART connector and its documented orientation for the default console. Do not assume the Pi 4 physical-pin recipe automatically applies. GPIO14/15 can be configured for another UART, but that is a separate overlay and console-routing design.

Enable the login console with raspi-config

Raspberry Pi OS terminalbash
sudo raspi-config
3 Interface Options → I6 Serial Port
Login shell over serial? Yes
Serial port hardware enabled? Yes

Risk level: caution. Review the command before running it.

Those two questions control different layers

  • The login-shell answer controls kernel console/getty use of the serial port.

  • The hardware answer enables the UART itself.

  • For a debugging console, answer Yes to both; for an application UART, normally answer No to login shell and Yes to hardware.

  • Reboot after leaving raspi-config so bootloader, kernel, and systemd settings agree.

Raspberry Pi OS terminalbash
sudo reboot
Connection closes while Raspberry Pi restarts.

Risk level: caution. Review the command before running it.

What reboot activates

  • Raspberry Pi OS applies the serial hardware configuration at boot.

  • The kernel command line selects the console device and baud rate.

  • A serial getty supplies the login prompt after userspace starts.

  • Save work first because reboot ends all current sessions.

Understand the files raspi-config manages

Raspberry Pi OS terminalbash
grep -n '^enable_uart' /boot/firmware/config.txt 2>/dev/null || \
+  grep -n '^enable_uart' /boot/config.txt
cat /proc/cmdline
readlink -f /dev/serial0
enable_uart=1
... console=serial0,115200 ...
/dev/ttyAMA0

Prefer aliases over guessed device names

  • Current Raspberry Pi OS uses /boot/firmware/config.txt; older releases commonly used /boot/config.txt.

  • cmdline.txt must remain one physical line if edited manually.

  • /dev/serial0 follows the model’s primary UART and may resolve to ttyAMA0, ttyS0, or on Pi 5 a different console UART.

  • enable_uart=1 is especially relevant when the mini UART is primary because its baud rate depends on core clock behavior.

Find the USB serial adapter on Ubuntu

Ubuntu host terminalbash
sudo dmesg --follow
# Plug in the adapter, observe the assigned device, then press Ctrl-C.
ls -l /dev/serial/by-id/ 2>/dev/null
ls -l /dev/ttyUSB* /dev/ttyACM* 2>/dev/null
usb ... converter now attached to ttyUSB0
/dev/ttyUSB0

Choose a stable host-side name when available

  • USB UART drivers commonly create /dev/ttyUSB0; CDC adapters may create /dev/ttyACM0.

  • dmesg --follow ties the new node to the device you just inserted.

  • /dev/serial/by-id can remain stable when numeric tty assignments change.

  • Do not copy /dev/ttyUSB0 blindly when several adapters are connected.

Open the console at 115200 8-N-1

Ubuntu host terminalbash
sudo apt install minicom
minicom -D /dev/ttyUSB0 -b 115200 -8
Welcome to minicom
Press CTRL-A Z for help on special keys

Serial settings that must agree

  • -D selects the verified host device and -b sets 115200 bits per second.

  • -8 selects eight data bits; use no parity and one stop bit.

  • Disable hardware and software flow control because the three-wire connection has no RTS/CTS lines.

  • Exit minicom with Ctrl-A then X; do not simply close a terminal while another process still owns the port.

Boot and log in

  1. Open the host terminal before applying Pi power so early messages are not missed.

  2. Power the Raspberry Pi from its normal supply.

  3. Watch for firmware or kernel output, then the Raspberry Pi OS login prompt.

  4. Press Enter if the prompt is present but not freshly drawn.

  5. Sign in with an existing local account; modern Raspberry Pi OS does not rely on a universal default password.

Troubleshoot by symptom

  • No characters at all: verify common ground, adapter voltage, model-specific header, TX/RX crossing, console configuration, and host device.

  • Unreadable characters: both sides disagree on baud or framing, or a mini-UART clock is unstable.

  • Output but no keyboard input: check adapter TX → Pi RX and disable flow control.

  • Permission denied: add the host user to the appropriate serial-device group such as dialout, then log out and back in.

  • Device busy: close ModemManager, another terminal, or any process holding the tty.

  • Boot messages but no login: inspect the kernel console= argument and serial-getty state.

  • Works until Bluetooth changes: older wireless models may route PL011 and mini UART differently; use /dev/serial0 and review the selected overlay.

Do not add earlycon casually

The normal serial console begins after substantial boot setup. Raspberry Pi documents model-specific earlycon parameters for earlier failures, but selecting the wrong UART or address can prevent boot. Add early console only for a defined kernel-debugging need and keep a known-good SD-card rollback.

Primary Raspberry Pi references