2016-04-16 1 views
0

j'ai eu le problème suivant:comportement mystérieux avec pyserial

J'ai un Arduino ici qui est connecté à mon Mac. L'Arduino lit et répond aux données série. J'ai fait un petit script python3 qui prend l'entrée de l'utilisateur et utilise pySerial pour écrire des commandes comme 'set (13, 255) ~' sur l'Arduino. qui fonctionne très bien:

while 1: 

cmd = input("<<< ") 
cmd += '~' 

if cmd != "~": 
    serialPort.write(cmd.encode()) 

    output = str(serialPort.readline()).upper()[2:-5] 

    if output != " ": 
     print(">>> ", output) 

Voici le problème:

Si je veux envoyer des commandes « automatique » dans le script, par exemple dans une boucle, l'Arduino ne répond plus, même les commandes envoyées sont les mêmes, également encodées et de type "byte".

for i in range[0, 256]: 

    cmd = 'set(13, ' 
    cmd += str(i) 
    cmd += ')~' 

    serialPort.write(cmd.encode()) 

    time.sleep(0.1) 

La chose étrange est, si je déclare d'abord la variable (cmd) en entrée, son travail aussi bien, mais cela signifie un manuel d'interruption chaque fois que la commande est envoyée.

cmd = input() 

cmd = 'set(13, ' 
cmd += str(i) 
cmd += ')~' 

Après quelques heures de recherche je n'ai absolument aucune idée de ce que le problème pourrait être. Comme je l'ai dit, le type de données est toujours un octet après l'encodage.

+0

essayez d'ajouter un serialPort.flush après l'appel d'écriture – MrSykkox

+0

Malheureusement, cela ne fonctionne pas. – rckey

Répondre

0

Je ne connais pas PySerial, mais je suppose que c'est parce que l'appel d'écriture n'envoie pas les données immédiatement. Lorsque vous utilisez l'entrée, il ajoute une nouvelle ligne au tampon, ce qui peut déclencher automatiquement l'appel d'écriture.

Dans l'autre partie du code que vous avez, vous n'ajoutez pas de nouvelle ligne au tampon et il ne videra pas les données, avant que le tampon soit assez grand. Donc, avec un appel flush(), il devrait l'envoyer.

espoir il est logique

0

Eh bien, je devais faire une interruption plus longue après la connexion au port. (N'a pas été un problème puisque je devais donner une certaine entrée jusqu'ici)