RS-232 is a serial communication standard that defines electrical signal levels, connector pinouts, and handshaking lines for point-to-point asynchronous serial links between two devices (historically referred to as DTE and DCE). It specifies bipolar voltage levels (typically +3 V to +15 V for logic 0, -3 V to -15 V for logic 1) rather than the 0 V/3.3 V or 0 V/5 V levels used by MCU UARTs directly.
In practice
RS-232 shows up most often in embedded systems as a debug console, configuration port, or legacy industrial interface. MCU UARTs generate CMOS/TTL-like logic-level signals that are not RS-232 compatible on their own; a level-shifting transceiver IC (the MAX232 and its descendants are the classic example, though many modern variants like the MAX3232 operate from 3.3 V) is needed to translate between the MCU's logic levels and the bipolar RS-232 voltages on the cable. The DB-9 connector (DE-9, technically) is the most common physical form in PC-era hardware, though RS-232 also appears on DB-25 connectors and many embedded designs replace the connector entirely with a 3-pin header or even a 3.5 mm jack carrying only TX, RX, and GND.
Baud rates for RS-232 links in embedded work are typically in the range of 9600 bps to 115200 bps, though the standard itself does not impose a hard upper limit. At higher baud rates and longer cables, signal integrity degrades; RS-232 is generally considered practical up to about 15 m at 9600 baud, with distance shrinking as baud rate rises. For longer runs or multi-drop topologies, RS-485 is a common alternative, though other options exist depending on the application.
A common source of confusion is treating RS-232 and "UART" or "TTL serial" as interchangeable terms. The UART peripheral in an MCU handles the framing (start bit, data bits, parity, stop bits), but the voltage levels it produces are not RS-232. Connecting an MCU UART pin directly to a true RS-232 port risks damaging the MCU's GPIO, since RS-232 lines can swing to +/-15 V; while damage is not guaranteed in every case, direct connection is unsafe and should be avoided. The blog post "Bit-Banged Async Serial Output And Disciplined Engineering" touches on the distinction between the logical serial protocol and the physical layer carrying it.
Hardware flow control via the RTS and CTS lines is defined in RS-232 but is often omitted in minimal embedded designs that use only TX, RX, and GND. Leaving RTS/CTS unconnected is fine when the receiving side can keep up (or uses software flow control with XON/XOFF), but it can cause data loss in systems where the host or device can be overwhelmed. When building packet-based protocols on top of RS-232 links, the framing concerns described in "Help, My Serial Data Has Been Framed: How To Handle Packets When All You Have Are Streams" apply regardless of the physical layer.
Discussed on EmbeddedRelated
Frequently asked
What is the difference between RS-232 and TTL serial (UART)?
A
UART peripheral handles the asynchronous framing: start bit, data bits, optional parity, and stop bits. TTL or LVTTL serial uses 0 V for logic 0 and 3.3 V or 5 V for logic 1. RS-232 uses bipolar voltages: nominally +3 V to +15 V for logic 0 and -3 V to -15 V for logic 1, though the standard defines threshold ranges rather than fixed output voltages. Both use the same framing protocol, but the electrical levels are incompatible. An
MCU UART exposed directly to an RS-232 line without a
level shifter can be damaged.
Do I need a MAX232 (or equivalent) transceiver to use RS-232 with my MCU?
Yes, in most cases. A transceiver IC like the MAX232, MAX3232, or SP3232 converts the
MCU's TTL/LVTTL logic levels to RS-232 bipolar voltages and vice versa. The MAX232 requires a 5 V supply; the MAX3232 and similar parts operate from 3.3 V and are more common in modern low-voltage designs. Some
USB-to-serial adapters or single-board computers present only TTL-level serial, in which case no transceiver is needed if the other device is also TTL-level.
What baud rates are standard for RS-232 in embedded systems?
There is no single mandated
baud rate. Common values in embedded work are 9600, 19200, 38400, 57600, and 115200 bps. Both sides must be configured to the same baud rate, word length, parity, and stop bits. A mismatch results in framing errors and garbled data. Some legacy industrial equipment uses non-standard rates like 600 or 1200 baud; most modern
MCU UARTs can be configured to match these by adjusting the baud-rate divisor register.
When should I use RS-485 instead of RS-232?
RS-232 is a point-to-point standard: one transmitter, one receiver. It is also limited in practical cable length, typically up to about 15 m at low
baud rates, with shorter distances required at higher speeds.
RS-485 uses differential signaling, supports cable runs up to roughly 1200 m (at low baud rates), and allows multi-drop buses with up to 32 unit loads (and more with repeaters). For industrial protocols such as
Modbus over longer distances or with multiple nodes, RS-485 is the standard choice. The blog post 'Using a board with NuttX RTOS as an RS-485 / Modbus Slave Device' covers a practical RS-485 implementation.
Is hardware flow control (RTS/CTS) required for RS-232?
No. RS-232 defines RTS (Request to Send) and CTS (Clear to Send) lines for hardware flow control, but many embedded designs use a minimal 3-wire connection (TX, RX, GND) and omit flow control entirely. This works acceptably when the receiving device can process incoming data fast enough, or when software-side buffering and XON/XOFF flow control are used. Omitting hardware flow control in high-throughput or
interrupt-driven systems can cause overrun errors if the
UART receive buffer fills up before the firmware reads it.
Differentiators vs similar concepts
RS-232 is often conflated with
RS-485 and with TTL/LVTTL serial. RS-232 is strictly point-to-point and uses single-ended bipolar voltages (+/-3 V to +/-15 V). RS-485 uses differential signaling, supports multi-drop buses of up to 32 unit loads, and is far more noise-immune over long cables. TTL serial (what an
MCU UART pin actually produces) uses the same asynchronous framing as RS-232 but with single-ended 0 V/3.3 V or 0 V/5 V logic levels. The three terms describe different layers: RS-232 and RS-485 are physical-layer electrical standards; "UART" describes the framing logic that can be carried over any of these physical layers.