Seite 1 von 1

serial.Serial() - read_until() timeout problem

Verfasst: Donnerstag 30. November 2023, 18:09
von bachatero18
Moin Zusammen,

ich hab ein kleines Problem.

Und zwar rufe ich untenliegende methode auf und eig. ist es so Gedacht, dass nach Timeout X oder nach read_until(expected=\\r, size=None)
weitergegangen wird und das funktioniert auch soweit. Das Problem ist ab und zu kommen sich der Timeout und das read_until() in die quere.

Wenn etwas auch der Schnittstelle gelesen wird kurz bevor der timeout abgelaufen ist schneidet er mit die Nachricht auseinander was schlecht ist.

Die eig. Nachricht wäre dann z.b "a:test\r" und lesen tue ich dann z.b "a:t" und "est\r".

Jetzt stell ich mir die Frage ok wie bekomme ich das hin, keinen Timeout zumachen (timeout=None) d.h er warte bei read_until() so lange bis das endzeichen erkannt wird udn geht dann weiter. Problem ist natürlich wenn ich das Programm schließen will dann kann er die Comports nicht deinitialisieren, da er ja in dem Thread noch den Comport verwendet.

Habt ihr eine elegante möglichkeit?

Code: Alles auswählen

def serial_messages(self):
        while not self.interrupt:
            command = self.com_programm.read_until(expected=LF, size=None).strip()
            if command.decode('utf-8') != "": 
                # do something

Re: serial.Serial() - read_until() timeout problem

Verfasst: Donnerstag 30. November 2023, 18:23
von __deets__
Die Funktionen sind fundamental inkompatibel zueinander. Da der timeout das wichtigere ist, kannst du nur den beibehalten, und musst einfach lesen, was reinkommt. Das dann in einen Buffer speichern, und selbst darauf analysieren, of LF vorkommt. Das Kommando rausloesen, den Buffer verkleinern, und Kommando abarbeiten, und weiter gucken, ob noch vollstaendige Kommandos drin sind. Denn es koennte ja sein, dass mal auf einen Schwall mehrerere kommen.

Re: serial.Serial() - read_until() timeout problem

Verfasst: Donnerstag 30. November 2023, 18:40
von bachatero18
Genau deshalb will ich ja eben nicht den Timeout nehmen bzw. den auf None stellen.

Das rs232 protokol sagt ja nun mal das Endzeichen und das ist definiert warum sollte ich jetzt anfangen mir da etwas zusammenzubastel und alles auf der Schnittstelle nehmen was da ist da kann ich ja ganz bequem commando für commando nehmen. Dafür sind Protokolle ja da.

Re: serial.Serial() - read_until() timeout problem

Verfasst: Donnerstag 30. November 2023, 18:49
von __deets__
Wenn es nur um das beenden geht, kannst du auch den Thread auf daemon=True stellen, dann haelt der das beenden nicht auf.

Und den timeout stellst du doch ein, dann setz ihn doch auf None?

Re: serial.Serial() - read_until() timeout problem

Verfasst: Donnerstag 30. November 2023, 19:05
von bachatero18
geht leider nicht nur ums beenden sondern auch um einen Button klick der es ermöglichen soll die comport frei zu geben und nochmal umzukonfigurieren

Re: serial.Serial() - read_until() timeout problem

Verfasst: Donnerstag 30. November 2023, 19:16
von __deets__
Dann wirst du eben mit einem Timeout arbeiten muessen, und ohne read_until auskommen. Wie im ersten Beitrag beschrieben. Das kommt sich nunmal in die Quere.