pySerial inWaiting gibt falsche Anzahl von bytes
Ich habe ein einfaches Programm zum testen serieller Funktionalität. Mein serielles Gerät reagiert auf zwei Eingänge. Wenn der Benutzer ein 'a', antwortet er mit 'fg'. Wenn der Benutzer andere Zeichen/byte, antwortet er mit 'z'. Wenn ich 'b' an das serielle Gerät, wird es wieder 'z' just fine. Wenn ich send 'ein', sollte es wieder die beiden 'f' und 'g', also zwei bytes statt nur einem.
Siehe code unten.
#!/usr/bin/env python
import serial
ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS
)
ser.write('a')
byteData = ser.read(1) # read one, blocking
moreBytes = ser.inWaiting()
if moreBytes:
byteData = byteData + ser.read(moreBytes)
print byteData
print byteData
ser.close()
Ausgabe :
user@ubuntu:~/code/native$ ./serialTesting.py
f
inWaiting() gibt den Wert 0, so wird es niemals liest das zweite byte. Wenn ich eine kleine änderung am code, und manuell Lesen Sie die beiden erwarteten bytes, funktioniert es einwandfrei.
#!/usr/bin/env python
import serial
ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS
)
ser.write('a')
byteData = ser.read(2) # read two expected bytes for the result 'fg'
print byteData
ser.close()
Die Ausgabe ist wie erwartet:
user@ubuntu:~/code/native$ ./serialTesting.py
fg
InformationsquelleAutor user791953 | 2013-10-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei annehmbare Lösungen für diese. Für entweder, müssen Sie ein Zeitlimit wie jramirez schon angedeutet:
Lösung 1: Einfach und wirksam
Lesen bis zu 800 Byte und wird nicht mehr Zeit als die
timeout
Sie sich gesetzt haben. Wenn Sie haben stattdessen auf eininter_byte_timeout
,read()
warten, bis diese Menge an Zeit für jede single byte.Dies ist eine schnelle Lösung für die Fälle, wo man nur erhalten, ein Stück von Daten bekannter maximaler Größe.
Lösung 2: Den richtigen Weg
Das code-snippet oben ist lizensiert unter CC0 1.0.
Und dann zu Lesen:
Grundsätzlich, Lesen Sie Ihre Daten in Blöcken und warten Sie jedes mal, um zu sehen, ob neue Charaktere erschienen. Wenn weniger Zeichen gelesen wurden, in der Zeit von
timeout
wurde, wird die übertragung als beendet.Diese Lösung funktioniert immer, auch wenn Sie erhalten eine Menge von Daten oder, wenn Sie es erhalten sehr langsam.
InformationsquelleAutor iFreilicht
könnte es auch sein, denn die übertragungsrate ist sehr langsam. Sie sind der Verarbeitung der inwaiting() aufrufen, bevor das zweite byte wird an den Puffer. Wenn Sie tun, ser.Lesen(2) Sie wartet(blockiert) bis 2 bytes, die empfangen wurden somit, warum es funktioniert. Versuchen Sie es mit einem timeout von 1 Sekunde, das sollte dein problem lösen.
inWaiting
liest immer 0. Mit der wxTerminal.py Beispiel in der pyserial-website. Ein paar Ideen ?Ich empfehle Ihnen, schreiben Sie eine Frage in SO und jemand kann Ihnen helfen. Sie können veröffentlichen Sie Ihren code und stellen die richtige Frage.
danke, Problem gelöst mit der Zeit.sleep() vor inWaiting. Scheint das Programm war schneller als die Reaktion
Der timeout wird nichts tun, um dieses Problem zu lösen. Es ändert sich nur die maximale Höhe der Zeit
read()
zulässig ist, um zu vollenden.InformationsquelleAutor jramirez