Pyserial timeout

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
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Hey,

ich hab eine Serielleschnitstelle von der ich Daten erhalte.

Problem:

Wenn ich keine Daten erhalte wirkt mein timeout nicht. Warum aber?? :D

Code: Alles auswählen

import serial

s=serial.Serial()

s.port = 'COM1'
s.baudrate = 9600
s.bytesize = 7
s.stopbits = serial.STOPBITS_ONE
s.parity= serial.PARITY_EVEN
s.rtscts = True
s.timeout = 20
s.open()

CAB_DATEN = []

while True:
     serial_line = s.readline().decode("utf-8")
     CAB_DATEN.append(serial_line)
     if(serial_line == 36):
          break
Laut meines Verständnisses müsste das Skript, wenn keine Daten kommen, nach 20 Sekunden aus der while-Schleife rausspringen.
Habe ich hier einen Denkfehler ?
Zuletzt geändert von Kirikkayis am Donnerstag 1. August 2019, 12:29, insgesamt 2-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Du solltest "while True" statt "while 1" verwenden.

Was genau sollte deiner Meinung in deinem gezeigten Code dazu führen, dass der timeout zu einem Verlassen der Schleife führt?
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Naja wenn nach 20 Sekunden nichts ankommt solls abbrechen??
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Das beantwortet meine Frage nicht:

Was meinst du, führt in deinem Code dazu, dass bei einem Timeout die Schleife verlassen wird?


Der Timeout sorgt dafür, dass der Code fortgesetzt wird, wenn der Timeout erreicht wird. Bis dahin blockiert der Code an der entsprechenden Stelle.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kirikkayis: Wie sieht denn Dein *tatsächlicher* Code aus, denn der da verlässt die ``while``-Schleife beim ersten `readline()` mit einer `SerialException` weil der Port nicht geöffnet wird.

Die Klammern beim ``if`` gehören da nicht hin.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

__blackjack__ hat geschrieben: Donnerstag 1. August 2019, 12:20 @Kirikkayis: Wie sieht denn Dein *tatsächlicher* Code aus, denn der da verlässt die ``while``-Schleife beim ersten `readline()` mit einer `SerialException` weil der Port nicht geöffnet wird.

Die Klammern beim ``if`` gehören da nicht hin.
Hast recht, hab falsch abgeschrieben (muss alles abtippen da ich auf dem anderen Laptop kein WLAN hab :D )
Nun sollte der Code richtig sein.

Hab eben folgendes probiert:

Code: Alles auswählen

if(s.timeout):
     sys.exit("TIMEOUT")
Funktioniert auch, frage ist ob man das so macht :S
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Eben erzählt __blackjack__ dir noch, dass bei dem if keine Klammern hingehören (und das nicht zum ersten Mal), du zitierst das sogar und setzt dann doch wieder welche.
Dann rätst du wild irgendwelchen völlig absurden Code.

Was ist denn s.timeout?!? Hast du das mal geprüft?

Arbeite ein vernünftiges Tutorial durch, um die Grundlagen zu lernen. Die offizielle Dokumentation hat eines. Programmieren funktioniert nie durch raten.

Bei so wenig Eigeninitiative zum Lernen und Umsetzen bin ich raus.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kirikkayis: Man kann Rechner sofern die Schnittstellen vorhanden sind auch per seriellem Kabel verbinden wenn sie kein Wifi haben. 😉

USB? Auch kein Bluetooth? Lautsprecher und Mikrofon zum Morsen (oder ähnliches)? QR-Code anzeigen auf dem einen Rechner, Webcam auf dem anderen? Alles ist besser als abtippen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

@sparrow deine Schreibweise ist einfach nur frech.

Ich habe hier kein Thema eröffnet um von dir fertig gemacht zu werden.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

edit: war leider mist verzapft. deswegen ist folgende aussage falsch.
du musst try: und except SerialTimeout: (hoffe habs richtig im kopf) nehmen.
dein timeout ist immer wahr, da du es ja auf 20 setzt.
Zuletzt geändert von harryberlin am Freitag 2. August 2019, 11:10, insgesamt 1-mal geändert.
empty Sig
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Leider nein, harryberlin. Bei einem gessetzten timeout kehrt der read-Aufruf einfach nur zurueck, mit den bis dahin gelesenen Bytes. Im Zweifel eben b"".
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

ok, habs editiert, dann sollte geprüft werden was man zurück bekommt bzw. nicht zurück bekommt.
empty Sig
Antworten