Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Démystification utilisation binaire COM1

4 réponses
Avatar
Scanbird \(Marc\)
Bonsoir à tous

Le but de mon application est de contrôler une caméra numérique.

La majorité des interfaces sont réalisées et fonctionnelle à l'aide de
contrôle MS et National Instrument (NI), ces derniers servent
principalement à valider l'acquisition, la visualisation et la sauvegarde de
l'image.

De façon à ajuster les paramètres d'images (Gain, Integration, Offset, ...)
je dois passer par le port série. La documentation est assez explicite mais
il semble me manquer un pont quelque part. J'ai tenté de valider quelques
définitions sur Internet mais ça ne reste que des définitions et non des
explications de concepts. Il y a bien 3 articles de MS sur la KB qui sont
intéressant et que j'ai essayé (entre autre celui sur l'interception des
caractères de contrôle) mais sans grand résultat.

Voici donc quelques détails :
1- La caméra utilise le Handshake
2- Les commandes envoyées ont la forme suivante :
STX <"size of message" LSB> <"size of message" MSB> <command
byte><message bytes> <checksum byte>
3- Les échos reçus ont la forme suivante:
STX <"size of message" LSB> <"size of message" MSB> <command
byte><message bytes> <status byte> <checksum byte>
4- Dans la documentation, les paramètres LSB, MSB et Command Byte sont
régulièrement fourni.
5- La définition du checksum se lit comme suit:
Checksum calculation: In order to calculate the check sum for any given
command, accumulate the 8-bit sum off all bytes that constitute the command
and it's message bytes. Do NOT include the STX and "size of message" bytes
in this sum. Having accumulated this sum, take the twos compliment of the
sum. This will be the command checksum value. In C, the twos compliment of
the sum <sumval> can be calculated as: <Twos comp val> = -<sumval>; (ici je
dois avouer que je suis encore assez confus même si je connais le concept)
6- La camera renvoie les infos en binaires.
7- Je peux déjà contrôler la caméra à l'aide de l'application fournie par le
manufacturier mais elle est pas tellement conviviale et limite les images
sauvegardées à 1 par 3 secondes alors que la caméra en prend 7 ou 25
dépendamment du paramétrage.
8- Mon application est programmée en VB6 avec le contrôle MSCOMM.
(InputMode = comInputModeBinary entre autre propriété modifiée des
paramètres par défaut, et 9600,N,1 au 2 bout du câble série) Quand j'aurai
tout démystifié peut-être que je ferai la V2 sur .NET mais on verra.

Questions :
1- Comment dois-je libeller ma sortie MSCOMM.Output? STX a comme code
ASCII: 02, la doc est écrite comme étant $02 et j'aurais tendance à penser
que c'est le Hex qu'il faut &H02 (ou bien je pars avec une prise contre moi)
2- Complément de Q1 -> Comment envoyer la commande au complet? J'ai bien
trouvé quelques commandes d'exemples de Output du genre : '02 02 04 00 01
ea' mais sans réussir à ce que la caméra me donne l'impression de vouloir
parler avec moi :-(
3- Comment calculer un checksum sur des byte en VB ? (je crois que C a plus
de fonctionnalité à ce propos mais je ne le connais pas)
4- Comment transformer en quelquechose de lisible la réponse de la caméra?
J'ai beau avoir une variable Input (déclaré Variant ou déclaré rien du tout
"Dim Input") elle semble toujours vide que ce soit sur le _OnComm Event ou
sur un timer de 1000 ms pour aller lire MSCOMM.Input après l'envoi de
l'Output.

Je pense que ça fait de tour de ce qui pourrait m'aider à débloquer. Merci
à l'avance pour l'aide que vous pourrez m'apporter.

Bonne soirée et/ou bonne fin de semaine

Marc

4 réponses

Avatar
Jean-Marc
"Scanbird (Marc)" a écrit dans le message de
news:dse6f.28099$
Bonsoir à tous

Le but de mon application est de contrôler une caméra numérique.

La majorité des interfaces sont réalisées et fonctionnelle à l'aide de
contrôle MS et National Instrument (NI), ces derniers servent
principalement à valider l'acquisition, la visualisation et la sauvegarde


de
l'image.

De façon à ajuster les paramètres d'images (Gain, Integration, Offset,


...)
je dois passer par le port série. La documentation est assez explicite


mais
il semble me manquer un pont quelque part. J'ai tenté de valider quelques
définitions sur Internet mais ça ne reste que des définitions et non des
explications de concepts. Il y a bien 3 articles de MS sur la KB qui sont
intéressant et que j'ai essayé (entre autre celui sur l'interception des
caractères de contrôle) mais sans grand résultat.

Voici donc quelques détails :
1- La caméra utilise le Handshake
2- Les commandes envoyées ont la forme suivante :
STX <"size of message" LSB> <"size of message" MSB> <command
byte><message bytes> <checksum byte>
3- Les échos reçus ont la forme suivante:
STX <"size of message" LSB> <"size of message" MSB> <command
byte><message bytes> <status byte> <checksum byte>
4- Dans la documentation, les paramètres LSB, MSB et Command Byte sont
régulièrement fourni.
5- La définition du checksum se lit comme suit:
Checksum calculation: In order to calculate the check sum for any given
command, accumulate the 8-bit sum off all bytes that constitute the


command
and it's message bytes. Do NOT include the STX and "size of message" bytes
in this sum. Having accumulated this sum, take the twos compliment of the
sum. This will be the command checksum value. In C, the twos compliment of
the sum <sumval> can be calculated as: <Twos comp val> = -<sumval>; (ici


je
dois avouer que je suis encore assez confus même si je connais le concept)
6- La camera renvoie les infos en binaires.
7- Je peux déjà contrôler la caméra à l'aide de l'application fournie par


le
manufacturier mais elle est pas tellement conviviale et limite les images
sauvegardées à 1 par 3 secondes alors que la caméra en prend 7 ou 25
dépendamment du paramétrage.
8- Mon application est programmée en VB6 avec le contrôle MSCOMM.
(InputMode = comInputModeBinary entre autre propriété modifiée des
paramètres par défaut, et 9600,N,1 au 2 bout du câble série) Quand j'aurai
tout démystifié peut-être que je ferai la V2 sur .NET mais on verra.

Questions :
1- Comment dois-je libeller ma sortie MSCOMM.Output? STX a comme code
ASCII: 02, la doc est écrite comme étant $02 et j'aurais tendance à penser
que c'est le Hex qu'il faut &H02 (ou bien je pars avec une prise contre


moi)
2- Complément de Q1 -> Comment envoyer la commande au complet? J'ai bien
trouvé quelques commandes d'exemples de Output du genre : '02 02 04 00 01
ea' mais sans réussir à ce que la caméra me donne l'impression de vouloir
parler avec moi :-(
3- Comment calculer un checksum sur des byte en VB ? (je crois que C a


plus
de fonctionnalité à ce propos mais je ne le connais pas)
4- Comment transformer en quelquechose de lisible la réponse de la caméra?
J'ai beau avoir une variable Input (déclaré Variant ou déclaré rien du


tout
"Dim Input") elle semble toujours vide que ce soit sur le _OnComm Event ou
sur un timer de 1000 ms pour aller lire MSCOMM.Input après l'envoi de
l'Output.

Je pense que ça fait de tour de ce qui pourrait m'aider à débloquer.


Merci
à l'avance pour l'aide que vous pourrez m'apporter.



Hello,

Je pensais pouvoir répondre à tout, mais la phrase suivante me fait douter:

"J'ai bien
trouvé quelques commandes d'exemples de Output du genre : '02 02 04 00 01
ea' mais sans réussir à ce que la caméra me donne l'impression de vouloir
parler avec moi :-(


"

La commande d'output dont tu parles ici est elle un vrai exemple valide?
Parce que alors, je ne comprend plus rien :-(
Ca voudrait dire:
02 <STX>
02 04 (4*256 + 2 = 1026) (taille du message)
00 command byte
01 message (1 seul caractère ?? alors qu'on a dit 1026 ??)
EA ???? Pas le complément à 2 valide de rien du tout ici..

Bref,

Si tu pouvais donner:
- Un exemple de commande valide (de STX au checksum, en hexa)

- Un exemple de Byte de commande (des valeurs qui existent)
- Un exemple de message allant avec une commande donnée

A part ça, $02 est bien la notation usuelle pour dire 02 en hexa (donc
&h02).


--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Vincent Guichard
Scanbird (Marc) a écrit :
Bonsoir à tous



Bonsoir,

Questions :
1- Comment dois-je libeller ma sortie MSCOMM.Output? STX a comme code
ASCII: 02, la doc est écrite comme étant $02 et j'aurais tendance à penser
que c'est le Hex qu'il faut &H02 (ou bien je pars avec une prise contre moi)


C'est en effet probablement des valeurs hexadecimales. Mais de toute
façon, 02 hexa est la même chose que 02 décimal...


2- Complément de Q1 -> Comment envoyer la commande au complet? J'ai bien
trouvé quelques commandes d'exemples de Output du genre : '02 02 04 00 01
ea' mais sans réussir à ce que la caméra me donne l'impression de vouloir
parler avec moi :-(


A prioris, tu dois constituer un tableau de byte, le remplir avec les
valeurs necessaires, et l'affecter à la propriété Outpurt de ton
contrôle. Quelque chose comme:

dim tableau(0 to 6) as byte
tableau(0) = &H02 'STX
tableau(1) = &H02 'Length LSB
tableau(2) = &H00 'Length MBS
tableau(3) = &H04 'Command Byte
tableau(4) = &H00 'Message Bytes (1)
tableau(5) = &H01 'Message Bytes (2)
tableau(6) = Checksum(tableau) 'Checksum

MSComm1.Output = tableau

3- Comment calculer un checksum sur des byte en VB ? (je crois que C a plus
de fonctionnalité à ce propos mais je ne le connais pas)


Je proposerais bien une fonction de ce genre:

Private Function CheckSum(ByRef tableau() As Byte) As Byte
Dim lenght As Integer
lenght = tableau(1) + &H100 * tableau(2)
If UBound(tableau) <> lenght + 4 Then Err.Raise 513, , "La taille
du tableau ne correspond pas."
Dim i As Integer, b As Byte
For i = 0 To lenght 'Calcul de la somme
b = &HFF And (b + tableau(3 + i))
Next i
CheckSum = &H100 - b 'Complement à deux
End Function

Mais comme dit Jean-Marc, le EA du message que tu donnes en example ne
correspond pas (ici, je trouve FB, par exemple, au lieu du EA annoncé).

4- Comment transformer en quelquechose de lisible la réponse de la caméra?
J'ai beau avoir une variable Input (déclaré Variant ou déclaré rien du tout
"Dim Input") elle semble toujours vide que ce soit sur le _OnComm Event ou
sur un timer de 1000 ms pour aller lire MSCOMM.Input après l'envoi de
l'Output.



Je dirais qu'il faut que InputMode soit sur comInputModeBinary si tu
veux pouvoir récupérer des valeurs binaires.
tu récupèrera un tableau de bytes dans ta variable variant.

Je pense que ça fait de tour de ce qui pourrait m'aider à débloquer. Merci
à l'avance pour l'aide que vous pourrez m'apporter.






Bonne soirée et/ou bonne fin de semaine

Marc




Avatar
Scanbird \(Marc\)
Merci Vincent

Effectivement, tes réponses ont pu aider.

La fonction du Checksum a fonctionné à la perfection au début mais là elle
semble me donner quelques troubles. J'ai du modifier qqc dans mon
application qui fait que ça ne marche pas.

Est-ce que quelqu'un pourrait m'expliquer le principe du 'complément à 2'
SVP.

Merci

Marc

"Vincent Guichard" a écrit dans le message de
news: 435cd2d5$0$7833$
Scanbird (Marc) a écrit :
Bonsoir à tous



Bonsoir,

Questions :
1- Comment dois-je libeller ma sortie MSCOMM.Output? STX a comme code
ASCII: 02, la doc est écrite comme étant $02 et j'aurais tendance à
penser que c'est le Hex qu'il faut &H02 (ou bien je pars avec une prise
contre moi)


C'est en effet probablement des valeurs hexadecimales. Mais de toute
façon, 02 hexa est la même chose que 02 décimal...


2- Complément de Q1 -> Comment envoyer la commande au complet? J'ai bien
trouvé quelques commandes d'exemples de Output du genre : '02 02 04 00 01
ea' mais sans réussir à ce que la caméra me donne l'impression de vouloir
parler avec moi :-(


A prioris, tu dois constituer un tableau de byte, le remplir avec les
valeurs necessaires, et l'affecter à la propriété Outpurt de ton contrôle.
Quelque chose comme:

dim tableau(0 to 6) as byte
tableau(0) = &H02 'STX
tableau(1) = &H02 'Length LSB
tableau(2) = &H00 'Length MBS
tableau(3) = &H04 'Command Byte
tableau(4) = &H00 'Message Bytes (1)
tableau(5) = &H01 'Message Bytes (2)
tableau(6) = Checksum(tableau) 'Checksum

MSComm1.Output = tableau

3- Comment calculer un checksum sur des byte en VB ? (je crois que C a
plus de fonctionnalité à ce propos mais je ne le connais pas)


Je proposerais bien une fonction de ce genre:

Private Function CheckSum(ByRef tableau() As Byte) As Byte
Dim lenght As Integer
lenght = tableau(1) + &H100 * tableau(2)
If UBound(tableau) <> lenght + 4 Then Err.Raise 513, , "La taille du
tableau ne correspond pas."
Dim i As Integer, b As Byte
For i = 0 To lenght 'Calcul de la somme
b = &HFF And (b + tableau(3 + i))
Next i
CheckSum = &H100 - b 'Complement à deux
End Function

Mais comme dit Jean-Marc, le EA du message que tu donnes en example ne
correspond pas (ici, je trouve FB, par exemple, au lieu du EA annoncé).

4- Comment transformer en quelquechose de lisible la réponse de la
caméra? J'ai beau avoir une variable Input (déclaré Variant ou déclaré
rien du tout "Dim Input") elle semble toujours vide que ce soit sur le
_OnComm Event ou sur un timer de 1000 ms pour aller lire MSCOMM.Input
après l'envoi de l'Output.



Je dirais qu'il faut que InputMode soit sur comInputModeBinary si tu veux
pouvoir récupérer des valeurs binaires.
tu récupèrera un tableau de bytes dans ta variable variant.

Je pense que ça fait de tour de ce qui pourrait m'aider à débloquer.
Merci à l'avance pour l'aide que vous pourrez m'apporter.






Bonne soirée et/ou bonne fin de semaine

Marc




Avatar
Vincent Guichard
Scanbird (Marc) a écrit :
Merci Vincent

Effectivement, tes réponses ont pu aider.

La fonction du Checksum a fonctionné à la perfection au début mais là elle
semble me donner quelques troubles. J'ai du modifier qqc dans mon
application qui fait que ça ne marche pas.

Est-ce que quelqu'un pourrait m'expliquer le principe du 'complément à 2'
SVP.



Le complement à deux est une manière de noter les nombres négatifs, qui
permet d'obtenir des resultats corrects directs lors des opérations
arithmétiques. Pour réaliser un complement à deux, on réalise d'abord un
complement à un (on inverse tous les bits), puis on ajoute un au résultat.
Par exemple, le complement à 1 de 0000 0001 (1) est 1111 1110 et son
complement à deux est 1111 1111 (-1).

Cela permet aussi d'avoir une seule représentation du nombre 0.

Dans mon calcul, j'ai utilisé une astuce pour calculer le complément à
deux: Si b est le complement à deux de a, alors a+b = 1 0000 0000 (en
suposant que a et b sont des bytes)
on a donc b = 1 0000 0000 - a,,soit en hexa b = &H100 - a
remarque qu'il est possible que je me fourvoisses, auquel cas tu peux
revenir au calcul initial du complement à deux.
b = &HFF And ( (not a) + 1 )



Merci


de rien


Marc



Vincent