Arduino Mikrocontroller Tutorials - Schnittstellen

Serielle Schnittstelle (UART)

UART Busaufbau

Die serielle Schnittstelle (en. UART = Universal Asynchronous Receiver Transmitter) ist ein Bus zur einfachen Übertragung von Daten zwischen zwei Busteilnehmern. Die Übertragung funktioniert gleichberechtigt asynchron (also nicht gleichzeitig) in beide Richtungen. Für jede Übertragungsrichtung gibt es eine Leitung. Der TX Ausgang des einen Gerätes sendet die Daten an den RX Eingang des anderen Gerätes. Zum Anschluss muss man also nur die RX und TX Pins überkreuzt verbinden. Neben RX und TX wird auch eine gemeinsame Masse angeschlossen.

Da der UART Bus keine Clock-Leitung verwendet über welche sich der Empfänger synchronisieren könnte muss die Übertragungsrate vorab beiden Teilnehmer bekannt und identisch sein. Werden zum Beispiel 9600 bauds/Sekunde vereinbart weiß der Empfänger, dass er - sobald der Bus den Idle Zustand verlässt - alle 104µs (1000000 µs / 9600) den Pegel auf eine logische '1' oder '0' abfragen muss. Auch der Aufbau des UART Protokolls, vor allem die Anzahl der Nutz- und Stopbits oder ob ein Paritätsbit mitgesendet wird muss beiden Teilnehmern bekannt sein. Als Standard werden 8 Nutzbit, kein Paritätsbit und nur ein Stopbit gesendet.

Die Arduino Schnittstellen

Der Arduino hat eine Hardware Schnittstelle die am Pin 0 und 1 eingeschaltet werden kann. Der Mega hat in Summe 4 seriellen Schnittstellen. Neben den hardwarebasierten Schnittstellen kann mit der Bibliothek SoftwareSerial.h eine UART Schnittstelle auch emuliert werden (bis max 115200 bauds/s). Neben den hier abgebildeten häufigsten Befehlen gibt es noch einige andere in der Arduino Referenz.

Serial.begin(Baudrate, Datenframe (opt)

Der name Serial bezieht sich auf die erste hardware Schnittstelle des Arduinos. Gibt es wie beim Mega mehrere Schnittstellen werden diese mit Serial, Serial1, Serial 2, ... angesprochen. Für die Angabe des Datenframes gibt es in der Arduino Referenz mehrere mögliche Konstanten die man hier angeben kann. Man ändert damit die Nutzbits, die Anzahl der Stopbits (also der Pausen zwischen zwei Bytes) und ob ein Paritätsbit im Anschluss an die Nutzdaten mitgesendet werden soll. Ohne diese optionale Angabe wird ein Byte ohne Paritätsbit gesendet. Eingerahmt von einem Start und nur einem Stopbit werden also in Summe 10 bit übertragen. Bei der emulierten Schnittstelle kann der Datenframe nicht eingestellt werden.

Serial.end()

Mit diesem Befehl stoppt man die hardware Schnittstelle. Die Pins stehen anschließend wieder für andere Aufgaben zur Verfügung.

Serial.available()

Gibt die Anzahl der im Eingangsbuffer verfügbaren Bytes bzw. Zeichen zurück. -1 bedeutet, dass keine Daten im Buffer stehen. Häufig wird der Befehl mit if (Serial.available() > 0) {...} eingesetzt.

Serial.write()

Mit dem write() Befehl werden binäre Daten in der Größe eines Bytes übertragen. Nach dem Startbit wird das LSB zuerst gesendet. Folgende Angaben sind möglich: Direkt binär write(B11001101), als Zahl (0-255) write(124) oder mit einem vorher definierten byte-Array write(buffer,Länge). Mehrere hintereinander gesendete Bytes sind nur durch die Stopbits des vorhergehenden und das Startbit des nächsten Bytes getrennt.

Oszibild print() Befehl für 12 Oszibild print() Befehl für 12

Serial.print() und Serial.println()

Im Gegensatz zum write() Befehl wird mit dem print() Befehl der ASCII Code übertragen. Anstatt einer "1" wird also 49 übertragen. Für "12" werden 2 Bytes gesendet. 49 für die "1" und 50 für die "2".

Beim println() Befehl werden am Ende der Datenbytes noch ein Byte mit dem Wert 13 (ASCII Steuerzeichen für Carriage Return (=Wagenrücklauf) und ein Byte mit dem Wert 10 (ASCII Steuerzeichen für Line Feed (=Zeilenvorschub) angehängt. Das Ausgabegerät weiß dadurch, dass weitere Zeichen am Anfang in der folgenden Zeile ausgegeben werden soll.

Serial.read()

Dieser Befehl liest ein Byte aus dem hardware Eingangs-Buffer.

Serial.readString()

Dieser Befehl liest den kompletten Eingangs-Buffer und speichert ihn in einem String