le 12-13-2017 07:15 AM
Bonjour la communautés,
je viens vers vous car je rencontre un souci avec un projet qui utilise une communication RS232.
Le but de mon projet est de communiquer avec une carte qu'on m'a fournis en RS232. Le but est de transmettre des instructions à cette carte pour générer des PWM.
Voici une trame d'exemple que j'ai repris du document du fournisseur pour générer une PWM à 75%. J'ai copié cette trame pour essayer dans un premier temps de communiquer avec la carte.
0x56 0x57 0x58 0x05 0x0C 0x00 0x03 0xFF 0x5F 0x72
Pour débuter mes essais j'ai conçu ce Vi (qui se trouve aussi en pièce jointe)
Lors de mes essai j'ai également installé un sniffer de réseau RS232, Serial Port Monitor qui m'a permis de voir que j'envoi bien ma trame.
(La partie en violet est la trame que je reçois de la carte et celle en marron c'est ce que j'essaye d'envoyer)
La différence que je dois est que ma donnée se trouve dans la partie DATA (Chars) (Vert) alors que normalement elle devrait se trouver dans DATA(Rouge) ?
Est ce que j'ai fait une erreur dans mon programme ?
Pouvez vous m'aider s'il vous plait.
Cordialement.
Baba59
Résolu ! Accéder à la solution.
le 12-13-2017 08:09 AM
Bonjour Baba59,
j'ai deux remarques à faire, deux choses qui m'interpellent dans ton Vi.
Tu commences par une lecture du port série! Je suis étonné, en général, les devices répondent à des commandes ou demandes qui leur sont préalablement envoyées, et renvoyent ensuit des données ou des confirmations d'actions réalisées (config etc...).
N'ayant pas le datasheet de ton équipement, difficile de se prononcer sur l'utilité de la lecture en première boucle.
Seconde remarque, tu envoyes à ton équipement une chaine de caractère reprenant les 0x, mais je pense qu'il ne sont là que pour indiquer dans le datasheet que les valeurs sont en hexadécimal, et qu'il faut en tenir compte pour envoyer tes commandes; si tu envoyes ta chaine de caractère ainsi, je ne suis pas certain qu'elle soit bien interprétée.
Une dernière remarque, il est bon, dans la boucle, de vider les buffers entrée/sortie pour éviter des "restes" qui pourraient parasiter les commandes/données suivantes!
le 12-13-2017 09:23 AM
En premier lieu 0x de devrait pas être inclus dans le message. Ensuite tu peux essayer ceci: fait un clic droit sur ton contrôle buffer d'écriture et sélectionne "hex display" tu verras ainsi ce que tu envois à ta carte (beaucoup plus que 10 bytes). Maintenant, toujours en mode hax display écris 5657 5805 0C00 03FF 5F72 (l'espacement entre les paquets de fait automatiquement) et vérifie si tu obtiends le résultat prévu.
Si tu vas dans propriétés -> apparence du contrôle buffer d'écriture coche "display style visible" ce sera plus évident que l'affichage est en mode hexadécimal.
Ben64
12-13-2017 09:46 AM - modifié 12-13-2017 09:51 AM
Bonjour PhilB,
je découvre la communication RS232 avec Labview donc il est certainement probable que mon programme présente des erreurs.
Je tiens compte de vos remarques pour améliorer mon code. Afin de répondre à votre première remarque je voulais commencer par une lecture du port série car lors de l'allumage la carte envoi un message sur le réseau RS232. Je voulais juste faire un essai si la carte était allumé et que j'avais bien configurer ma communication.
Pour la seconde remarque j'ai effectué un essai en hexa avec mon logiciel de test de communication RS232. Et j'ai bien vus que la carte répondait à ma commande. Donc j'ai pu envoyer la trame suivant :
0x56 0x57 0x58 0x05 0x0C 0x00 0x03 0xFD 0x19 0x2A
Pour pouvoir communiquer avec ma carte il faudrait que je transforme ceci en trame (hexadécimal). Pour l'envoyer comme ceci :
Bonjour Ben,
J'ai fais cet essai également mais cela ne fonctionne pas. Il faut vraiment que la trame correspondent à l'image ci-dessus.
Sur Labview je sais qu'on peut écrire en Hexa à travers une chaîne de caractère. Mais cela correspond pas à ce que je souhaite auriez vous une idée de ce que je devrais utiliser ?
Merci d'avance.
Cordialement.
Baba59
le 12-13-2017 10:21 AM
@Baba59 wrote:
Pour pouvoir communiquer avec ma carte il faudrait que je transforme ceci en trame (hexadécimal). Pour l'envoyer comme ceci :
Bonjour Ben,
J'ai fais cet essai également mais cela ne fonctionne pas. Il faut vraiment que la trame correspondent à l'image ci-dessus.
Sur Labview je sais qu'on peut écrire en Hexa à travers une chaîne de caractère. Mais cela correspond pas à ce que je souhaite auriez vous une idée de ce que je devrais utiliser ?
Je ne vois pas de différence entre ma méthode et ce que tu montres dans ton image.
C'est regroupé en Word au lieu d'être en Byte mais ce n'est que l'affichage, ça ne change pas ce qui est envoyé à la carte.
Ben64
le 12-13-2017 11:43 AM
maiiiiis, Baba59, ils sont un peu petits tes extraits d'écran, j'arrive pas à lire avec mes vieux yeux
Ben64 a raison, ça devrait fonctionner avec ce qu'il te conseille
Et n'oublie pas les vidanges de buffers, c'est souvent une source de soucis quand on ne le fait pas!!
le 12-13-2017 12:08 PM
le 12-13-2017 01:19 PM
je confirme, ce serait bien de partager ces infos, ou un lien vers le datasheet!!
plus on en sait, mieux on peut t'aider 😉
le 12-14-2017 03:00 AM
Bonjour à vous,
Premièrement merci pour votre aide et désolé pour le manque d'information mais je suis assez limité aux niveau information a partager je suis un peu pied et poing lié.
Néanmoins, j'ai fais un essai avec les informations que vous m'avez fournis et cela fonctionne correctement. J'arrive à envoyer des trames fixe à ma carte, maintenant je souhaiterais faire varier ma PWM avec une commande numérique.
Donc je suis partie de ce principe.
Mais je ne sais pas comment je peux faire pour rassembler mes chaîne car la concaténation me donne pas le résultat ressemblant à ce que je souhaite. Auriez vous une idée ?
Cordialement.
Baba59
le 12-14-2017 03:16 AM
Salut Baba59,
on avance, c'est bien 🙂
On n'a pas d'info sur la chaine de commande que tu envoies à ton équipement, difficile de se prononcer sur une éventuelle erreur à ce niveau 😞
J'ai vu que tu as suivis mes conseils de vider les buffers, mais je pense que le Vi que tu utilises pour ça ne convient pas, je pense que CLR supprime les buffers mais ne les vide pas.
Le Vi a utiliser est Flush Buffers, une image vaut mieux qu'un long discours 😉