le 07-02-2018 06:41 AM
Bonjour à tous,
Je suis en train de développer un VI permettant de lire un par un les octets envoyées par un instrument via une liaison série (en vérité un port COM virtuel recevant des trames d'un convertisseur RS422/USB de marque FTDI).
LE VI (voir PJ) tourne correctement dans 90% des cas : les boucles whiles remplissent leur fonction de lecture/bufferisation et je récupère l'intégralité des trames reçues. Dans 10% des cas cependant, le sous-VI "Visa read" ne fonctionne pas, génère une erreur (-1073807253) et la boucle while qui le contient pédale donc dans la semoule à l'infini.
Je ne comprends pas ce qui peut générer cette erreur, j'ai essayé de mettre des temps d'attente un peu partout, de jouer sur les timeout, d'utiliser des fonctions comme "Visa Bytes at serial port", rien n'y fait, la même erreur se reproduit dans environ 5-10% des cas, souvent 2 fois d'affilé, e très souvent au premier lancement du programme après une modification. Une fois que le code d'erreur a été généré 2 fois, en général, tout rentre dans l'ordre...
Quelqu'un aurait une idée du pourquoi du comment ?
D'avance merci !
le 07-02-2018 07:58 AM
Salut,
petite lecture: http://digital.ni.com/public.nsf/allkb/E2BE7BA8286C290386257EB60064A81E
Je pense qu'en insérant un "VISA Flush I/O Buffer" (de la palette VISA avancé .....) juste après initialisation de la ressource Visa, tu videras les buffers avant de commencer à lire et tout rentrera dans l'ordre! 😉
le 07-02-2018 08:09 AM
Bonjour,
merci pour ta réponse,
j'ai déjà tenté de vider les buffers juste après initialisation de la connexion, retenté sur tes conseils, malheureusement l'erreur apparaît toujours à la même fréquence 😕
le 07-02-2018 08:18 AM
alors peut-être ajouter un delais avant de lancer la lecture, comme expliqué dans le lien que je t'ai donné, histoire de laisser un peu de temps à la ressource pour s'initialiser????
le 07-02-2018 12:59 PM
@Rac00n a écrit :
Bonjour,
merci pour ta réponse,
j'ai déjà tenté de vider les buffers juste après initialisation de la connexion, retenté sur tes conseils, malheureusement l'erreur apparaît toujours à la même fréquence 😕
Je suis d'accord avec Phil, tu devrais (si ce n'est pas déjà fait) ajouter un petit délai après l'initialisation du port série avant de vider le buffer. Quel est l'instrument utilisé, le protocole de communication me semble étrange, comment peut-on se synchroniser sur le début d'une trame? C'est probablement un problème de synchronisation, il est possible que la lecture ou que la fonction flush buffer se produise au milieu d'une trame sans synchronisation. Vérifie également bien les paramètres de configuration du port série afin qu'ils soient identiques à ceux de l'instrument.
Dans un autre ordre d'idée, ta boucle consommateur peut-être remplacée par la version plus simple suivante:
Le cas Error ne contient qu'une constante "chaine vide" (Empty String). À noter, on peut faire un clic-droit sur la fonction "Boolean Array To Number", sélectionner "propriétés", choisir la page "Configuration de la sortie" (Output Configuration) et changer la représentation pour U8 (c'est U32 par défaut).
Ben64
le 07-03-2018 04:19 AM
Merci pour vos réponses !
Concernant l'instrument : un FPGA m'envoie des trames à une fréquence de 10Hz suivant le protocole RS422, trames que je récupère au moyen d'un convertisseur RS422/USB (ref: FTDI Chip - USB-RS422-WE-1800-BT).
La configuration du port COM est correcte : la plupart du temps, je collecte bien 500 octets que j'empile et que je dépile dans la deuxième boucle while (=boucle consommatrice). Par moment, le VISA Read génère l'erreur mentionnée au-dessus et la première boucle while mouline et le soft ne passe pas à la boucle consommatrice.
J'ai effectivement ajouté un délai de 100ms entre l'initialisation du port COM et la vidange du buffer, l'erreur subsistait, en mettant 200ms, l'erreur semble avoir disparu. Je vous tiens au courant 🙂
Merci pour la simplification de la boucle consommatrice, j'ai fait le changement et c'est plus propre.
Merci également pour la petite astuce sur la fonction "Boolean array to number", cela m'évitera dorénavant de créer des boucles for inutiles 🙂
le 07-03-2018 06:30 AM
et encore merci à Ben pour ses "trucs et astuces" toujours à la question 😉