Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Lecture du port serie en continu ( avec des données discontinues)

Résolu !
Accéder à la solution

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

 

0 Compliments
Message 1 sur 12
2 667 Visites

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.

0 Compliments
Message 2 sur 12
2 648 Visites

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 ...

0 Compliments
Message 3 sur 12
2 645 Visites

Oui.

Du moins sans connaître tous les détails de l'application.

0 Compliments
Message 4 sur 12
2 641 Visites

 

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. 

0 Compliments
Message 5 sur 12
2 603 Visites

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...

0 Compliments
Message 6 sur 12
2 594 Visites

 

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);
    }
}
0 Compliments
Message 7 sur 12
2 586 Visites

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

 

0 Compliments
Message 8 sur 12
2 572 Visites

"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.

0 Compliments
Message 9 sur 12
2 564 Visites


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.

0 Compliments
Message 10 sur 12
2 560 Visites