Python-serial-port-listener
Habe ich begonnen, einige code schreiben mit PySerial zum senden und empfangen von Daten an ein serielles Gerät.
Bis jetzt habe ich nur gearbeitet, auf die Initiierung einer Transaktion an einem terminal und dem empfangen einer Antwort von dem seriellen Gerät.
pseudo:
main:
loop:
message = get_message()
send_to_serial(message)
time_delay(1 second)
read_response()
Nun möchte ich zum implementieren eines listener an diesem port in dem Fall, dass das serielle Gerät ist die eine Initiierung der Kommunikation. Auch zum entfernen der time_delay
das könnte am Ende viel zu lange, oder nicht lange genug für das serielle Gerät, um zu Antworten.
state = idle
register_interrupt(serial_device, read_response())
main:
loop:
message = get_message()
state = sending
send_to_serial(message)
Bisher habe ich noch keine gefunden PySerial-code, verwendet einen interrupt zu kommunizieren.
Ich habe nur keine Ahnung, wie man ein interrupt jeder Art in python, wie würde
InformationsquelleAutor user3817250 | 2014-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es möglich, die
select
- Modul wählen Sie auf einemserial
Verbindung:Unten ist ein vollständiges Beispiel, das schafft eine pseudo-tty-Schnittstelle in den Haupt-thread. Der main-thread schreibt die Daten, um die pty-Funktion in 5-Sekunden-Intervallen. Ein Kind, thread ist erstellt, dass die versuche verwendet
select.select
zu warten, für Lesen von Daten, als auch mit den normalenserial.Serial.read
Methode zum Lesen von Daten aus der pty:PySerial intern verwendet Sie die Methode Lesen (wenn man auf einem posix-system), mit dem timeout zur Verfügung gestellt. Es wird jedoch versucht zu Lesen NUM bytes, bis NUM Gesamtanzahl bytes, die gelesen wurden, oder bis der timeout erreicht wurde. Dies ist der Grund, warum das Beispiel explizit liest
len("GOODBYE FROM MAIN THREAD")
(24 bytes) von den pty, so dass dieconn.read
nennen würde sofort zurückkehren, anstatt zu warten, für die gesamte timeout.TL;DR Es ist möglich, verwenden Sie
serial.Serial
verbindungen mitselect.select
, das ist, was, glaube ich, die Sie suchen.serial.Serial
Beispiel, sagen wir einmal 1 ms. Abhängig von dem sendenden Gerät, die Daten gelangen kann, ein wenig langsamer und mit einem timeout=0 kann man am Ende der Lektüre fast byte für byte, daher Schleife / Auswahl von viele mit einer spürbaren CPU-Verbrauch zu erhöhen.Wenn Sie versuchen, diese Lösung auf meine Umgebung (Python 2.7.15, mit der aktuellen version von PySerial Stand Dez. 2018), die gekürzte Beispiel wirft die Ausnahme
io.UnsupportedOperation: fileno
auf der Linie mit derselect
- Anweisung. Es funktioniert normal, aber wenn ich einfach dieread()
- Methode mit einem timeout von 1 Sekunde. Ich bin mir nicht sicher, was das problem ist, aber es scheint mir, dass Sie nur ein Kind-thread mit einer Endlosschleife und ein.read()
mit einem kurzen timeout -- und nichtselect
benötigt wird.PS - getestet habe ich diesen Ansatz (child-thread, infinite loop mit nur einem
read()
, und eine kurze timeout) in meiner eigenen Anwendung, und es funktionierte perfekt.InformationsquelleAutor James Johnson