Discussions au sujet de NI LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

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

Solved!
Go to solution
Highlighted

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 Kudos
Message 1 of 12
(281 Views)
Highlighted

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 Kudos
Message 2 of 12
(262 Views)
Highlighted

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 Kudos
Message 3 of 12
(259 Views)
Highlighted

Oui.

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

0 Kudos
Message 4 of 12
(255 Views)
Highlighted

 

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 Kudos
Message 5 of 12
(217 Views)
Highlighted

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 Kudos
Message 6 of 12
(208 Views)
Highlighted

 

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 Kudos
Message 7 of 12
(200 Views)
Highlighted

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 Kudos
Message 8 of 12
(186 Views)
Highlighted

"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 Kudos
Message 9 of 12
(178 Views)
Highlighted


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 Kudos
Message 10 of 12
(174 Views)