Python port série port d'écoute
J'ai commencé à écrire du code à l'aide de PySerial d'envoyer et de recevoir des données à un périphérique série.
Jusqu'à maintenant, j'ai seulement travaillé sur le lancement d'une transaction à partir d'un terminal et d'obtenir une réponse à partir de la série de l'appareil.
pseudo:
main:
loop:
message = get_message()
send_to_serial(message)
time_delay(1 second)
read_response()
Maintenant, je voudrais mettre en œuvre un listener sur le port dans le cas où le numéro de série de l'appareil est celui de l'initiation de la communication. Également à supprimer les time_delay
qui pourrait finir vers le haut de façon trop longtemps, ou pas assez longtemps pour que le périphérique série de répondre.
state = idle
register_interrupt(serial_device, read_response())
main:
loop:
message = get_message()
state = sending
send_to_serial(message)
Jusqu'à présent, je n'ai pas trouvé de PySerial code qui utilise une interruption de communiquer.
J'ai juste aucune idée de comment mettre en place une interruption d'aucune sorte en python, comment
Vous devez vous connecter pour publier un commentaire.
Il est possible d'utiliser le
select
module pour sélectionner unserial
connexion:Ci-dessous est un exemple complet qui crée un pseudo-tty dans le thread principal. Le thread principal écrit les données sur le pty dans des intervalles de 5 secondes. Un enfant thread est créé qui tente utilise
select.select
à attendre pour lire les données, ainsi que l'aide de la normaleserial.Serial.read
méthode pour lire les données de l'pty:PySerial utilise en interne sélectionnez la méthode read (si vous êtes sur un système posix), en utilisant le délai prévu. Cependant, il va tenter de lire NUM octets jusqu'à ce NUM total d'octets ont été lus, ou jusqu'à ce que le délai d'attente a été atteint. C'est pourquoi l'exemple explicitement lit
len("GOODBYE FROM MAIN THREAD")
(24 octets) du pty, de sorte que leconn.read
appel retourner immédiatement au lieu d'attendre pour l'ensemble de délai d'attente.TL;DR Il est possible d'utiliser
serial.Serial
connexions avecselect.select
, qui est ce qui, je crois, vous êtes à la recherche pour.serial.Serial
exemple, disons 1 ms. En fonction de l'appareil de transmission, les données peuvent arriver un peu plus lent et avec un délai d'expiration=0 vous pouvez terminer la lecture de presque octet par octet, donc en boucle / de la sélection d'un lot avec un notable de la consommation CPU de l'incrément.io.UnsupportedOperation: fileno
sur la ligne avec leselect
déclaration. Il fonctionne normalement, mais quand je suis tout simplement utiliser laread()
méthode avec un délai d'attente de 1 seconde. Je ne sais pas quel est le problème, mais il me semble que vous pouvez tout simplement faire un enfant avec du fil d'une boucle infinie et un.read()
avec un bref délai, ni deselect
est nécessaire.read()
, et un bref délai) dans mon application, et cela a fonctionné parfaitement.