pyserial eingehende Signale

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Hallo, ich stehe vor der Frage wie ich das realisiere,.
Ich möchte, wenn auf Serial eine Nachricht rein kommt etwas auslösen was ich im Python Script verarbeiten kann.

Bisher hatte ich pyserial erfolgreich mit einer while Schleife getestet, das ein print auslöst sobald eine Meldung rein kommt.
Nun muss ja 24/7 das Script laufen.
Gibt es da andere Varianten mittels Python oder kann ich per UDEV dann ein Script starten?
Was wäre sinnvoller?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum kann dein Skript nicht dauernd laufen?

Mit UDEV hat das nichts zu tun, und das kann da auch nicht helfen.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

OK wenn das nichts macht dann ist ja gut. :)
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Wenn eine Nachricht in Pyserial rein kommt soll etwas ausgeführt werden.
Ich habe das jetzt so gelöst:

Code: Alles auswählen

while 1:
    if serial.readline():
        print("ok")
Gibt es da eine "check-Methode" oder kann man das so lassen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kann man so lassen. Der wartet ja, bis was kommt. Wenn selten was kommt, dann wartet er lang.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Alles klar. Vielen dank.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die 1 ist komisch, da würde ich `True` erwarten. Und ich würde nicht ``while`` + `readline()` verwenden, sondern ``for``:

Code: Alles auswählen

for line in serial:
    if line:
        print("ok")
Wobei das ``if`` soweit ich das sehe voraussetzt, dass man bei der seriellen Verbindung ein Timeout angegeben hat — was zumindest bei diesem Code keinen Sinn macht, denn ohne Timeout wäre das einfach nur:

Code: Alles auswählen

for _ in serial:
    print("ok")
Weil man dann die leeren Antworten nicht mehr berücksichtigen/raus filtern muss die bei einer Zeitüberschreitung entstehen
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

@__blackjack__ Ich habe in Serial keinen Timer verwendet.
Aber deine Lösung sieht etwas sauberer aus wie meine und es funktioniert auch.
Antworten