Table of Contents
Motivation
Wenn man Daten über eine serielle Schnittstelle zwischen z.b Raspberry Pi und einem Arduino schicken will,
ergibt es Sinn, sich über das Format Gedanken zu machen. Angenommen wir wollen einen Drehzahlwert von 60 RPM jeweils für die linke und rechte Seite übertragen.
Standardmäßig verschickt eine Bibliothek wie pyserial ASCII-Zeichen, dass heißt eine Zahl wie 60 würde als zwei Byte ASCII übertragen. Das sind doppelt so viele Daten wie benötigt würden, wenn wir die Zahl als Integer übertragen. Hier kommen structs ins Spiel.
struct for the rescue
Mit dem struct Modul in Python können wir Binärdaten in einem bestimmten Format packen und entpacken.
def test_struct_b():
assert struct.pack('b', 1) == b'\x01'
assert struct.pack('b', 127) == b'\x7f'
assert struct.pack('b', -128) == b'\x80'
def test_unpack_b():
packed = struct.pack('b', 127)
unpacked = struct.unpack('b', packed)[0]
assert unpacked == 127
Mehrere Variablen
def test_struct_bb():
msg = struct.pack('bb', int(60), int(60))
assert msg == b'\x3C\x3C'
Fallstricke
Damit die Empfängerseite die Daten auch wieder korrekt entpacken kann, muss natürlich das Format beachtet werden.
Achtet dementsprechend auf gute Dokumentation und versioniert idelaerweise die Dateien für die Datenübertragung in den gleichen Commits.
Datentypen
In structs können verschiedene Datentypen verwendet werden:
Tabelle der wichtigsten Datentypen:
| Zeichen | Datentyp | Wertebereich |
|---|---|---|
| b | signed char (1 byte) | -128 bis 127 |
| B | unsigned char (1 byte) | 0 bis 255 |
| h | signed short (2 bytes) | -32768 bis 32767 |
| H | unsigned short (2 bytes) | 0 bis 65535 |
| i | signed int (4 bytes) | -2147483648 bis 2147483647 |
| I | unsigned int (4 bytes) | 0 bis 4294967295 |
| f | float (4 bytes) | IEEE |
| d | double (8 bytes) | IEEE |
Pretty hex
Wenn man die Darstellung der Zahlen auf der Konsole oder im Log etwas aufhübschen will:
def test_pretty_hex():
msg = struct.pack('>I', 2864434397)
pretty_hex = ' '.join(f'{b:02x}' for b in msg)
assert pretty_hex == "aa bb cc dd"






