Discussions au sujet des autres produits NI

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

Problème de lecture de buffer

       Bonjour,

Je veux récupérer la température lue par un thermomètre via RS232.
Pour ça, il faut lui envoyer la commande " t\n "
le thermomètre me renvoie une info de la forme  "t: XX.XXX C".
8 fois sur 10, ça marche bien mais des fois j'obtiens des réponses de la forme "t: " ou bien "C" , pas d'info du tout, et meme des infos qui ne correspondent pas à la commande envoyée.
Evidemment, ça a pour effet de faire planter le "VI balayer une chaîne", qui ne retrouve pas le format demandé...

Comment faire pour etre sûr de lire la bonne info dans le buffer?
0 Compliments
Message 1 sur 8
3 831 Visites
Bonjour,
 
Le seul moyen pour que votre VI ne plante pas serait de gérer les erreurs en utilisant la sortie d'erreur du VI Balayer une chaîne. Pouvez vous poster votre VI ?
 
Cordialement,
0 Compliments
Message 2 sur 8
3 814 Visites
    Je posterais le VI complet demain. Pour l'instant je met deux images.Je me suis aperçu d'un autre problème: lorsque je veux un affichage en temps réel de la température sur mon PC, je met une boucle While autour de ce VI. Et je me rend compte qu'il y a un énorme retard entre l'indication du thermomètre et celle du PC...comme si je récupérais des vieilles valeurs dans le buffer.
    Bref je pense surtout que je me mélange completement les pinceaux sur tout ce qui est buffer d'ecriture , buffer de lecture, nombre d'octets à lire .... et je n'arrive pas à trouver une explication claire.
    Par exemple: quand le programme tourne bien, la taille de ce que je doit lire dans le buffer de lecture (t: 23.456 C), est de 15 octets. Cela veut il dire que dans le VI "Visa read", le nombre d'octets à lire doit etre fixés à 15? Est qu'il faut que je fixe la taille du buffer de sortie à 15 octets pour etre sûr d'avoir toujours la dernière valeur et  que je vide les  deux buffers à la fin de chaque exécution de boucle?...

En tout cas merci pour votre patience Smiley tirant la langue
Tout télécharger
0 Compliments
Message 3 sur 8
3 803 Visites
Il est vrai que ce n'est pas évident au début.
Ton thermomètre communique à quel vitesse, il a besoin d'un demande de température à chaque fois.
Si tu à mis un while a tu mis une tempo dans le while.
C'est peut-être pour cela que tu as des valeurs anciennes, tu fait tellement de requette que tu n'arrive a tout traité...
Julien GELAY
Tecsup
Technicien BE - Software
Message 4 sur 8
3 789 Visites

Hello,

dans le pire des cas, tu peux toujours créer une fonction qui analyse la chaîne de sortie en utilisant, comme le propose Maxime Muller, la gestion d'erreur.

Si tu n'as pas d'erreur, tu lis ta valeur sinon tu recommences ton opération.

C'est pas trés élégant comme réponse mais ça permet juste de dépanner un peu.

a+

0 Compliments
Message 5 sur 8
3 779 Visites
    Merci pour vos réponses. le thermomètre communique à 2400 bauds. Par contre, est ce qu'il faut lui envoyer la commande à chaque fois pour qu'il renvoie quelque chose, je n'ai pas su trouver. Mais ça m'a l'air d'une bonne idée car je ne vois pas pourquoi mon buffer se remplierait tout seul alors que je n'envoie pas de commande.Pour ce qui est de la boucle while, j'ai bien mis une tempo à l'intérieur. Et pour la gestion des erreurs, je voudrais bien mais le VI s'arrete justement quand l'erreur apparait.Il y a quelque chose à activer pour ignorer l'erreur et continuer le programme?
je vous joins les VIs...


Tout télécharger
0 Compliments
Message 6 sur 8
3 758 Visites
tu peut me les enregistrer en 8.0
Merci
Pour effacer une erreur ça s'appele clear erreur
c'est un vi à mettre sur le flux d'erreur
Fait une recherche dans la barre d'outils


Message Edité par Fiston le 01-16-2008 03:12 AM

Message Edité par Fiston le 01-16-2008 03:13 AM
Julien GELAY
Tecsup
Technicien BE - Software
0 Compliments
Message 7 sur 8
3 741 Visites
    En regroupant les idées des uns et des autres, mon VI a tourné pendant 2 heures et ne s'est pas arrété. Merci à tous.

Juste après le VI "configure serial", je vide les buffers,là on entre dans la boucle While avec une tempo de 1s, j'envoie la commande, je lis juste de nombre d'octets qu'il me faut, j'attend dans une boucle while (encore) que le nombre d'octets dans le buffer (bytes at port.vi) soit = à 0 et la boucle principale se relance. j'ai mis au cas où une condition qui ignore la valeur demandée s'il y a erreur. ça semble un peu lourd pour aquerir une simple valeur, mais au moins ça marche ^^.
Merci encore

Je posterais une image du diagramme.
0 Compliments
Message 8 sur 8
3 730 Visites