pyserial - Wie liest man die letzte von einem seriellen Gerät gesendete Zeile?
Ich habe ein Arduino angeschlossen an meinem computer läuft eine Schleife, Wert senden über die serielle Schnittstelle zurück an den computer, der alle 100 ms.
Ich möchte ein Python-Skript, das Lesen aus dem seriellen port nur alle paar Sekunden, so will ich es nur um zu sehen das Letzte, was an den Arduino.
Wie tun Sie dies in Pyserial?
Hier ist der code, den ich versuchte, die hat nicht funktioniert. Es liest die Zeilen nacheinander.
import serial
import time
ser = serial.Serial('com4',9600,timeout=1)
while 1:
time.sleep(10)
print ser.readline() #How do I get the most recent line sent from the device?
InformationsquelleAutor der Frage Greg | 2009-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht ich bin Missverständnis Ihren Frage, aber da es eine serielle Schnittstelle, haben Sie, um alles zu Lesen gesendet von der Arduino-nacheinander - es wird gepuffert werden, bis in der Arduino-bis Sie es Lesen.
Wenn Sie möchten, um eine status-Anzeige, die die neuesten Sache geschickt - verwenden ein thread mit den code in deiner Frage (ohne Schlaf), und halten Sie die Letzte vollständige Zeile Lesen als die neueste Linie von der Arduino.
Update:
mtasic
's Beispiel-code ist ziemlich gut, aber wenn der Arduino hat eine teilweise Linie, wenninWaiting()
aufgerufen wird, erhalten Sie eine abgeschnittene Linie. Stattdessen, was Sie tun möchten, ist zu den letzten komplette Linie inlast_received
und halten Sie die Linie teilweise inbuffer
so dass es sein kann, angehängt an der nächsten Runde der Schleife. So etwas wie dieses:Bezüglich
readline()
: Hier ist, was die Pyserial-Dokumentation zu sagen hat (leicht bearbeitet für Klarheit und mit einer Erwähnung zu readlines()):die scheint ganz vernünftig zu mir!
InformationsquelleAutor der Antwort Vinay Sajip
InformationsquelleAutor der Antwort mtasic85
Diese Lösungen Schwein die CPU während der Wartezeit für Zeichen.
Sollten Sie mindestens eine blockierende Aufruf von read(1)
...und Mach die split-Sache nach wie vor.
InformationsquelleAutor der Antwort Rufus
Können Sie
ser.flushInput()
zu Spülen, alle seriellen Daten, die derzeit im Puffer.Nach dem löschen der alten Daten haben, können Sie Benutzer-ser.readline (), um die jüngsten Daten aus dem seriellen Gerät.
Ich denke, es ist ein bisschen einfacher als die anderen vorgeschlagenen Lösungen, die auf hier. Arbeitete für mich, hoffe, es ist für Sie geeignet.
InformationsquelleAutor der Antwort user3524946
Dieser Methode können Sie separat Steuern Sie das Zeitlimit für die Zusammenstellung der Daten für jede Zeile, und eine andere timeout für das warten auf weitere Zeilen.
InformationsquelleAutor der Antwort fja0568
Benötigen Sie eine Schleife, um alles zu Lesen geschickt, mit dem letzten Aufruf von readline() blockiert, bis der timeout. Also:
InformationsquelleAutor der Antwort quamrana
Geringfügige änderung mtasic & Vinay Sajip code:
Während ich fand, dass dieser code sehr hilfreich, um mich für eine ähnliche Anwendung, die ich brauchte alle die Linien auf dem Rückweg von einem seriellen Gerät, das senden von Informationen in regelmäßigen Abständen.
Entschied ich mich nach pop das erste element aus der Spitze, es aufnehmen, und dann wieder die restlichen Elemente, wie die neuen Puffer und von dort aus weiter.
Ich erkennen, dass dies nicht was Greg gefragt wurde, aber ich dachte, es war es Wert als eine Randnotiz.
InformationsquelleAutor der Antwort Crazy Joe Malloy
Mit
.inWaiting()
im inneren eine unendliche Schleife kann problematisch sein. Es kann hog die gesamte CPU abhängig von der Implementierung. Stattdessen würde ich empfehlen, mit einer bestimmten Größe der zu lesenden Daten. Also in diesem Fall die folgenden getan werden soll, zum Beispiel:InformationsquelleAutor der Antwort Srinath
Zu viel Komplikationen
Was ist der Grund für das aufteilen des Byte-Objekt durch newline oder durch andere array-Manipulationen?
Ich Schreibe die einfachste Methode, die dein problem löst:
InformationsquelleAutor der Antwort LXSoft
Hier ist ein Beispiel mit einem wrapper, der Sie zum Lesen der letzten Zeile, ohne 100% CPU -
InformationsquelleAutor der Antwort bdoubleu