pyserial unicode byte

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
frisei
User
Beiträge: 9
Registriert: Montag 8. April 2013, 14:20

Freitag 25. April 2014, 14:28

Hallo Forum
es geht hier um eine serielle uebertragung mittels 2 usb2serial-wandler
das Sendeteil soll eine uP-Schaltung emulieren.
hier verwendet: mini-usb-uart-umsetzer UM2102 von elv
die beiden teile sind mit txd<-->rxd und rxd<-->txd und gnd verbunden.
ascizeichen (<127) werden korrekt uebertragen,
aber umlaute verursachen einen abbruch
was ist hier nicht richtig, dass umlaute nicht funzen

fehlermeldung bei empfangs-programm:

print(rec.decode('utf-8'),end='')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: unexpected end of data

und beide kurzprogramme, die natuerlich getrennt laufen muessen (2 Dateien)

Code: Alles auswählen

# sendeprogram
import serial
portx="COM4"  #usb2serial
ser1=serial.Serial(portx,baudrate=38400,
                    bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE,
                   stopbits=serial.STOPBITS_ONE, timeout=None, xonxoff=False,
        rtscts=False, writeTimeout=None,
                   dsrdtr=False, interCharTimeout=None)
while tuesenden:
    tosend=input("eingabe bis CR >> ")
    tosend=tosend+'\n'
    if tosend=="exit":
        tuesenden=False
    ser1.write(tosend.encode('utf-8'))

Code: Alles auswählen

#########################################################
#empfangs-program
import serial
portx="COM3"  #usb2serial
ser1=serial.Serial(portx,baudrate=38400,
                    bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE,
                   stopbits=serial.STOPBITS_ONE, timeout=None, xonxoff=False,
        rtscts=False, writeTimeout=None,
                   dsrdtr=False, interCharTimeout=None)
while True:
    rec=ser1.read()
    print(rec.decode('utf-8'),end='')
hoffe dass der codeschipsel aussagefähig genug ist.
vermute dass das sendeteil aus dem umlaut mehr bytes macht und das empfangsteil es nicht zusammensetzen kann,
bin aber mit meinem latein am ende.
(warten bis der ganze string bis cr uebertragen ist und dann erst wieder ausgeben ist suboptimal.)
mit freundlichem Gruss
Fritz
Zuletzt geändert von Anonymous am Freitag 25. April 2014, 14:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

Freitag 25. April 2014, 14:41

@frisei: In UTF-8 werden Zeichen ausserhalb von ASCII mit mehr als einem Byte kodiert. Und um so ein Zeichen dann wieder dekodieren zu können braucht man schon alle Bytes die zu dem Zeichen gehören. Das versucht die Ausnahme ja auch zu sagen: Beim dekodieren ist plötzlich ein unerwartetes Ende der Daten, weil nicht alles für ein komplettes Zeichen vorliegt.

Beim Sendeskript ist übrigens ein Fehler: Man kann das nicht beenden, denn `tosend` wird in Zeile 12 offensichtlich niemals den Wert 'exit' haben können.

Bei der Schleife hätte ich übrigens eine ”Endlosschleife” (``while True:``) geschrieben und die dann bei einer bestimmten Benutzereingabe mit ``break`` abgebrochen. Damit spart man sich das `tuesenden`, was nebenbei gesagt ein schrecklicher Name ist. ;-)
Antworten