<style>[reveal]{opacity:1 !important;transform:none !important}</style>

UART, USB-Seriell und RS-232

Serielle Schnittstelle am Arduino und ESP32: TX und RX richtig kreuzen, Pegel zwischen 5 V, 3,3 V und RS-232 anpassen, Baudratenfehler berechnen und MAX3232 beschalten.

6 Min. LesezeitUART Arduinoserielle SchnittstelleRS-232 MikrocontrollerMAX3232

Die serielle Schnittstelle ist die älteste und robusteste Verbindung eines Mikrocontrollers zur Außenwelt. Über sie lädt der Arduino-Bootloader dein Programm, über sie schreibt Serial.println() in den Monitor, und über sie sprechen GPS-Empfänger, Funkmodule, Fingerabdrucksensoren und alte Messgeräte. Im Chip heißt der Baustein UART (Universal Asynchronous Receiver Transmitter). Zwei Leitungen und Masse genügen, einen Takt gibt es nicht.

Drei Pegelwelten begegnen dir dabei: 5 V beim Arduino Uno, 3,3 V beim ESP32 und ±5 bis ±12 V bei RS-232 an Industrie- und Messgeräten. Hier verbindest du einen Uno über einen MAX3232 mit einer RS-232-Buchse und lernst, wie die anderen Fälle aussehen.

Schaltplan

RS-232-Anschluss: PD1 (TXD, Pin 3) des ATmega328P an T1IN (Pin 11) des MAX3232, R1OUT (Pin 12) an PD0 (RXD, Pin 2); Ladungspumpe mit C1 100 nF zwischen Pin 1 und 3, C2 470 nF zwischen Pin 4 und 5, C3 470 nF an V+ (Pin 2), C4 470 nF an V− (Pin 6); T1OUT (Pin 14) an Pin 2 und R1IN (Pin 13) an Pin 3 der Sub-D-Buchse X1, Pin 5 an Masse; C5 100 nF an VCC
Der MAX3232 setzt die 5-V-Logik auf RS-232-Pegel um. Seine Ladungspumpe erzeugt die negative Spannung selbst.
  • IC1, ATmega328P: TXD (Pin 3, D1) sendet, RXD (Pin 2, D0) empfängt.
  • IC2, MAX3232: Pegelwandler mit zwei Sendern und zwei Empfängern für 3,0 bis 5,5 V. Er invertiert die Signale und hebt sie auf etwa ±5,4 V.
  • C1 bis C4: Kondensatoren der Ladungspumpe, mit der der Chip aus 5 V die Spannungen V+ und V− erzeugt. Die Werte gelten für den ganzen Versorgungsbereich von 3,0 bis 5,5 V.
  • C5, 100 nF: Abblockkondensator direkt an VCC.
  • X1, Sub-D 9, Buchse: Pin 2 sendet zum PC, Pin 3 empfängt vom PC, Pin 5 ist Masse. Mit dieser Belegung passt ein 1:1-Kabel zum Stecker des PCs.

So funktioniert die Schaltung

Der Rahmen. Im Ruhezustand liegt die Leitung auf High. Ein Zeichen beginnt mit einem Startbit (Low), dann folgen die acht Datenbits mit dem niederwertigsten zuerst und ein Stoppbit (High). Dieses Format heißt 8N1: acht Datenbits, keine Parität, ein Stoppbit. Weil kein Takt mitläuft, müssen sich Sender und Empfänger vorher auf die Geschwindigkeit einigen, die Baudrate. Der Empfänger startet mit der fallenden Flanke des Startbits eine Uhr und tastet jedes Bit in der Mitte ab.

Das Zeichen A (0x41) im Format 8N1 bei 115 200 Baud: oben am Pin mit 0 und 5 V, Startbit, Datenbits 1 0 0 0 0 0 1 0 und Stoppbit; unten nach dem MAX3232 invertiert mit −5,4 V für 1 und +5,4 V für 0
Ein Zeichen dauert zehn Bitzeiten. RS-232 ist invertiert: Eine logische 1 ist eine negative Spannung.

Kreuzen. Der Sendeausgang des einen gehört an den Empfangseingang des anderen: TX an RX, RX an TX, dazu Masse. Wer TX mit TX verbindet, lässt zwei Ausgänge gegeneinander arbeiten; es passiert nichts, im schlechtesten Fall leidet ein Pin.

Pegel. Zwischen zwei Mikrocontrollern an derselben Spannung fließen die Signale direkt. RS-232 dagegen arbeitet mit Spannungen über +3 V für 0 und unter −3 V für 1, damit Signale auch über 15 m Kabel und Störungen sicher ankommen. Ein Mikrocontroller-Pin verträgt das nicht; der MAX3232 übersetzt in beide Richtungen.

Dimensionierung

1. Bitzeit. Bei 115 200 Baud dauert ein Bit 1 / 115 200 Bd ≈ 8,68 µs, ein Zeichen mit zehn Bits 86,8 µs. Mehr als rund 11 500 Zeichen pro Sekunde gehen also nicht durch die Leitung.

2. Baudratenfehler. Der ATmega328P leitet die Baudrate aus seinem Takt ab, durch einen ganzzahligen Teiler. Im Modus mit doppelter Geschwindigkeit, den Arduino verwendet, gilt:

UBRR = fCPU8 · Baud − 1 = 16 MHz8 · 115 200 − 1 ≈ 16,4 → 16
Baudist = 16 MHz8 · (16 + 1) ≈ 117 647 → +2,1 %

Bei 57 600 Baud sind es −0,8 %, bei 9600 Baud nur +0,2 %. Für 8N1 darf die Summe der Fehler von Sender und Empfänger etwa 4 % nicht überschreiten, sonst liegt die Abtastung beim Stoppbit schon im nächsten Bit. Weicht die Gegenseite um 2 % in die andere Richtung ab, wird es mit 115 200 Baud am Uno knapp. Der ESP32 teilt seinen Takt mit Nachkommastellen und erreicht jede gängige Baudrate auf besser als 0,1 %.

3. Ladungspumpe. Die Werte stammen aus dem Datenblatt: Für den ganzen Bereich von 3,0 bis 5,5 V 100 nF für C1 und 470 nF für C2 bis C4. Keramik mit X7R und mindestens 16 V genügt, denn an C3 und C4 liegen rund 5,5 V. Der Sender liefert an 3 kΩ Last typisch ±5,4 V, laut Datenblatt mindestens ±5 V – deutlich über den geforderten ±3 V.

4. Kabellänge. RS-232 ist für etwa 15 m bei 19 200 Baud ausgelegt; je länger das Kabel, desto langsamer. Für größere Entfernungen gibt es RS-485 mit differenzieller Übertragung über ein verdrilltes Paar.

Code

Ein Echo ist der einfachste Test: Stell am PC ein Terminalprogramm auf 57 600 Baud, und jedes getippte Zeichen kommt zurück. Weil D0 und D1 auch am USB-Wandler des Uno hängen, ziehst du die RS-232-Seite zum Hochladen ab.

void setup() {
  Serial.begin(57600);           // −0,8 % Fehler am Uno
}

void loop() {
  if (Serial.available()) {
    char c = Serial.read();
    Serial.write(c);             // Echo
  }
}

Am ESP32 hast du drei UARTs. Serial2.begin(115200, SERIAL_8N1, 16, 17); legt den zweiten auf RX = GPIO 16 und TX = GPIO 17, ohne den USB-Anschluss zu stören.

Bauteilliste

BezeichnerWert/TypHinweis
IC2MAX3232 (SOIC-16 oder DIP-16)3,0–5,5 V; der ältere MAX232 nur 5 V mit 1-µF-Kondensatoren
C1100 nF, X7R, 16 Vzwischen Pin 1 und 3
C2, C3, C4470 nF, X7R, 16 VPin 4/5, Pin 2 und Pin 6
C5100 nFan Pin 16
X1Sub-D 9, BuchsePin 2 senden, Pin 3 empfangen, Pin 5 GND

Varianten

USB-Seriell-Wandler. Ein Wandler mit CH340, CP2102 oder FT232R macht aus USB direkt eine UART mit Logikpegel. Wichtig ist sein Pegel: Viele haben einen Schalter oder eine Lötbrücke für 5 V und 3,3 V. Verbunden wird gekreuzt, TX des Wandlers an RX des Controllers. Der Ausgang DTR setzt über 100 nF den Controller beim Hochladen zurück, siehe Minimalbeschaltung eines Mikrocontrollers.

5 V an 3,3 V. Sendet ein 5-V-Arduino an einen ESP32, braucht dessen RX-Pin einen Teiler: 1 kΩ in Reihe, 2 kΩ nach Masse ergeben 5 V · 2 / 3 ≈ 3,3 V. In die andere Richtung reichen die 3,3 V des ESP32 meist, denn der ATmega erkennt High ab 3,0 V; die Reserve ist allerdings klein. Mehr Lösungen unter Pegelwandler mit Spannungsteiler und Bidirektionaler Pegelwandler.

Galvanisch getrennt. Bei Geräten mit eigener Erdung oder in gestörter Umgebung trennst du die Leitungen mit Optokopplern oder digitalen Isolatoren; die Versorgung der getrennten Seite kommt dann aus einem isolierten DC/DC-Wandler.

Typische Fehler

  • Nichts kommt an: TX und RX nicht gekreuzt oder Masse fehlt. Mit dem Oszilloskop am TX-Pin nachsehen, ob überhaupt gesendet wird.
  • Zeichensalat: Baudrate unterschiedlich eingestellt, oder der Controller läuft mit falschem Takt.
  • Uno lässt sich nicht mehr programmieren: Ein angeschlossenes Gerät treibt D0 gegen den USB-Wandler auf dem Board. Zum Hochladen abziehen oder ein anderes Pinpaar mit SoftwareSerial verwenden.
  • RS-232-Gerät direkt am Pin: ±12 V am Eingang beschädigen den Controller. Immer über einen Pegelwandler.
  • Gelegentliche Fehler bei 115 200 Baud am Uno: Summe der Baudratenfehler zu groß. 57 600 Baud versuchen.
  • RS-232-Ausgang bleibt bei wenigen Volt: Kondensator der Ladungspumpe fehlt oder sitzt am falschen Pin. Spannungen an Pin 2 und 6 nachmessen: etwa +5,5 V und −5,5 V.

Selbsttest

Wie lange dauert ein Zeichen im Format 8N1 bei 9600 Baud?

Zehn Bits zu je 104 µs, zusammen etwa 1,04 ms.

Welche Spannung bedeutet bei RS-232 eine logische 1?

Eine negative Spannung zwischen −3 und −15 V.

Wie groß ist der Baudratenfehler eines 16-MHz-Uno bei 38 400 Baud?

UBRR = 16 MHz / (8 · 38 400) − 1 ≈ 51,1 → 51; 16 MHz / (8 · 52) ≈ 38 462 Bd, also +0,2 %.

Warum darf TX nicht an TX?

Zwei Ausgänge arbeiten gegeneinander, keiner hört zu; es kommt keine Verbindung zustande.

Wozu braucht der MAX3232 Kondensatoren?

Seine Ladungspumpe erzeugt damit aus der Versorgung die positive und negative Spannung für die RS-232-Ausgänge.