Question:
Lecture à partir du port série [boucle]
wengzhe
2014-04-30 21:39:42 UTC
view on stackexchange narkive permalink

Je voudrais lire à partir du port série USB de temps en temps en boucle Je peux ouvrir le port et lire les données avec:

import serial

ser = serial .Serial ('/ dev / ttyACM0', 9600)

while 1: ser.readline ()

Un Arduino Uno est connecté au port USB du RPi. L'Arduino agit en tant que capteur et il produira constamment des lectures.

J'ai besoin d'aide pour ajouter des fonctionnalités de chronométrage au code ci-dessus. Je veux ouvrir le port et en lire pendant un certain temps. Après ce laps de temps, le port se ferme et les données reçues seront analysées.Après une pause de plusieurs minutes, le port se rouvrira et le RPi lira à nouveau les données. Cela continue en boucle. Toute aide est très appréciée.

Deux réponses:
Jacob Hayes
2014-04-30 23:12:18 UTC
view on stackexchange narkive permalink

Tout ce que vous auriez besoin d'ajouter, mis à part la fermeture du port lorsque vous avez terminé;), est temps d'importation , puis utilisez time.sleep (secs) :

  import serial, timeser = serial.Serial ('/ dev / ttyACM0', 9600) while 1: serial_line = ser.readline () print (serial_line) # Si vous utilisez Python 2.x utilisez: print serial_line # Faites un autre travail sur les données time.sleep (300) # sleep 5 minutes # Loop redémarre une fois que le sleep est terminéser.close () # S'exécute seulement une fois que la boucle se termine  

Je ne sais pas si pySerial est mis en mémoire tampon (les données envoyées pendant le sommeil sont stockées ou simplement supprimées), mais je préfère généralement utiliser un générateur, si vous n'avez pas explicitement besoin d'attendre. Ils semblent un peu plus flexibles (à mon avis):

  def serial_data (port, baudrate) ser = serial.Serial (port, baudrate) tandis que True: yield ser.readline () ser. close () pour la ligne dans serial_data ('/ dev / ttyACM0', 9600): [... transform data ...]  

Vous pourrez peut-être aussi utiliser le avec la syntaxe au lieu de while, mais je ne sais pas trop comment cela fonctionnerait avec pySerial.

Merci pour vos commentaires. Dans votre premier exemple avec pySerial, j'aimerais que le port série se rouvre après un certain temps. Pour ce faire, est-ce que j'ajoute un autre time.sleep () après ser.close dans une autre boucle?
Il ne semble pas que pySerial ferme le port série après `readline`, donc à moins que vous ne fassiez plus de travail qui utilise le port série, vous pouvez simplement déplacer le` ser.close () `vers le bas.
Désolé, mais que voulez-vous dire par déplacer le ser.close () vers le bas?
J'étais juste en train de modifier mon commentaire pour clarifier, mais verrouillé au bout de 5 minutes: / Le `ser.close ()` ne s'exécute jamais tant que la boucle while n'est pas terminée (ce qui ne se produit pas vraiment car c'est `while 1` /` while true `), donc le port série n'est pas réellement fermé entre les appels` readline () `. Étant donné que le simple fait d'ouvrir un port pySerial ne bloque pas, cela ne devrait pas être un problème. Si la boucle while n'a été exécutée que x nombre de fois, et que vous vouliez travailler à nouveau sur ce port, laissez simplement le port ouvert jusqu'à ce que vous ayez terminé (déplacez `ser.close ()` après tout le code qui interagit avec le port).
Notez cependant que certaines méthodes se bloquent lors de l'exécution, [`readline`] (http://pyserial.sourceforge.net/pyserial_api.html#serial.FileLike) étant l'une d'entre elles si aucun timeout n'est fourni lors de l'instanciation de l'objet série. le premier exemple, vous souhaitez analyser certaines données entre les appels `readline ()`, alors laissez-moi voir si ma modification peut clarifier un peu ce que vous pourriez faire.
Raky
2016-11-28 20:34:31 UTC
view on stackexchange narkive permalink

Veuillez télécharger la bibliothèque série et l'installer dans le dossier Lib Python. Utilisez ensuite le script suivant. Veuillez modifier la boucle selon vos besoins. Les sys.argv [] sont utilisés pour rechercher des paramètres en ligne de commande. Vous pouvez omettre ceci et le code en dur selon vos besoins.

  import sys import serialimport timeparam1 = sys.argv [1] param2 = sys.argv [2] # param2 = sys.argv [3] ard = serial.Serial (param1, param2, timeout = 0) RFIDNum = ard.readline () # lire tous les caractères dans le tampon # time.sleep (1) print RFIDNum  


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...