@patrick1706: Da wird ein ganzer Zoo von Modulen importiert die überhaupt gar nicht verwendet werden‽
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
`exit()` dürfte es eigentlich gar nicht geben. Das ist nicht dokumentiert und ist nur da weil es das in der interaktiven Python-Shell gibt. Ansonsten muss man explizit `sys` importieren. Mit `sys.exit()` sollte man sparsam umgehen und das nur aufrufen wenn man tatsächlich einen anderen Rückgabecode als 0 an den Aufrufer zurückgeben möchte. Andernfalls ist das in der Regel ein Hack um sich um einen strukturierten Programmablauf zu drücken.
Die Ausnahmebehandlung ist schlecht. Wenn man nichts sinnvolles macht/machen kann, dann behandelt man Ausnahmen *gar nicht*. Alle Ausnahmen zu behandeln in dem man den Stacktrace unterdrückt macht die Fehlersuche nur unnötig schwer.
Zeichenkette und Werte mit ``+`` und `str()` zusammenstückeln ist eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode auf Zeichenketten und ab Python 3.6 f-Zeichenkettenliterale.
Serielle Schnittstellen gehören genau wie Dateien zu den Ressourcen die man ordentlich wieder aufräumen sollte. Also hier `close()` aufrufen wenn man fertig ist — was auch Ausnahmefälle mit einschliesst! `Serial`-Objekte machen das einfach weil sie Kontextmanager sind und mit ``with`` verwendet werden können.
Man sollte kryptische Abkürzungen bei Namen vermeiden. `ser` könnte man beispielsweise `serial_port` oder `connection` nennen.
Bei einem 20.000 Sekunden `timeout` würde ich wahrscheinlich einen Kommentar dazu schreiben wie lange das ist, also etwas über 5½ Stunden. Einige Schlüsselwortargumente dort haben explizit den Default-Wert übergeben. Kann man machen, muss man aber nicht.
Das *vor* dem Befehl ein Wagenrücklauf ("\r") gesendet wird statt *danach* ist komisch. Soll das so? Woran erkennt das externe gerät, dass der Befehl vollständig ist? Warum wird das in zwei Aufrufen gemacht?
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import serial
def main():
# Timeout of 5 hours, 33 minutes, and 20 seconds = 20,000 s
with serial.Serial(
port="COM9", baudrate=115_200, timeout=20_000
) as connection:
print("Serial port is open")
#
# TODO Really in this order?
#
connection.write(b"\r")
connection.write(b"reboot")
print("write data: reboot")
if __name__ == "__main__":
main()
Wie man die Antwort lesen kann hängt davon ab in welcher Form die kommt. Woher weisst Du wann die Antwort komplett ist?