02-27-2019 10:35 AM - modifié 02-27-2019 10:43 AM
Bonjour à tous,
Je cherche actuellement à lire un ensemble de messages que je reçois en RS232. Il existe plusieurs types de messages différents (et qui comportent des données différentes) et c'est pourquoi je cherche dans un premier temps à isoler les 8 premiers octets de chaque message afin d'en déduire le contenu (avec le protocole du RS232, je sais par exemple que le 5ème octet de chaque message me renvoie le type du message considéré).
Le problème se situe en amont : je n'arrive pas à isoler proprement mes différents messages, certains sont perdus et d'autres n'apparaissent jamais en sortie de mon "visa read".
J'ai fait plusieurs essais en jouant sur les différents paramètres : rien n'y fait. Certains messages n'apparaissent simplement jamais, alors que je sais pertinemment qu'ils se trouvent son sur mon RS232.
Avez-vous des idées pour que je puisse isoler, en sortie de mon "visa read", mes messages les uns après les autres sans trop en perdre ? Je vous mets mon diagramme en pj.
Pour plus de précisions :
Je vous remercie d'avance pour votre aide !
Résolu ! Accéder à la solution.
02-28-2019 01:43 AM - modifié 02-28-2019 01:47 AM
Prière d'indiquer le lien vers le protocole de l'appareil émettant les messages.
Selon votre code, ces messages ne comportent pas de caractère de terminaison. En est-il bien ainsi ? Est-il possible d'activer cette fonctionnalité ?
Avec un caractère de terminaison, ce découpement des messages serait très simple à mettre en oeuvre. Sinon, il faudra procéder d'une autre manière. Ce qui est certain est que votre méthode actuelle ne peut pas fonctionner.
le 02-28-2019 02:35 AM
Effectivement, je n'ai pas de caractère de terminaison, et je n'ai pas la main dessus (j'ai mis le protocole du périphérique en pj)
En revanche toutes mes trames commencent par les octets 0x05 0x02, est-ce que je pourrai éventuellement m'en servir comme une sorte de caractère de terminaison ?
Est-ce qu'au final vous pensez qu'il est tout de même possible d'isoler les messages dans le buffer de lecture ?
Merci !
le 02-28-2019 04:25 AM
Oui bien sûr mais il faut procéder autrement en n'effectuant pas le découpage lors de la lecture mais après.
J'utiliserais une structure du type Producer/Consumer avec :
Dans le Producer :
Dans le Consumer :
Assez clair ?
le 02-28-2019 11:10 AM
Je vous remercie pour votre réponse !
Ça me parait clair, j'essaie ça et je vous tiens au courant 🙂
le 03-01-2019 12:56 AM
Si les messages comportaient un caractère de terminaison (valeur strictement réservée qui n'apparaît jamais dans les données utiles), la tâche serait plus simple.
Il suffirait alors de configurer et d'activer cette fonctionnalité dans VISA et puis, pour la lecture, de définir un nombre d'octets supérieur à celui du plus long message envoyé par l'appareil. La fonction de lecture VISA s'arrêterait dès que le caractère de terminaison apparaît, en retournant par conséquent un message et en laissant les éventuels caractères restants dans le buffer du port série.
le 03-06-2019 01:20 AM
Je vous ai écouté à la lettre (en faisant deux boucles, producer/consumer) et tout fonctionne parfaitement. Merci !
le 03-07-2019 09:19 AM
BRAVO d'y être arrivé !
A mon humble avis, cette architecture est vraiment la bonne car elle sépare la lecture du traitement.