Arduino Serielle Kommunikation: UART-Grundlagen & Troubleshooting meistern
Arduino Serial: Serielle Kommunikation mit Arduino
Hintergrund: Parallele vs. Serielle Kommunikation
Mikrocontroller kommunizieren über 8-Bit-Datenbusse. Parallele Übertragung bräuchte 8 Leitungen + Steuerleitungen → teuer, störanfällig bei langen Leitungen. Lösung: Serielles Protokoll – nur 3 Leitungen (TX, RX, GND). 8 Bit werden per Shift-Register (PISO) serialisiert, am Empfänger per SIPO wieder parallelisiert.
Zwei Betriebsarten: Synchron (Blockweise, Taktleitung) & Asynchron (Byteweise, Start/Stopp-Bits, kein geteilter Takt). Asynchron ist Standard (UART).
Übertragungsmodi
- Simplex: Nur Senden
- Halbduplex: Senden oder Empfangen (nicht gleichzeitig)
- Vollduplex: Gleichzeitiges Senden & Empfangen
RS-232 & Framing
Serielles Protokoll ≈ RS-232. 1 Datenbyte wird gerahmt: Startbit (0) + 8 Datenbits + Parität (optional) + Stoppbit(s) (1). Ursprünglich für PC-Ports (±12 V Pegel). Für TTL-Logik (0/5 V) Pegelwandler nötig (z. B. MAX232). Arduino hat USB-UART-Brücke onboard – direkte PC-Verbindung per USB, keine externen Pegelwandler nötig.
Wichtigste Arduino-Serial-Funktionen
| Funktion | Beschreibung |
|---|---|
Serial.begin(baud) | Serielle Schnittstelle initialisieren (Baudrate, z. B. 9600). In setup(). |
Serial.available() | Prüft, ob Empfangsdaten im Puffer: 0 = nein, >0 = Anzahl Bytes. |
Serial.read() | Liest 1 Byte aus Puffer. Rückgabe: int (-1 wenn leer). Hinweis: Sendet man ASCII '1', liest man 49 (Dezimalcode). |
Serial.print(val) / Serial.println(val) | Daten an PC senden (ln = mit Newline). Formatierung: DEC, HEX, BIN, etc. |
Serial.flush() | Wartet, bis Sende-Puffer leer ist (seit IDE 1.0). Nicht „Puffer leeren“! |
Serial.write(val) | Rohdaten (Byte) senden. |
Serial.readString() | Liest String bis Timeout. |
Serial.parseInt() | Parst Integer aus Serial-Stream. |
Praxisbeispiel: Echo mit LED-Steuerung
const int ledPin = 13;
char incomingByte;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read(); // Byte lesen
Serial.print("Empfangen: ");
Serial.println(incomingByte); // Echo zurück
if (incomingByte == '1') digitalWrite(ledPin, HIGH);
if (incomingByte == '0') digitalWrite(ledPin, LOW);
}
}
Öffnen Sie den Seriellen Monitor (Strg+Shift+M), stellen Sie 9600 Baud ein, senden Sie '1' oder '0' → LED schaltet, Echo erscheint.
Tipps & Häufige Fehler
- Baudrate Sender = Empfänger (Standard 9600, 115200, 38400 …)
Serial.read()liefertint, nichtchar– bei Vergleich auf '0'/'1' casten odercharVariable nutzen- ASCII vs. Binär:
Serial.print(65)sendet „65“,Serial.write(65)sendet Byte 0x41 ('A') - Pufferüberlauf vermeiden:
Serial.available()regelmäßig prüfen & lesen - Hardware-Serial (Pin 0/1) vs. SoftwareSerial (andere Pins, langsamer, unzuverlässiger)
- Bei USB: DTR-Reset beim Öffnen des Monitors – evtl. 1–2 s warten oder Auto-Reset deaktivieren
Weiterführende Themen
- PIC18 in C programmieren
- MAX232: Aufbau, Betrieb, Typen, Anwendung
- 10+ Online Design- & Simulationstools
- 15 Android-Apps für Elektro/ Elektronik
- Clap-Switch mit 555-Timer
- Angebrannten Widerstandswert bestimmen
Industrietechnik
- MQTT vs. DDS: Das richtige M2M-Protokoll für IoT wählen
- Industrial IoT Communication: 6 bewährte Infrastruktur-Protokolle
- Datenfluss verstehen: Von Simplex bis Voll-Duplex-Kommunikation
- Optische Datenkommunikation: Licht für hochbandbreiten, störungsfreie Übertragung nutzen
- Netzwerkprotokolle verstehen: Von der Physikalischen Schicht bis zu fortgeschrittener Arbitration
- Mikroprozessoren: Die Evolution des Stored-Program-Computing
- Nahtlose Arduino–Raspberry Pi 2 I2C-Integration für IoT-Sensorprojekte
- Kabellose Datenübertragung per Magnetfeld: Arduino & Infineon 3D-Sensor (TLE493D)
- Kommunikationshilfe für Taubblinde: 1Sheeld + Arduino + Sprachausgabe & Anzeige
- Arduino Temperatur- & Feuchtelogger mit DHT11 & Ethernet Shield