2016-09-13 3 views
1

J'essaie d'utiliser des périphériques de port série avec Python, mais j'ai des problèmes de synchronisation. Si j'envoie une commande d'interrogation à l'appareil, il devrait répondre avec des données. Si j'essaie de lire les données entrantes trop rapidement, il ne reçoit rien.Python serial.readline() ne bloque pas

import serial 
device = serial.Serial("/dev/ttyUSB0", 9600, timeout=0) 
device.flushInput() 
device.write("command") 
response = device.readline() 
print response 
'' 

La commande readline() ne bloque pas et en attente d'une nouvelle ligne comme il se doit. Y a-t-il une solution de contournement simple?

+1

Je ne sais pas si ça aide, mais le [docs] (http: // pyserial.readthedocs.io/en/latest/shortintro.html#readline) montre un appel 'flush' entre' write' et 'readline'. Aussi, il est difficile de comprendre ce que «serial» est réellement et comment il a été configuré. Pouvez-vous poster un exemple de code plus complet que quelqu'un pourrait réellement exécuter et voir le problème –

+0

Quelle est la valeur de votre délai d'attente? – paxdiablo

+0

J'ai développé l'exemple. J'ai ajouté le 'flush()', mais cela n'a pas aidé. – Rachie

Répondre

0

Je n'ai pas pu ajouter de recommandation, donc je vais juste ajouter ceci comme réponse. Vous pouvez référencer this stackoverflow thread. Quelqu'un a tenté quelque chose de similaire à votre question.

Semble mettre ses données en boucle et les boucler continuellement pendant que les données sont entrées. Vous devez vous demander une chose si vous voulez suivre cette approche, quand arrêterez-vous de collecter des données et sauter de la boucle? Vous pouvez essayer et continuer à lire les données, lorsque vous collectez déjà, si rien n'est entré pendant quelques millisecondes, sautez et prenez ces données et faites ce que vous voulez avec.

Vous pouvez également essayer quelque chose comme:

While True: 
    serial.flushInput() 
    serial.write(command) 
    incommingBYTES = serial.inWaiting() 
    serial.read(incommingBYTES) 
    #rest of the code down here 
0

readline() utilise la même valeur de délai d'attente que vous avez passé à serial.Serial(). Si vous souhaitez que la commande readline soit bloquante, supprimez simplement l'argument timeout, la valeur par défaut est None.

Vous pouvez également mettre à None avant d'appeler readline(), si vous voulez avoir un délai d'attente pour openening l'appareil:

import serial 
try: 
    device = serial.Serial("/dev/ttyUSB0", 9600, timeout=0.5) 
except: 
    #Exception handeling 
device.flushInput() 
device.write("command") 
device.timeout=None 
response = device.readline() 
print response