Serial Converters Explained: USB-to-TTL, USB-to-RS485, and Voltage Level Translation
July 21, 2026
Introduction
If you have ever worked with industrial Modbus devices, microcontroller UARTs (Universal Asynchronous Receiver-Transmitter), or field instrument communication, you have probably used a USB (Universal Serial Bus)-to-serial converter. These little adapters seem simple on the outside, but there is a surprising amount of signal conversion happening inside. This tutorial breaks down the internal architecture of serial converters, explains the role of voltage level translation, and clarifies the relationship between UART TTL (Transistor-Transistor Logic) signals and RS485 (Recommended Standard 485) differential signaling.
Whether you are connecting a USB adapter to an ESP32, wiring a Modbus RTU (Remote Terminal Unit) bus to a Moxa mGate 3270, or just trying to figure out why your 3.3V device is not talking to your 5V adapter, this guide covers the hardware you need to understand.
The USB-Serial Chip: Where USB Meets UART
Every USB-to-serial adapter has one thing in common: a USB-serial chip that converts USB protocol into UART. Common chips include the FT232 (from FTDI, Future Technology Devices International), CH340 (from WCH, Nanjing Qinheng Microelectronics), CP2102 (from Silicon Labs), and PL2303 (from Prolific). These chips handle the USB enumeration, endpoints, and flow control on the host side, and output plain UART signals on the other side: TX (transmit), RX (receive), and ground.
UART signals from these chips are single-ended TTL-level. That means each signal is carried on one wire referenced to ground, and the logic levels are either 0V (logic low) or the chip’s supply voltage (logic high). This is where the 3.3V versus 5V question comes in.
TTL Logic Levels: 3.3V vs 5V
The USB-serial chip’s output voltage depends on its supply. Some chips run at 5V, others at 3.3V. The TX and RX pins swing rail-to-rail against that supply:
| Logic State | 5V TTL | 3.3V TTL |
|---|---|---|
| High (logical 1) | ~5V | ~3.3V |
| Low (logical 0) | ~0V | ~0V |
Modern microcontrollers and peripherals (ESP32, ESP8266, STM32, nRF52, RP2040) are overwhelmingly 3.3V. Older Arduino boards (Uno, Nano, Mega with ATmega328P/ATmega2560) and legacy industrial modules are 5V.
The Voltage Mismatch Problem
Connecting a 5V TX line to a 3.3V device’s RX pin can damage the input or cause latch-up. Conversely, a 3.3V TX into a 5V RX often works (3.3V is above the 5V part’s VIH, Voltage Input High threshold, in many cases), but it is marginal and unreliable, especially with slower signal edges or longer cables.
The Onboard Voltage Translator
Some USB-to-serial adapters include an onboard voltage translator between the USB-serial chip and the breakout pin header. This is typically a bidirectional level shifter, either a MOSFET (Metal-Oxide-Semiconductor Field-Effect Transistor) + pull-up pair or a dedicated IC (Integrated Circuit) like the TXB0108 or TXS0108. It lets you select whether the external TX/RX pins present 3.3V or 5V logic levels to your target device, usually via a jumper or switch.
flowchart LR
USB["USB"] --> Chip["USB-serial chip\n(FT232, CH340,\nCP2102, etc.)"]
Chip -->|TTL UART| VT["Voltage Translator\n(3.3V/5V\nselectable)"]
VT -->|TX, RX| Header["Pin Header\n(TX, RX, GND,\nVCC)"]
Header -->|TTL 3.3V or 5V| MCU["Microcontroller\nUART pins"]
When to Use Each Voltage Level
| Target Device | Set Translator To |
|---|---|
| ESP32, ESP8266, STM32, nRF52, RP2040 (Pico) | 3.3V |
| 3.3V sensors/modules (GPS, BLE (Bluetooth Low Energy), LoRa breakouts) | 3.3V |
| Arduino Uno, Nano, Mega (ATmega328P/2560 at 5V) | 5V |
| Legacy 5V TTL industrial modules | 5V |
| Unknown — check the datasheet first | Match accordingly |
If your adapter is stuck at 5V with no selector and you need to connect a 3.3V device, use a resistive voltage divider on the adapter’s TX line (adapter TX to device RX) and connect the device’s TX directly back (3.3V TX is usually readable by a 5V input).
RS485: Differential Signaling
RS485 (TIA/EIA-485, from the Telecommunications Industry Association and Electronic Industries Alliance) is a completely different signaling standard. It does not use a single voltage referenced to ground like TTL or RS-232 (Recommended Standard 232). Instead, it uses two wires, labeled A and B, and the signal is the voltage difference between them. Alternate nomenclature maps B to D+ (high for mark/idle) and A to D- (low for mark/idle) — see the A/B labeling note at the end of this article for why this confuses people.
RS485 Voltage Levels
| Parameter | Value |
|---|---|
| Driver output, logical “1” (A < B) | Vab typically -1.5V to -5V |
| Driver output, logical “0” (A > B) | Vab typically +1.5V to +5V |
| Receiver threshold | Detects logic state when |Vab| > 200 mV |
| Common-mode range (both lines vs ground) | -7V to +12V |
| Each wire individually (vs ground) | Roughly 0V to 5V |
| Bus termination | 120 ohm resistor across A-B at each end |
RS485 Signal States
Per the TIA/EIA-485 standard and confirmed by major transceiver manufacturers (Maxim, TI, Linear Technology, FTDI):
| Signal | Mark (logic 1) | Space (logic 0) |
|---|---|---|
| A | Low | High |
| B | High | Low |
This means:
- Logic 1 (mark/idle): A is negative relative to B (Vab < 0)
- Logic 0 (space): A is positive relative to B (Vab > 0)
A is the non-inverting signal (also called D- or U-), and B is the inverting signal (also called D+ or U+). The alternate nomenclature maps B to D+ (high for mark/idle) and A to D- (low for mark/idle).
The key insight: each wire individually stays in the 0-5V range relative to ground, but the meaningful signal is the difference between them (A minus B), typically plus or minus 1.5V to 5V. The receiver only cares about which line is higher than the other.
This differential approach gives RS485 its famous noise immunity. Since both wires are twisted together, electromagnetic interference induces the same voltage on both lines, and the receiver cancels it out by looking at the difference.
The Transceiver: Converting TTL to RS485
Here is where many people get confused. A UART TX pin from a USB-serial chip outputs a single-ended signal at a few milliamps. RS485 is a differential bus that requires a push-pull driver capable of driving a terminated multidrop bus (low impedance, sinks or sources 60mA+). You cannot connect UART TX/RX directly to an RS485 bus.
The transceiver is the component that bridges this gap. It is a dedicated hardware IC (not a microcontroller, not software) that sits on the adapter board between the USB-serial chip and the RS485 screw terminals. Common transceiver ICs include the MAX485, SP3485, MAX3485, and isolated variants like the MAX14936.
flowchart LR
USB["USB"] --> Chip["USB-serial chip\n(TTL UART)"]
Chip -->|TTL TX/RX| Trans["Transceiver\n(MAX485)"]
Trans -->|Differential| Bus["A, B terminals\n(RS485)"]
Bus --> Bus2["RS485 bus →\nother devices"]
What the Transceiver Does
On the TTL side, the transceiver receives TX from the USB-serial chip and drives RX back to it. On the bus side, it drives the A and B lines with differential voltage. The transceiver also handles:
- Bus drive strength — enough current to drive a terminated multidrop bus
- Slew rate limiting — reduces EMI (Electromagnetic Interference) on longer cables
- Failsafe biasing — defines the bus state when no driver is active
- Direction control (RE/DE pins, Receiver Enable/Driver Enable) — for half-duplex operation, the transceiver switches between transmit and receive modes
Think of it the same way as an RS-232 transceiver (like the MAX232) that converts TTL to RS-232 voltage levels. Same concept, different standard on the bus side.
Every RS485 Device Has a Transceiver
This is the critical point: RS485 is a multidrop bus. Multiple devices share the same two wires, and every device on the bus has its own transceiver. It is not something only the adapter has.
flowchart LR
Master["Master\n(USB adapter)\nTransceiver\n+ 120Ω term"] -->|A| S1["Slave 1\nTransceiver"]
Master -->|B| S1
S1 -->|A| S2["Slave 2\nTransceiver"]
S1 -->|B| S2
S2 -->|A| S3["Slave 3\nTransceiver\n+ 120Ω term"]
S2 -->|B| S3
Each device, whether it is a USB adapter, a Modbus gateway, or a field instrument, has a transceiver IC inside. The transceiver is the universal translator: no matter what the internal logic voltage is (3.3V MCU (Microcontroller Unit), 5V MCU, USB-serial chip at TTL), the bus side is always standard RS485 differential. That is why devices from different manufacturers can share the same bus.
Three Adapter Types Compared
Type 1: USB-to-TTL (No Transceiver)
flowchart LR
USB["USB"] --> Chip["USB-serial chip"]
Chip -->|TTL UART| Header["Pin Header\n(TX, RX, GND,\nVCC)"]
No transceiver. The USB-serial chip’s UART is broken out directly to a pin header. This is what you use to flash firmware, debug a console, or talk to a microcontroller’s UART. The 3.3V/5V voltage selector matters here because you are connecting chip-to-chip at logic levels.
Type 2: USB-to-RS485 (Transceiver In Path)
flowchart LR
USB["USB"] --> Chip["USB-serial chip"]
Chip -->|TTL UART| Trans["Transceiver"]
Trans -->|Differential| Bus["A, B terminals"]
The TTL UART never leaves the board. The transceiver is permanently wired between the USB-serial chip and the A/B terminals. You cannot access the TTL side. There is no 3.3V/5V selection because you only interact with the differential bus side.
Type 3: Multi-Protocol (Both Exposed)
flowchart LR
USB["USB"] --> Chip["USB-serial chip"]
Chip -->|TTL UART\nbypasses transceiver| TTL["TTL Header\n(TX, RX, GND)"]
Chip -->|TTL UART| Trans["Transceiver"]
Trans -->|Differential| Bus["A, B terminals\n(RS485)"]
These adapters expose both interfaces. When you connect to the TTL header, you are tapping the UART before the transceiver, effectively bypassing it. When you connect to the A/B terminals, your signal goes through the transceiver and comes out as differential RS485.
Industrial Example: Moxa mGate 3270
The Moxa mGate 3270 is a Modbus TCP (Transmission Control Protocol)-to-RTU/ASCII (American Standard Code for Information Interchange) gateway. Its RS485 port follows the same architecture, but with industrial-grade features:
flowchart LR
Eth["Ethernet/SoC\n(System on Chip)"] -->|UART TTL| Iso["Isolated\nRS485 Transceiver"]
Iso -->|Differential| Bus["A/B terminals"]
Key specifications:
- Standard RS485 differential levels (as described above)
- 2-wire half-duplex operation (common Modbus RTU configuration)
- Galvanic isolation on the serial port (2.5kV to 3kV)
- Data rates up to 921.6 kbps
- Internal 120 ohm termination (configurable by revision)
The isolation barrier sits between the SoC and the transceiver (or is integrated into the transceiver IC itself). This means the transceiver physically floats with the bus, which is critical in industrial environments where ground potential differences between devices can be significant.
Wiring the mGate 3270
mGate 3270 Modbus RTU slave device
A (D-) ───────────────── A (D-)
B (D+) ───────────────── B (D+)
GND ───────────────── GND (recommended even with isolation)
120Ω termination across A-B at BOTH ends of the bus
Watch out for A/B labeling. Per the TIA/EIA-485 standard and major transceiver manufacturers (Maxim, TI, FTDI), the convention is: A = non-inverting = D- (low for mark/idle), B = inverting = D+ (high for mark/idle). Moxa follows this standard convention. However, some manufacturers and Chinese RS485 modules swap A and B on their silk screen or terminal labels, which is a common source of RS485 communication failures. If you get no communication, swap A and B on one end. It will not damage anything since the receiver threshold is symmetric.
RS232 vs RS485: Different Standards, Different Transceivers
RS232 and RS485 use completely different transceivers. They are different electrical standards with different signaling, different voltage levels, and different bus topologies. The USB-serial chip is the same in both cases — what changes is which transceiver the TTL UART gets routed through.
Comparison Table
| RS232 | RS485 | |
|---|---|---|
| Example transceiver IC | MAX232, MAX3232 | MAX485, SP3485, MAX3485 |
| Signaling | Single-ended (one wire per signal + ground) | Differential (two wires A/B, signal is the difference) |
| Voltage levels | ±3V to ±15V (typically ±12V) relative to ground | ±1.5V to ±5V between A and B (each wire 0-5V vs ground) |
| Logic polarity | Inverted (negative voltage = logic 1, positive = logic 0) | Differential (A < B = logic 1/mark, A > B = logic 0/space) |
| Direction | Full-duplex (separate TX and RX wires, simultaneous) | Typically half-duplex (shared A/B pair, one direction at a time) |
| Bus topology | Point-to-point (one transmitter, one receiver per signal) | Multidrop (up to 32 unit loads on same bus) |
| Number of wires | TX, RX, GND (Ground) minimum (DB9, D-subminiature type B 9-pin, commonly used) | A, B, GND minimum (2-wire + ground) |
| Common-mode range | Ground-referenced, short distance | -7V to +12V, handles ground potential differences |
| Cable length | ~15 meters practical max | ~1200 meters at lower baud rates |
| Noise immunity | Low (single-ended, picks up noise on reference wire) | High (differential cancels common-mode noise) |
| Charge pump | Yes (generates ±12V from single 5V supply) | No (stays in 0-5V common-mode range) |
| Bus drive | Drives one receiver over short cable | Drives terminated multidrop bus (sinks/sources 60mA+) |
| Direction control | Not needed (full-duplex, dedicated TX and RX) | Required (RE/DE pins for half-duplex bus contention) |
The Signal Chain Comparison
USB-to-RS232 adapter:
flowchart LR
USB["USB"] --> Chip["USB-serial chip\n(FT232, CH340)"]
Chip -->|TTL UART| Trans["RS232 Transceiver\n(MAX232/MAX3232)"]
Trans -->|RS232 levels\n±12V single-ended| DB9["DB9 Connector\n(TX, RX, GND,\nRTS, CTS, etc.)"]
The RS232 transceiver (e.g. MAX232) takes the USB-serial chip’s TTL UART (0-5V single-ended) and converts it to RS232 levels (±12V single-ended). It does this using an internal charge pump that generates the positive and negative voltages from a single 5V supply. RS232 also inverts the logic polarity — negative voltage is logic 1, positive is logic 0, the opposite of TTL.
USB-to-RS485 adapter:
flowchart LR
USB["USB"] --> Chip["USB-serial chip\n(FT232, CH340)"]
Chip -->|TTL UART| Trans["RS485 Transceiver\n(MAX485, SP3485)"]
Trans -->|Differential| Bus["A, B terminals\n(differential pair\n+ GND)"]
The RS485 transceiver takes the same TTL UART and converts it to differential signaling. No charge pump is needed since RS485 stays in the 0-5V common-mode range. But it needs much stronger output drivers to push current into a terminated multidrop bus, plus direction control (RE/DE pins) to manage bus contention in half-duplex operation.
Why They Cannot Be Swapped
You cannot use an RS232 transceiver for RS485 or vice versa because they solve fundamentally different problems:
RS232 transceiver boosts voltage to ±12V and inverts logic polarity. It is designed to drive one receiver over a short cable. It has no concept of a shared bus or direction control.
RS485 transceiver drives a differential pair into a low-impedance terminated bus that can have 32+ devices on it. It manages bus contention with direction control so only one device transmits at a time. Unlike RS232, RS485 does not use negative voltage for logic 1 — it encodes the signal as a voltage difference between A and B. Note that the truth tables of most popular transceiver ICs (starting with the SN75176) show inverted output: a high on the TTL DI (data in) pin drives A low and B high (logic 1/mark), which matches the standard’s definition.
Multi-Protocol Adapters
If you look at a multi-protocol USB-serial adapter that supports both RS232 and RS485, it has two separate transceiver chips on board:
flowchart LR
USB["USB"] --> Chip["USB-serial chip"]
Chip -->|TTL UART| RS232T["RS232 Transceiver"]
RS232T -->|RS232 ±12V| DB9["DB9 connector"]
Chip -->|TTL UART| RS485T["RS485 Transceiver"]
RS485T -->|Differential| AB["A, B terminals"]
The USB-serial chip is the common input to both transceivers. Some adapters have a physical switch or jumper that selects which transceiver is active. Others expose both connectors simultaneously.
RS422: The Full-Duplex Cousin
For completeness, RS422 (Recommended Standard 422) is the full-duplex cousin of RS485. Same differential signaling, same transceiver family (MAX491, SP492), but with separate dedicated TX and RX differential pairs (4 wires: TX+, TX-, RX+, RX-) instead of a shared A/B pair. RS422 transceivers are essentially RS485 transceivers without the direction control logic. Some RS485 transceivers can be configured for RS422 mode by tying DE high and RE low permanently.
Summary
| You Connect To | Signal Path | Voltage | Use Case |
|---|---|---|---|
| TTL header pins | USB-serial chip to MCU directly | 3.3V or 5V TTL | Firmware flashing, console debug, MCU UART |
| A/B terminals | USB-serial chip through transceiver to bus | RS485 differential (plus/minus 1.5V to 5V) | Modbus RTU, multidrop bus, industrial fieldbus |
The mental model in one sentence: the USB-serial chip converts USB to UART TTL, the transceiver converts UART TTL to RS485 differential, and the voltage translator (when present) ensures the TTL side matches your target device’s logic level.
Understanding this signal chain helps you choose the right adapter, wire it correctly, and avoid the common mistake of connecting TTL pins directly to an RS485 bus (or vice versa) and wondering why nothing works.