Serial Problem nach Umstieg auf Python3

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
HeAdLeSs
User
Beiträge: 22
Registriert: Dienstag 8. März 2016, 09:22

Hallo zusammen.

Ich bin gerade von Python2 auf 3 umgestiegen. Ich habe eigentlich nur ein Projekt. Das ist jedoch etwas größer. Das meiste funktioniert wieder top. Nur ein Script will nicht.
Es liest, per Serieller Schnittstelle, einen Victron Batteriemonitor aus. (ve.direct)
Der Fehler scheint darin zu liegen das serial.read jetzt Byte zurück gibt. Bei Python2 war es wohl einfach ein String.

Soweit ich gelesen habe ist der Fix dafür das Decoden des Bytes. Also habe ich folgende Zeile hinzugefügt:

Code: Alles auswählen

byte = self.ser.read(1)
byte = byte.decode("utf-8")
Damit funktioniert das Script erst einmal wieder. Doch von Zeit zu Zeit gibt es den Fehler:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Es kommen also Bytes rein die nicht in UTF-8 decodiert werden können. Also ist einfach "decode("utf-8")" nicht das non plus ultra.
Soweit ich gesehen habe kommen diese Zeichen immer in der Checksum rein. Kann aber auch jetzt nur Zufall sein. Der byte variiert auch.
Gibt es einen besseren Weg?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt zwei Ursachen fuer diese Probleme:

- es sind gelegentliche Fehluebertragungen.
- es ist Teil des Protokolls (wie du ja schon sagst, so etwas wie Pruefsummen)

Wenn ersteres, dann ist der DecodeError im Grunde egal - du kannst den nutzen, um ihn abzufangen & zu sagen "ok, ist halt ungueltig, ich nehme das nicht".

Wenn es zweiteres ist, sollte das natuerlich eigentlich vernuenftig programmiert werden. D.h. du verrechnest die Daten auf byte-Ebene um zu ermitteln, ob die Uebertragung gueltig war oder nicht. Nur wenn sie gueltig war, nimmst du den Teil der Nachricht, der die eigentliche Nutzlast darstellt, und dekodierst den.
HeAdLeSs
User
Beiträge: 22
Registriert: Dienstag 8. März 2016, 09:22

Habe es jetzt so gemacht. Wenn ich einen Error beim Konvertieren bekomme, dann verwerfe ich den kompletten Datensatz und warte auf den nächsten. Ich vermute dann kommt da mist rein.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@HeAdLeSs: Du hast keine UTF8-kodierten Daten, versuch also nicht sie so zu dekodieren. Wenn es eine Checksumme ist, dann sind das WIRKLICHE Bytes und nicht irgendwelche Zeichen. Du mußt halt dann das binäre Protokoll richtig implementieren und nicht nur irgendwas auf gut Glück ignorieren.
HeAdLeSs
User
Beiträge: 22
Registriert: Dienstag 8. März 2016, 09:22

So habe ich es am Ende dann auch gemacht.
Antworten