@nccbk: Allgemeine Anmerkungen zum Quelltext:
Über die Hälfte der Importe werden gar nicht verwendet. `count` wird an eine 0 gebunden aber auch überhaupt nicht verwendet. `ID` wird zweimal viel zu früh und unnötig an eine leere Zeichenkette gebunden. `Zeichen` wird zu früh unnötig an den Wert 0 gebunden. Das kann alles ersatzlos weg.
Die Namensschreibweisen entsprechen nicht alle dem
Style Guide for Python Code.
„Magische” Zahlen sollte man vermeiden. Wenn es einen Zahlwert mit einer Bedeutung gibt, die man nicht an der Zahl selber erkennen kann, dann sollte man dafür eine Konstante mit einem aussagekräftigen Namen verwenden. Das betrifft zum Beispiel die 24 überall dort wo sie als Nummer des IO-Pins verwendet wird an der der Taster hängt. Zusätzlicher Vorteil: Wenn man den mal an einen anderen Pin anschliesst muss man im Programm nur eine einzige Stelle ändern wo die Konstante definiert wird, und nicht das ganze Programm nach dem alten Wert durchsuchen und überall wo er die Pin-Bedeutung hat, durch den neuen Wert ersetzen.
Kommentare sollten dem Leser Zusatzinformation bieten und nicht das offensichtliche noch einmal wiederholen was man im Code lesen kann. Üblicherweise sollte man nur Kommentieren *warum* Code etwas bestimmtes tut und nicht *was* er tut. Wenn man erklären muss *was* er tut besteht die Chance das die Namen schlecht gewählt sind oder der Code schlecht organisiert ist, wenn man an ihm nicht ablesen kann was er tut.
`Serial`-Objekte bei denen man einen Port angegeben hat sind bereits im Zustand offen. Darauf `open()` direkt nach dem Erstellen aufzurufen macht keinen Sinn. Man sollte aber wie bei Dateien darauf achten, dass die serielle Verbindung auch wieder geschlossen wird. Auch bei so einer Endlosschleife, denn die kann ja durch Fehler oder den Benutzer abgebrochen werden. Da ist es sauberer wenn man selbst dafür sorgt, dass die Verbindung zeitnah geschlossen wird.
``while`` ist keine Funktion, also sollte man es nicht so schreiben wie Funktionsaufrufe. Überhaupt sind die Klammern um die Bedingung unnötig. Bei `print()` dagegen sollte man kein Leerzeichen zwischen den Funktionsnamen und die öffnende Klammer setzen, das ist eine Funktion wie jede andere auch.
Wahrheitswerte explizit mit literalen Wahrheitswerten zu vergleichen ergibt wieder nur einen Wahrheitswert und ist deshalb schlechter Stil, weil unnötig. Wenn man auf das Gegenteil eines Wahrheitswerts prüfen möchte gibt es ``not``.
Die Schleife zum Lesen ist unnötig kompliziert geschrieben. Du liest sowohl vor als auch in der Schleife Bytes. Dadurch wird ein klein wenig verschleiert das 14 und nicht 13 Bytes gelesen werden. Man könnte eine ``while``-Schleife schreiben die aufhört wenn 14 Bytes gelesen wurden, dann muss der Leseaufruf nur in der Schleife stehen und das überflüssige `counter` wird nicht mehr benötigt. Man kann aber auch ganz einfach die Anzahl der zu lesenden Bytes an den `read()`-Aufruf als Argument übergeben.
Ich bin dann bei so etwas (ungetestet):
Code: Alles auswählen
from contextlib import closing
from serial import Serial
import RPi.GPIO as GPIO
TASTER_PIN = 24
def main():
GPIO.setmode(GPIO.BCM)
GPIO.setup(TASTER_PIN, GPIO.IN)
with closing(Serial('/dev/ttyAMA0', 9600)) as uart:
while not GPIO.input(TASTER_PIN):
id_ = uart.read(14)
print('ID: ', id_[4:10])
if __name__ == '__main__':
main()