
UART: A Detailed Overview of Asynchronous Serial Communication
UART is one of the oldest and most fundamental methods of serial communication in embedded systems. As its name suggests, it operates asynchronously, meaning there is no shared clock signal between the transmitter and the receiver. This makes UART especially attractive in scenarios where simplicity and minimal wiring are important.
Fundamental Concept
In a UART communication system, data is transmitted serially, bit by bit, over a single wire (TX), and received on another (RX). Each device in the communication link has its own internal clock, and both must agree on a common baud rate (bits per second). Because there’s no external clock signal, this baud rate agreement is critical—if either side drifts too much, communication breaks down.
Data Framing Structure
Every UART frame consists of several components to delimit and validate the transmission:
- Start bit – Marks the beginning of a data frame. It’s always a logic 0 (low).
- Data bits – Typically 5 to 9 bits, though 8 bits is most common. Sent LSB-first.
- Optional parity bit – Used for rudimentary error checking (even or odd parity).
- Stop bit(s) – One or more bits of logic 1 (high) to signal the end of the frame.
A typical 8-N-1 UART frame (8 data bits, no parity, 1 stop bit) looks like this:
Line Idle: HIGH
↓
Start Bit (0) → [D0 D1 D2 D3 D4 D5 D6 D7] → Stop Bit (1)
During idle periods (no transmission), the line remains at logic high.
Baud Rate and Timing Constraints
Since UART is asynchronous, both ends must know the exact baud rate—for example, 9600, 115200, or even up to a few Mbps depending on hardware. A mismatch in baud rate beyond ~2-3% can lead to framing errors.
For example, at 9600 baud:
- Each bit lasts ~104.17 microseconds.
- A full 10-bit frame (start + 8 data + stop) takes ~1.04 ms.
UART receivers usually oversample the incoming data line (commonly at 16× the baud rate) to detect the start bit and sample data bits at the correct time.
Error Detection and Robustness
UART includes minimal error handling:
- Parity Bit (optional): Basic check for single-bit error detection.
- Framing Error: If the stop bit isn’t logic high at the expected time.
- Overrun Error: If the receiver buffer isn’t read fast enough and gets overwritten.
- Break Condition: If the line is held low for longer than a full frame—used to signal an intentional interruption.
Due to the lack of built-in CRC or acknowledgment schemes, higher-layer protocols (like Modbus, NMEA, or custom ones) often wrap UART transmissions with additional error-checking logic.
Flow Control Mechanisms
When sending variable-sized or fast streams of data, there’s a risk of buffer overflow. To mitigate this:
- Software Flow Control: Special characters like XON (0x11) and XOFF (0x13) are sent to pause/resume transmission.
- Hardware Flow Control: Uses additional lines like RTS (Request to Send) and CTS (Clear to Send) for handshake.
These features are not part of the UART standard itself but are often implemented by UART peripherals or bridges (e.g., USB-to-UART chips).
Electrical Characteristics
UART is purely a signaling protocol—it doesn’t define voltage levels. Typical implementations use:
- TTL logic levels: 0V (low), 5V or 3.3V (high)
- RS-232: ±12V for signaling (used in PCs, legacy serial ports)
Make sure voltage levels match between devices or use level shifters to avoid damage.
Topology and Limitations
UART supports only point-to-point communication. You cannot have more than two devices on the same TX/RX lines without a multiplexer or external logic.
This makes UART unsuitable for multi-device networks unless augmented with switches, hubs, or protocol conversion (e.g., UART-to-I2C/SPI bridges or USB).
Buffering and Interrupts
Most modern microcontrollers include a UART peripheral with internal FIFO buffers (commonly 16, 32, or 64 bytes). This allows temporary storage of incoming/outgoing bytes to decouple hardware timing from software response.
Reception can be handled via:
- Polling – CPU actively checks status register
- Interrupts – ISR is triggered when data is received
- DMA (Direct Memory Access) – High-speed, CPU-independent transfer

Applications and Use Cases
UART is used everywhere, especially in scenarios where:
Only two devices need to communicate
Simple, low-speed data exchange is sufficient
Debugging via serial terminals (e.g.,
printf
over UART)Communication with modules like:
- GPS receivers
- GSM modems
- Bluetooth (e.g., HC-05)
- Serial LCDs or displays
- USB-to-serial bridges (e.g., FT232, CH340)
Typical Baud Rates and Limitations
Common Baud Rates | Notes |
---|---|
9600 | Very common, reliable |
38400 | Used in some industrial devices |
115200 | Common for debugging/logging |
1 Mbps+ | Achievable on high-performance MCUs |
The upper limit depends on:
- Clock accuracy
- Signal integrity (cable length, crosstalk)
- Peripheral and driver capability
Debugging UART
Troubleshooting UART issues often involves:
- Checking baud rate configuration (both sides must match)
- Monitoring line using an oscilloscope or logic analyzer
- Using tools like PuTTY, minicom, or serial monitor in IDEs
- Verifying no framing or parity errors
- Ensuring buffers aren’t overflowing (especially on RX)
Conclusion
UART is simple, efficient, and nearly universal. Its asynchronous nature makes it easy to use with just two wires, but that simplicity comes at the cost of scalability and robustness. While not ideal for high-speed or multi-device communication, it remains indispensable for low-complexity, point-to-point data exchange.
Whether you’re printing debug logs or interfacing with legacy peripherals, understanding UART deeply is foundational for any embedded system designer.
Related Posts

Why RISC-V Can Be a Game Changer?
In a world dominated by proprietary chip architectures, a quiet shift is underway. RISC-V, an open-source alternative, is redefining how we think about processor design—especially in the VLSI world.
Read more
Introduction to VLSI Design Flow: RTL to GDSII
Wonder why AI, modern smartphones, and countless digital devices have become so powerful yet compact? The secret lies in the ability to pack billions of transistors into tiny silicon chips — a feat accomplished through Very Large-Scale Integration (VLSI). At the core of this accomplishment is a complex, multi-step design flow that transforms abstract hardware concepts into a physical chip ready for fabrication.
Read more
ROS 2 vs ROS 1: What Changed and Why It Matters?
Is ROS 1 still the right choice for your next robotics project, with its well-established tools and wide community support? Or, given the growing demand for real-time performance, scalability, and modern middleware, is it finally time to make the move to ROS 2?
Read more