serial.Serial() - read_until() timeout problem

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
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten