[Catégorie modifieé VB6 -->.Net] SerialPort - protocole de transfert

RossBay Messages postés 5 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 31 mai 2010 - 27 mai 2010 à 12:15
RossBay Messages postés 5 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 31 mai 2010 - 31 mai 2010 à 15:40
Bonjour,

Pour commencer, je tiens à préciser que je suis totalement débutant en Visual Basic. J'ai quelques notions de C et C++, mais ça s'arrête là pour la programmation. Je m'essaie à Visual Basic 2008 Express depuis aujourd'hui.

Voici mon problème: Je cherche à faire communiquer un sonomètre avec mon PC via port RS232C. Je compte donc utiliser SerialPort dans mon programme. Le problème est que je n'arrive pas à comprendre tout à faire le protocole de transfert vers le sonomètre, expliqué dans la doc technique.

Je joins quelques extraits de la doc:



D'après ce que je comprends, on envoie en premier lieu le bloc de départ, appelé <STX>. On voit dans le tableau que son code hexa est 02, donc je comprends que je dois commencer mon message par 02. Et pareil pour la suite, je fous le code hexa qui correspond à chaque bloc. Est-ce bien ça ?

Là où je décroche, c'est sur la partie commande de la trame, celle qui dit concrètement au sonomètre ce qu'il doit faire. Là je ne vois plus de code hexa dans la doc, juste une liste des commandes toutes composées de trois lettres, et une explication sur le format de commande (en bas à droite de l'image). Comment suis-je cencé envoyer cette commande ?

SerialPort1.Write = ????

"02 01 43 WGT 2 00 0D 0A" par exemple ? En collant une chaine de caractère au milieu de mon message ? D'ailleurs, au passage, si vous pouviez m'expliquer la syntaxe pour envoyer une trame via SerialPort1.Write, je suis preneur. Merci d'avance

11 réponses

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
27 mai 2010 à 12:45
Salut,

Avant même d'entamer le développement en VB tu peux déjà télécharger un logiciel d'écoute sur port com (un sniffer) puis regarder si ton appareil ne t'envoi pas des trames lors ce que tu l'utilise, comme cela tu auras un aperçu de la syntaxe.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
RossBay Messages postés 5 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 31 mai 2010
27 mai 2010 à 13:45
Merci pour ta réponse.
Un point que je n'ai pas précisé: le câble reliant le port série au sonomètre étant spécifique (et bien entendu non fourni avec le sonomètre...), je ne l'ai pas encore à ma disposition. Je suis obligé de développer à l'aveuglette et de tester plus tard.

La seule aide à ma disposition est la doc technique dont j'ai posté quelques extraits. La société ne semble même pas disposer d'un service technique pour m'aider.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 mai 2010 à 13:52
Salut
En VB.Net, alors pourquoi avoir posté dans la catégorie VB6 ?

Sur un port Comm, il ne transite que des bytes, bien qu'ils puissent aussi représenter des textes sous forme ASCII.
Dans ton cas, ces Bytes sont exprimés en Hexa.
Quand tu veux envoyer une commande (sujet de ta préoccupation), il doit s'agir de texte, exemple "IDX?"
Dans ce cas, il te suffit de décomposer ce texte en 4 bytes, un pour chaque lettre.
Ces bytes sont bêtement le code ASCII des lettres.
Pour "IDX?", il suffira d'envoyer :
Décimal : 73 68 88 63
Héxa : 49 44 58 3F
Idem pour le "parameter"
auxquels il faudra bien sûr ajouter les bytes de début et de fin de trame.

Quand tu veux émettre sur un port Comm, plusieurs solutions.
La plus simple étant de préparer un tableau de bytes contenant toute la trame et d'envoyer ce tableau en fournissant au port l'index 0 de ce tableau et peut-être aussi le nombre de bytes qui composent ce tableau, tout dépend de l'objet utilisé pour cette Comm.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
27 mai 2010 à 13:57
Je te conseille donc d'attendre, développer un soft pour un appareil que que l'on ne peux pas tester c'est comme développer un programme en vb sous notepad, en attendant d'avoir Visual Studio pour corriger les bugs...

Ca ne te servira à rien...

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 mai 2010 à 14:00
Dans l'aide la commande Write, tu verras la syntaxe utilisant le tableau de bytes :
    SerialPort1.Write(mesBytes, LBound(mesBytes), mesBytes.Count)
0
RossBay Messages postés 5 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 31 mai 2010
27 mai 2010 à 14:20
Merci pour ces nombreuses réponses, je vais me pencher dessus.

Pour commencer, j'avoue n'avoir aucune idée de la bonne catégorie. J'ai vu qu'il y avait deux topics "Débutant", pas moyen pour moi d'en préférer un plutôt que l'autre, désolé.

@jack: Merci pour ces explications, je vais creuser un peu tout ça, mais ça me semble bien plus propre. Ce qui m'étonne c'est que ce ne soit pas du tout mentionné dans la doc, et que même, au contraire, ils précisent:

"Commands consists of three letters which are not case-sensitive.".

Cette phrase signifie simplement qu'il n'y a pas besoin de différencier le code ASCII de la minuscule ou majuscule ?

@Mayzz: j'ai pas le choix, ni le temps, je teste une solution pour faire des mesures avec ce sonomètre. Si je sens que ça avance, je ferai commander le câble, mais si je vois que je n'y arrive pas, je laisserai tomber. J'ai même pas de port série sur le PC sur lequel je travaille !
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
27 mai 2010 à 15:21
Je disait ca pour toi, comment veux-tu savoir si ca avance n'ayant pas tester ton code ? Tu vas te retrouver avec une application a déboguer entièrement et tu auras tellement d'erreurs que tu préféreras tout recommencer plutôt que de déboguer celle-ci...

Je ne te parle pas simplement de la communication entre ton programme et l'appareil, je parle de tout le reste, en plus tu précise que tu es débutant en vb, tu n'en connais donc pas la syntaxe, enfin bon c'est toi qui vois, mais personnelement tu perds justement plus de temps à développer sans le cable, tu le verra par la suite...

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 mai 2010 à 16:15
Pour le Case-Sensitive : Il ne fait te dire que, côté réception, il saura convertir un 'a' en 'A', c'est tout.
Donc ça te laisse un poil de liberté d'envoyer 'idx?' ou 'IDX?' ou toute combinaison des deux : il saura reconnaitre la commande.

Il faudra regarder, à la réception, si l'appareil renvoie systématiquement des MAJ ou non : il faudra en tenir compte dans le "Select Case" (*) de dissociation des réponses que tu finiras par mettre lors d'une réception.
(*) le Case de Select Case ici n'a rien à voir avoir la case de la lettre, c'est juste une autre façon de faire des If-Then-Else-ElseIf-EndIf
0
RossBay Messages postés 5 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 31 mai 2010
27 mai 2010 à 16:32
Je sais bien, mais je ne connais pas encore le prix de ce cable spécifique, et je ne veux pas le faire commander pour rien, dans le cas où mon programme n'aboutit à rien.

Y'a quand même toujours un truc qui me chiffone dnas l'envoi des commandes à trois lettres. La doc précise dans le "Command Format" (extrait dans le coin en bas à droite de l'image) ce qui est acceptable ou pas. Exemple:

"When a command has several parameters, the parameters must be separated by a space.

XXXp1_p2 Acceptable
XXXp1p2 Not acceptable"

Ca veut bien dire qu'il y a une écriture particulière pour les commandes, puisque la notion d'espace ou pas d'espace n'a pas de sens. A moins de mettre chaque byte pour chaque lettre + celui de la barre d'espace + byte du paramètre ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 mai 2010 à 00:25
Cable spécial pour une liaison série ?
Je suis sûr qu'ils en ont chez Darty !

Oui, c'est normal cette histoire de séparation (*) : Il faut bien qu'à la réception, il sache découper les paramètres !
(*) par contre, le choix de l'espace est assez étonnant; en général, c'est un double 00, mais bon, si la notice le précise ...
Quand il s'agit des commandes, pas de difficulté, la bibliothèque est figée, mais pour les paramètres, selon la commande, il peut y en avoir plusieurs et de longueur différente.
0
RossBay Messages postés 5 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 31 mai 2010
31 mai 2010 à 15:40
Bonjour,

Merci pour votre aide, je bloque un peu pour l'envoi des données. j'ai compris le fonctionnement, j'ai fait un tableau de bytes, mais je ne suis pas certain de sa déclaration. J'ai peur que SerialPort1.Write ne comprenne pas le type et m'envoie 57 quand je lui demande d'envoyer un W sur le port. Voici mon code, désolé par avance pour les innocentes erreurs qu'il contient:

'declaration du tableau pour 4 trames de 12 bytes
Dim commande (3, 11) As Byte
'remplissage du tableau
for i = 0 to 3
   commande(i, 0) = "02"
   commande(i, 1) = "0D"
etc..

SerialPort1.Open()
For i = 0 to 11
   SeriaPort1.Write(commande(0)(i))   


Il fait pas la gueule quand je lance le débogage, mais je suis certain que c'est un string qui arrive sur mon port. Quelqu'un pourrait me donner la commande pour lui faire comprendre que je lui donne des données en hexa ? Merci beaucoup
0
Rejoignez-nous