24. Lektion: UARTAus Attraktor WikiVersion vom 29. Januar 2024, 14:49 Uhr von Kapest (Diskussion | Beiträge) Inhaltsverzeichnis
Was ist ein UART?UART steht für Universal Asynchronous Receiver Transmitter. Es handelt sich hierbei um die wohl älteste Schnittstelle in der Computerwelt. Sie wurde z.B. schon bei den Fernschreibern eingesetzt. Ursprünglich war sie für die Datenübertragung im Telefonnetz entwickelt worden.
inzwischen sind diese Normen identisch. RS232
Die Übertragungsgeschwindigkeit wird in Baud (Bits/Sekunde) angegeben.
Parity-BitDas Parity-Bit ist eine einfache Fehlerprüfung.
PegelDie Spannungspegel sind wie folgt zugeordnet:
Die Spannung kann 3...15V betragen. In der Microcontrollertechnik wird der Aufwand der positiven und negativen Spannungen nicht realisiert. Hier wird die Betriebsspannung (5V, 3V3) als Logisch 1 und GND als Logisch 0 verwendet. Das wird als TTL bezeichnet, in Anlehung an die digitale TTL Famile, die mit 5 Volt arbeitet. Synchron/AsynchronSynchronBei einer synchronen Übertragung werden Daten und Takt parallel übertragen, so dass die Daten immer mit dem Takt synchron sind. Selbst bei langen Übertragungen werden die Daten immer zum richtigen Zeitpunkt abgetastet. Beispiele hier für sind SPI und I2C. AsynchronBei der asynchronen Übertragung wird kein Takt übertragen. Deshalb muss das Timing von Sender und Empfänger sehr genau sein. Da sich ein Auseinanderlaufen des Timings bei Sender und Empfänger nicht vermeiden lässt, muss bei der asynchronen Übertragung immer wieder eine Synchronisierung zwischen Sender und Empfänger stattfinden. Dazu dient das Startbit. Wenn es vom Empfänger dedektiert wird beginnt sein Timing bei Null. Die Übereinstimmung vom Sender- und Empfängertiming muss dann nur noch << 8% sein. Die Klasse UART in MicropythonDie Klasse UART befindet sich im Modul >>> dir(machine.UART) ['__class__', '__name__', 'any', 'read', 'readinto', 'readline', 'write', '__bases__', '__dict__', 'CTS', 'INV_RX', 'INV_TX', 'RTS', 'deinit', 'flush', 'init', 'sendbreak', 'txdone'] >>> Eine Instanz erzeugen
Weitere Schlüsselwort Parameter sind:
Datenfluß Kontrolleflow gibt an, welche Hardware-Flusssteuerungssignale verwendet werden sollen. Der Wert ist eine Bitmaske.
Methoden zum Datentransfer
UART im Raspberry Pi Pico WIn Microcontrollern sind häufig USART's implementiert. Das sind UART's die auch synchrone Übertragungen ermöglichen.
Versuchsaufbau mit dem DemoboardUm auf dem Demoboard die serielle UART-Schnittstelle zu testen, muss an den Expansion-Anschlüssen eine Stecker- oder Buchsenleiste eingelötet werden. Dann müssen folgende Anschlüsse miteinander verbinden werden: Eine UART-Instanz erzeugenDie default Einstellungen für UARTs sind: >>> print(UART(0)) UART(0, baudrate=115200, bits=8, parity=None, stop=1, tx=0, rx=1, txbuf=256, rxbuf=256, timeout=0, timeout_char=1, invert=None) >>> print(UART(1)) UART(1, baudrate=115200, bits=8, parity=None, stop=1, tx=4, rx=5, txbuf=256, rxbuf=256, timeout=0, timeout_char=1, invert=None) Eine Instanz von UART hat folgende Eigenschaften: >>> from machine import UART >>> uart = UART(0) >>> print(uart) UART(0, baudrate=115200, bits=8, parity=None, stop=1, tx=0, rx=1, txbuf=256, rxbuf=256, timeout=0, timeout_char=1, invert=None) Wie man oben sieht ist die Initialisierung unter Verwendung der Defaultparameter sehr einfach. import machine uart0 = machine.UART(0) uart1 = machine.UART(1) SendenIm einfachsten Fall wird einfach ein String zur Übertragung angegeben: >>> uart0.write('Hallo!') 6 Zahlen können nicht so einfach übertragen werden. Sie müssen erst in einen String umgewandelt werden: >>> uart0.write(123456) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object with buffer protocol required >>> uart0.write(str(123456)) 6 >>> Empfangen>>> import machine uart0 = machine.UART(0) uart1 = machine.UART(1) >>> uart0.write('Hallo!') 6 >>> uart1.read() b'Hallo!' # oder: >>> uart1.read().decode('utf-8') 'Hallo!' Für die Übertragung muss der String in eine Bytefolge (Bytestring - b' ') umgewandelt werden. Das macht die .write() Methode intern. Die .read() Methode wandelt diesen aber nicht wieder zurück.
# mit str() >>> str(b'Hallo!', 'utf-8') 'Hallo!' # mit decode() >>> b'Hallo!'.decode('utf-8') 'Hallo!' Bytes in PythonBytes haben in Python, anders als in anderen Programmiersprachen, eine besondere Aufgabe. Sie dienen nur zur Aufbereitung von Werten für die serielle Datenübertragung. Hierbei werden die Werte Byteweise übertragen und die Werte dazu in Bytes zerlegt.
>>> 'Hallo!'.encode('utf-8') b'Hallo!' >>> >>> bytes('Hallo!', 'utf-8') b'Hallo!' >>> bytearray([25]) bytearray(b'\x19') # aber Achtung: >>> bytearray([260]) bytearray(b'\x04') >>> bytearray(5) bytearray(b'\x00\x00\x00\x00\x00') # Hier noch etwas zu bytearray: >>> b = bytearray(5) >>> b bytearray(b'\x00\x00\x00\x00\x00') >>> b[0] = 25 >>> b bytearray(b'\x19\x00\x00\x00\x00')
>>> enc = 'Hallo!'.encode('utf-8') >>> enc b'Hallo!' >>> enc.decode('utf-8') 'Hallo!' # oder: >>> str(enc, 'utf-8') 'Hallo!' >>> x = bytearray([260]) int.from_bytes(x, 'big') 4 Integer in Bytes und zurück# Integer in bytearray und zurück: >>> x = 5000 >>> y = x.to_bytes(5, 'big') >>> y b'\x00\x00\x00\x13\x88' >>> int.from_bytes(y, 'big') 5000 # Liste in bytearray und zurück: (Werte: 0 ... 255) >>> x = [1,2,3,4,5] >>> y = bytearray(x, 'big') >>> y bytearray(b'\x01\x02\x03\x04\x05') >>> list(y) [1, 2, 3, 4, 5] >>> int.from_bytes() hat drei mögliche Parameter. Währen das 2. und 3. in CPython als Keyword-Argument übergeben wird, sind in Micropython alle drei Position-Arguments. >>> bytes = b'\xAA\x00\x00\x00' integer = int.from_bytes(bytes, 'little', True) print(integer) 170 Bytes und StringsMöglichkeiten Strings in eine Bytefolge zu konvertieren: >>> text = 'Hallo Micropython auf dem Pico W.' >>> st1 = bytes(text, 'utf-8') >>> st1 b'Hallo Micropython auf dem Pico W.' >>> st2 = bytearray(text, 'utf_8') >>> st2 bytearray(b'Hallo Micropython auf dem Pico W.') >>> st3 = text.encode('utf-8') >>> st3 b'Hallo Micropython auf dem Pico W.' Von einer Bytefolge zurück zum String: >>> rt1 = str(st1, 'utf-8') >>> rt1 'Hallo Micropython auf dem Pico W.' >>> rt2 = st1.decode('utf-8') >>> rt2 'Hallo Micropython auf dem Pico W.' # geht auch vom bytearray: >>> rt3 = str(st2, 'utf-8') >>> rt3 'Hallo Micropython auf dem Pico W.' >>> rt4 = st2.decode('utf-8') >>> rt4 'Hallo Micropython auf dem Pico W.' Wenn String verarbeitet werden muss immer die Codierung angegeben werden! Bei Micropython ist das meist 'utf-8'. Bytes und IntegerInteger in ein Bytearray umwandeln. >>> bytearray(5) bytearray(b'\x00\x00\x00\x00\x00') >>> bytearray([5]) bytearray(b'\x05') >>> bytearray((5,)) bytearray(b'\x05') >>> x = 5 >>> x.to_bytes(5, 'big') b'\x00\x00\x00\x00\x05' >>> x.to_bytes(1, 'big') b'\x05' >>> 5.to_bytes(1, 'big') Traceback (most recent call last): File "<stdin>", line 1 SyntaxError: invalid syntax for number vom Bytearray zurück zum Integer >>> y = bytearray(5) >>> y[0] = 7 >>> y bytearray(b'\x07\x00\x00\x00\x00') >>> int(y) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid syntax for integer with base 10 >>> int.from_bytes(y) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: function missing 1 required positional arguments >>> int.from_bytes(y, 'big') 30064771072 >>> hex(int.from_bytes(y, 'big')) '0x700000000' Bytes und ListenLinks:
Zurück zur "Micropython Kurs 2023 Teil 2" Startseite |