Forum: PC-Programmierung PySerial - Verlust des ersten Zeichens nach PortOpen


von Florian (Gast)


Lesenswert?

Hallo Forum,

ich habe da einen merkwürdigen Fehler mit PySerial. Wenn ich den Port 
konfiguriere und dann öffne und 3 Zeichen sende, kommen beim ersten Mal 
nur 2 Zeichen an. Das erste Zeichen wurde verloren.
Wenn ich den Port dann schließe und ein 2. mal öffne und 3 Zeichen 
sende, kommen 3 Zeichen an.
Wenn ich den Port dann schließe und ein 3. mal öffne und 3 Zeichen 
sende, kommen wieder nur 2 Zeichen (ohne das erste) an.

So geht es immer im Wechsel.

Wenn ich allerdings eine gerade Anzahl Zeichen sende, geht niemals ein 
Zeichen verloren.

Auf dem Oszilloskop ist zu sehen, dass immer alle Zeichen korrekt 
gesendet werden.

Ich hatte schon "timeout" und "write_timeout" von None auf 0 umgestellt, 
das hat aber keine Wirkung.

OS: LinuxMint 21.2
Port: USB-TTL-Seriellwandler
Python: 3.8
PySerial: 3.5

Minimalbeispiel:
1
ser = serial.Serial()
2
ser.port = '/dev/ttyUSB0'
3
ser.baudrate = 9600
4
ser.parity = serial.PARITY_NONE
5
ser.bytesize = serial.EIGHTBITS
6
ser.timeout = 0
7
ser.write_timeout = 0
8
9
result = ser.open()
10
print(result)
11
time.sleep(0.1)
12
13
if result is None:
14
    for i in range(1):
15
        string = bytes('Hal', 'ascii')
16
        print(string)
17
        ser.write(string)
18
        # Selbes Verhalten mit:
19
        # ser.write("Hal".encode("utf-8"))
20
21
        time.sleep(0.2)
22
23
        print(f'SerOut: {ser.out_waiting}, SerIn : {ser.in_waiting}')
24
        print(f'Lesen: {ser.read(10)}')
25
26
        time.sleep(0.2)
27
else:
28
    print('Fehler beim Öffnen')
29
30
 ser.close()

Kann mir da jemand helfen? Danke im Voraus.

von Georg A. (georga)


Lesenswert?

Passiert das auch, wenn das rein per "bash" (stty für Baudrate/Parity + 
echo xyz > /dev/ttyUSB0) gemacht wird? Dann könnte der USB-Chip evtl. 
etwas "seltsam" sein.

von Frank K. (fchk)


Lesenswert?

Florian schrieb:

> Port: USB-TTL-Seriellwandler
Mach mal Pullup-Widerstände an TXD und RXD. Der Ruhepegel ist high, und 
das sollte er auch sein, bevor die UARTs ihre Pins initialisieren.

fchk

von Florian (Gast)


Lesenswert?

Danke für die Tipps.

Es ist auf jeden Fall vom Chip abhängig. Bei FTDI klappt alles wie 
erwartet. Bei meinem (alten) CH-341 passiert der oben beschriebene 
Wechsel und bei einem Prolific PL2303 fehlt sogar der gesamte erste 
String (getestet bei Länge 3).

Pullups bringen hier leider nichts, da "hinten" RS232 rauskommt. Und wie 
beschrieben war auf dem Oszilloskop alles wie erwartet zu sehen.

Und mit
1
stty -F /dev/ttyUSB0
 in einem Terminal und
1
tail -f /dev/ttyUSB0
 kommt nur mit dem FTDI alles korrekt an. Bei den anderen beiden habe 
ich überhaupt nichts erhalten. Das wird aber wohl an einer fehlenden 
Konfiguration mit stty liegen.

Da ich jetzt weiß, woher das Problem kommt, kann ich zumindest zukünftig 
darauf reagieren.
Mein längerfristiges Ziel ist die Kommunikation mit einem 
Mikrocontroller (sowohl Arduino als auch eigene Platinen) über 
USB-Wandler sowie Max3232. Und hier bin ich ja weitestgehend frei in der 
Wahl des Wandlers.

Für mich ist das Problem damit erst mal erledigt. Danke nochmal.

von Florian (Gast)


Lesenswert?

Da unterlief mir ein Fehler mit dem USB-TTL-Wandler. Ist ein 
USB-RS232-Wandler. Sorry.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.