Quand j'ai vider le tampon série en Python, il s'arrête de lire
J'ai programmé un Arduino pour envoyer les données en série à mon ordinateur. pySerial est une lecture correcte de la série, mais depuis j'ai toujours envie d'avoir le plus up-to-date information, j'ai pensé que je pourrais vider le tampon d'entrée à l'aide de flushInput(), mais lorsque la commande est exécutée, je ne peux plus lire de la série. J'ai essayé seulement de rinçage de 51 fois (parce que 51 est un nombre premier et je peux facilement compter 51 fois avec un compteur sans avoir à le réinitialiser), de sorte que l'Arduino aurait suffisamment de temps pour envoyer le prochain paquet de données (course à 57600 bauds), mais ne fonctionne toujours pas. À savoir, j'ai utilisé une variable pour stocker la longueur de la ligne de lecture date limite d'utilisation(), mais, dès que j'ai touché 51 et l'entrée buffer est vidé, j'ai toujours obtenir une lecture de 0, ce qui signifie qu'il n'est pas de lire n'importe quoi. J'ai lu dans la documentation de pySerial, mais n'ai pas trouvé d'informations pertinentes. Ne flushInput() mettre fin à la connexion série ainsi? Merci beaucoup.
EDIT: je suis sous Mac OS 10.7.5 et Python 2.7.3
try:
self.s = serial.Serial("/dev/tty.usbmodemfa131", 57600, timeout = 0)
self.FlightLoopCB = self.FlightLoopCallback
XPLMRegisterFlightLoopCallback(self, self.FlightLoopCB, self.interval, 0)
except serial.SerialException:
self.s = None
.
.
.
self.length=0
self.myline=self.s.readline()
self.length=len(self.myline)
print "Test: %i %i" % (self.length, self.j)
if(self.length>=7):
if(self.myline[0:2]=="R,"):
if(self.j%51==0):
self.s.flushInput()
self.length=len(self.myline)
self.myline=self.myline[2:6]
self.myLineBytes=[0,0]
self.myLineBytes[0]=unpack('>H', self.myline[0:2])
self.myLineBytes[1]=unpack('>H', self.myline[2:4])
- Pourriez-vous poster votre code? Ou au moins la partie d'elle qui ouvre le socket et les bouffées de chaleur de l'entrée?
- PS: sur quelle plateforme utilisez-vous ce(windows, linux, osx, quelque chose d'autre...)? Comme le pySerial code diffère de l'un à l'autre, ce peut être importante
- J'ai édité le post.
Vous devez vous connecter pour publier un commentaire.
Ne
Serial.flushInput()
également fermer le flux de données?Donc je n'ai fouillé dans le code pour pySerial(il est disponible, vous pouvez tirer sur le SVN je vous suggère de le faire si vous avez encore des problèmes, vous êtes à essayer de comprendre).
Puisque vous êtes sur OSX, python rapports
os.name
"posix", et ainsi deserial.Serial
en fait résout àserial.serialposix.Serial
. La définition deflushInput()
pour ce qui est:(Si vous voulez le voir, c'est ici sur la ligne 500)
Donc, essentiellement, c'est juste un wrapper autour de
termios.tcflush()
. Le docs pour qui ont ceci à dire:Selon les docs puis, il ne pas fermer le flux sous-jacent, seules les données sur les rejets. C'est probablement le comportement que vous attendez en premier lieu.
Ce qui m'amène à dire qu'il y a probablement quelque chose de mal avec votre code. Il n'y a pas assez d'affiché le code pour être en mesure de déduire de ce qui, exactement, est le problème.
C'est juste une supposition, mais peut-être que le code qui s'incrémente
self.j
est à l'intérieur d'un bloc qui n'est pas appelé après il frappe 51 sorte que vous êtes toujours le rinçage? Si vous pouviez poster complet d'un exemple de code qui génère le problème(peut-être quelques-ensemble réduit de votre code qui vient d'exercices de ce problème que vous voyez) alors je pourrais probablement vous aider.PS -- UNE Note sur prématuré optimisations:
À moins que tout ce qui est la production de données sur l'autre extrémité de l'interface série est de produire des données à une vitesse beaucoup plus élevée que ce que vous consommez alors il n'y a probablement pas besoin de rincer, en premier lieu, car aucune quantité importante de données sera jamais à s'accumuler dans la mémoire tampon. De toute façon je doute qu'une interface série de course à 57600 bauds sera jamais en mesure de le faire. Vous devriez vérifier et assurez-vous que le rinçage est nécessaire, en premier lieu, avant de le faire.
Ne pas le faire juste parce que vous pensez qu'il peut être nécessaire ou "pour vérifier". Vérifiez qu'il est en fait de la résolution d'un problème avant de le faire, sinon, c'est une optimisation prématurée et il augmente la complexité du code et la fragilité pour aucune raison.