le 02-14-2020 01:12 AM
Bonjour à tous,
j'essaye de lire (et écrire ) sur un Arduino via le port série.
L'application fonctionne bien quand la lecture est ponctuelle ( par exemple avec une demande par BP ). Si je demande une lecture continue sur le port série des données qui sortent de l'Arduino le time-out du vi Visa Read met la liaison en erreur.
J'ai détecté que tout se passe bien s'il n'y a pas de coupures des données durant la valeur du Time out : j'ai des données qui arrivent en discontinu.
Alors j'ai fait une bidouille pour tromper le Time out mais ce n'est pas très pro.
Existe t'il un exemple plus "propre" qui correspondrait à résoudre mon problème ?
Merci
Cordialement
Résolu ! Accéder à la solution.
le 02-14-2020 03:23 AM
Du moment que la continuité du flux des données ne peut pas être garantie, je tiendrais simplement compte de ce fait en gérant l'erreur générée en cas de timeout.
le 02-14-2020 03:39 AM
Merci pour ta réponse rapide.
En fait, tu annulerais l'erreur sur le time out ?
Manifestement on ne peut changer le Time out sur le vi ...
le 02-14-2020 04:55 AM
Oui.
Du moins sans connaître tous les détails de l'application.
le 02-17-2020 03:53 AM
Essaie de centraliser la communication. Une seule partie de ton code doit envoyer et recevoir des commandes. De plus les commandes doivent être envoyées les unes après les autres, après réception de la réponse. De plus je te conseille d'éviter que l'arduino envoie spontanément des trames. Mieux vaut qu'il n'envoit des informations que sur demande.
A mon avis, tu devrais pouvoir communiquer à pleine charge avec un Arduino. MAIS, ne pas oublier que l'arduino ne fonctionne pas en multitâche, et que chaque tratement de dommande sérielle va ralentir son exécution.
le 02-17-2020 08:43 AM
Merci pour ta réponse.
En fait c'est ce qu'il se passe. La trame de 6 fois 8bits est envoyée que sur demande. Le temps entre chaque trame est complètement aléatoire( en fonction d'un évènement sur 6 capteurs). C'est Arduino qui pilote et Labview est en écoute.
Le vi Visa Read se met en Time out s'il ne reçoit pas de données...J'ai fais une bidouille mais c'est pas terrible.
Il faudrait pouvoir mettre le vi Visa Read en stand by...
le 02-18-2020 01:00 AM
Sinon tu peux faire la même chose que l'on fait habituellement du côté de l'arduino. C'est à dire voir s'il y a des bytes à l'entrée du port, et ne faire la lecture que s'il y en a. Pour ça il y a un noeud de propriété "Bytes at Port" dans la même palette que le VISA read.
Un code arduino type fait la même chose via la fonction Serial.avaiable(), qui retourne le nombre de byte à l'entrée du port :
void
loop() {
if
(Serial.available()){
input = Serial.read();
Serial.print(
"You typed: "
);
Serial.println(input);
}
}
le 02-24-2020 01:52 AM
Oui c'est vrai. Mais le souci avec ce vi ( "Bytes at Port" ) il ne fonctionne pas dans la boucle par contre Il fonctionne bien en dehors. Mais comme je n'ai pas toujours des données voir le même nombre il faut qu'il soit dans une boucle. Enfin je crois ...
Aurais tu un exemple où il est réactualisé ?
Merci
le 02-25-2020 01:11 AM
"Bytes at Port" fonctionne très bien dans une boucle. Si tel n'est pas le cas, il doit y avoir un problème dans votre code.
Puisque la trame est envoyée sur demande et que le délai est variable, pourquoi ne pas définir un timeout suffisamment grand pour couvrir le plus grand ?
L'Arduino termine-t-il ses envois avec un caractère de terminaison ? Si oui, je vous suggère d'utiliser cette fonctionnalité bien pratique. Dans l'attente d'une réponse, je n'entre pas dans plus de détails puisque cela pourrait être inutile.
le 02-25-2020 01:49 AM
Alors effectivement j'ai réussi à faire fonctionner "Bytes at Port" dans une boucle mais en y ajoutant une boucle interne à la boucle principale.
Sinon si on reprend l'exemple de Labview ça donne à peu près cela mais je n'ai pas de retour sur " Bytes at port" .
Oui l' Arduino envoie un caractère de fin de trame. Cela fonctionne si je force l'entrée du vi de lecture du port serie avec une valeur fixe. Mais ma trame n'est pas toujours identique...
Je me trompe où ?
Merci.