Vielleicht bin ich Missverständnis Ihre Frage, aber da es eine serielle Leitung ist, werden Sie von der Reihe nach lesen, um alles Arduino geschickt - es in der Arduino gepuffert werden werde, bis Sie lesen es.
Wenn Sie eine Statusanzeige haben möchten, die das neueste gesendet zeigt - verwenden Sie einen Thread, der den Code in Ihrer Frage enthält (minus den Schlaf), und halten Sie die letzte vollständige Zeile als die letzte Zeile aus dem Arduino lesen.
Update:mtasic
‚s Beispiel-Code ist recht gut, aber wenn der Arduino eine Teilleitung gesendet hat, wenn inWaiting()
genannt wird, werden Sie eine abgeschnittene Linie bekommen. Stattdessen, was Sie tun möchten, ist die letzte komplette Linie in last_received
, und halten Sie die Teillinie in buffer
, so dass es an das nächste Mal um die Schleife angehängt werden kann. Etwas wie folgt aus:
def receiving(ser):
global last_received
buffer_string = ''
while True:
buffer_string = buffer_string + ser.read(ser.inWaiting())
if '\n' in buffer_string:
lines = buffer_string.split('\n') # Guaranteed to have at least 2 entries
last_received = lines[-2]
#If the Arduino sends lots of empty lines, you'll lose the
#last filled line, so you could make the above statement conditional
#like so: if lines[-2]: last_received = lines[-2]
buffer_string = lines[-1]
In Bezug auf die Verwendung von readline()
: Hier ist, was die pyserial Dokumentation (leicht bearbeitet für Klarheit und mit einem Hinweis auf readlines()) zu sagen hat:
Seien Sie vorsichtig bei der Verwendung von " Zeile lesen". Geben Sie ein Zeitlimit beim Öffnen der seriellen Schnittstelle an, andernfalls könnte für immer gesperrt werden, wenn kein Newline-Zeichen empfangen wird. Beachten Sie auch, dass "readlines()" nur mit einem Timeout funktioniert. Es hängt von einem Timeout ab und interpretiert das als EOF (Dateiende).
das scheint mir ziemlich sinnvoll!
Nun, die in der Summe liest von dem, was in dem Puffer erhalten. Mein Eindruck ist, dass der Fragesteller das begrenzt, was das Arduino durch Zeilenumbrüche sendet, so dass es wahrscheinlich nicht mit der Empfangspuffergröße übereinstimmt. – JosefAssad
Also last_received wird immer haben, was ich brauche? Gibt es eine Möglichkeit, dies mit Readline zu tun? – Greg
das ist richtig, nach Ihrer Frage – mtasic85