Tableau et valeurs en hexa [Résolu]

Signaler
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008
-
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008
-
Bonjour a tous,

Je me suis mis récemment au VB6...

Je programme actuellement une interface reliant mon pc a un automate, cependant je rencontre un probléme.

Je souhaite envoyer une trame  a l'automate, cette trame doit etre
envoyée en hexa, j'ai donc déclaré un tableau comme ceci :

dim trame(10) as byte


Je veux lui faire prendre des valeurs en hexa, cependant il refuse et
me les passe toutes en décimal, même avec la fonction hex()... D'ou mon
probléme... J'ai déja pensé a déclaré mon tableau en string, mais cela
pose des problémes au niveau de mes paramétres dans les procédures que
j'utilise

Merci d'essayer de m'éclairer

Bonne journée

25 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
ta trame de départ, dans un tableau d'octet
Trame(0) = &H4
Trame(1) = &H3
Trame(2) = &H0
Trame(3) = &H0
Trame(4) = &HFF
Trame(5) = &H10
Trame(6) = &HA
Trame(7) = &HE0

la suite, c'est juste le passage en ASCII/HEXA :

3A => hexa du code ascii du caractère ":"
ensuite, on prend le code ascii du caractère "0" et du caractère "4"
ensuite, on prend le code ascii du caractère "0" et du caractère "3"
ensuite, on prend le code ascii du caractère "0" et du caractère "0"
ensuite, on prend le code ascii du caractère "0" et du caractère "0"
ensuite, on prend le code ascii du caractère "F" et du caractère "F"
ensuite, on prend le code ascii du caractère "1" et du caractère "0"
ensuite, on prend le code ascii du caractère "0" et du caractère "A"
ensuite, on prend le code ascii du caractère "E" et du caractère "0"
ensuite, on ajoutes "0D0A", marqueur de fin de ta trame
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
trame(0) = &hAF
trame(1) = &hD4
trame(2) = &hC0
...
trame(10) = &hFF
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

J'ai déja essayé cette solution, mais la valeur stockée est en decimal (j'ai vérifié en pas a pas)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
bien sur que oui...

l'hexadecimal n'est qu'une representation graphique, dans une base donnée...
elle est même stockée en binaire, en fait... mais l'IDE donne la version décimale, plus claire pour nous, faibles humains.

le tout est que tu lui donne la bonne valeur, le reste...
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

Oui mais si j'envoie ma trame en décimal, l'automate ne la recevra pas bien non???

C'est vrai que si je suis ce que tu me dis (qui est tout a fait logique) ca devrait marcher ...

Donc je dois avoir une erreur dans ma trame alors...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
si, pas de soucis, le tout est question de base de compage a l'affichage...

derrière, c'est transparent, équivalent.
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

Je te joins l'aide en ligne de l'automate qui spécifie que le codage doit etre ascii

Lire 5 données 16 bits
à partir de l'adresse 17 :
 , Trame en hexadécimal avant codage ASCII :

" : " 04 03 00 00 FF 10 0A E0 " CR " " LF ", ----
,  , Trame en hexadécimal après codage ASCII :

3A 30 34 30 33 30 30 30 30 46 46 31 30 30 41 45 30 0D
0A, ----
,  , la réponse sera si les cinq valeurs valent 0 :

3A 30 34 30 33 30 41 30 30 30 30 30 30 30 30 30 30 30 30 30 30
30 30 30 30 30 30 45 46 0D 0A


Quel est leur intérét a nous demander d'envoyer une trame ascii alors? je ne comprend pas leur raisonnement...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
assez étrange, en effet...
il semblent vouloir que l'on transmette le code ascii de la representation ascii de la trame...

envoyer

30 34
pour signifier
04

c'est.... étrange

mais pas très complexe a mettre en oeuvre
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

Oui mais j'avais déja fait le test d'envoyer la trame en hexa et
l'automate me répondait tres bien...Mais quand je l'envoie en décimal
ca ne marche pas... Je vais revoir mon programme, j'ai oublié de
préciser j'envoie toute la trame d'un coup
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
gaffe au fait que VB bosse en Unicode et non en Ascii...

a part ce détail (un Strconv et on n'en parle plus)
il n'y a effectivement pas de soucis a envoyer directement

":04030000FF.."
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

Euh question bête, comment tu verifie que c'est en unicode??? Et c'est
quoi la différence entre unicode et ascii pour le logiciel??
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
VB stockes toutes les Strings en Unicode (deux octets par caractères).

en gros, on a :

b o n j o u r
62 00 6F 00 6E 00 6A 00 6F 00 75 00 72 00

Windows le gère, c'est transparent.
reste que pour communiquer avec certaines APIs, ou via Winsock ou MsComm, il te faudra surement passer cela en Unicode (Strconv vbFromUnicode)
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

je ne comprend pas comment employer ces deux fonctions, j'ai essayer comme ca :

vbFromUnicode (trame)

 StrConv (trame)


Il me sort des erreurs sur les deux ...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
Dim trame As String
trame = ":0403..."
trame = StrConv(trame, vbFromUnicode)
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

Je pense que tu as mal compris ce qui se passe. Je te montre mon code
(enfin une partie) pour que tu ressitue bien ce qui se passe:

Private Sub gestion_trame(ByRef trame() As Byte, ByVal ctrldata As Byte)

    Dim adr_esclave As Integer

    Dim fonction As Integer

    Dim adr_donnee As Integer

    Dim nb_octet As Integer

    Dim donnees As Byte

    Dim trame2(10) As String

    Dim trame3 As String

   

    adr_esclave = 4

    fonction = 3

    adr_donnee = InputBox("saisissez l'adresse du premier registre")

    nb_octet = 10

    trame(1) = &H3A

    trame(2) = Hex(3)

    trame(3) = &HA

    trame(4) = Hex(adr_esclave)

    trame(5) = Hex(fonction)

    trame(6) = Hex(adr_donnee - 1)

    trame(7) = &HA

    donnees = adr_esclave + fonction + adr_donnee - 1 + nb_octet

    trame(8) = ctrledatabyte(donnees)

    trame(9) = &HD

    trame(10) = &HA

   

End Sub


en fait, quand j'utilise un dim trame as string, ca marche, mais quand
j'utilise un dim trame as byte, c'est la que ca ne marche plus, il
stocke tout en decimal, alors que quand je l'utilise en string, il les
prend bien en hexa et la trame est bien reconstituée...Je suis obligé
de le déclarer en byte car je m'en sers pour un calcul de checksum..

Donc voili voila
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
oui, te faut un codage ASCII, sinon, kaput

et gaffe a ton tableau de 11 octets (et oui, les tableaux commencent généralement à l'indice 0)

perso, je manipulerai des tableaux de Byte...
et conversion ascii juste avant l'envoi
pas de soucis pour les calculs, ainsi
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

c'est ce que je compte faire, une coversion juste avant l'envoi...Mais
ca me laisse tout en décimal... par exemple, au début de ma trame je
dois envoyer ":" et il m'envoie 58 (le décimal du code ascii)...

J'ai essayé ca mais ca me retourne toujours une erreur...

dim trame2(10) as string  

trame2() = StrConv(trame, vbFromUnicode)
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

c'est ce que je compte faire, une coversion juste avant l'envoi...Mais
ca me laisse tout en décimal... par exemple, au début de ma trame je
dois envoyer ":" et il m'envoie 58 (le décimal du code ascii)...

J'ai essayé ca mais ca me retourne toujours une erreur...

dim trame2(10) as string  

trame2() = StrConv(trame, vbFromUnicode)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
tu as le choix des armes...

Dim Trame As String
Dim TrameEnvoi As String
Trame = ":04030000FF100AE0" & vbCrLf
TrameEnvoi = StrConv(Trame, vbFromUnicode)

----------------------

Dim Trame As String
Dim TrameEnvoi() As Byte
Trame = ":04030000FF100AE0" & vbCrLf
TrameEnvoi = StrConv(Trame, vbFromUnicode)

-----------------------------------

Dim Trame As String
Dim i As Long
Dim TrameEnvoi() As Byte
Trame = ":04030000FF100AE0"

ReDim TrameEnvoi(Len(Trame) + 1)
For i = 0 To Len(Trame) - 1
TrameEnvoi(i) = Asc(Mid$(Trame, i + 1, 1))
Next i
TrameEnvoi(i) = &HD
TrameEnvoi(i + 1) = &HDA
Messages postés
38
Date d'inscription
dimanche 4 juin 2006
Statut
Membre
Dernière intervention
28 mai 2008

Tres bien je pense que ca va m'aider , cependant, les valeurs stockées
dans trame sont en décimal, et je n'arrive pas a les passer en
hexa....Tout reste en décimal , du coup l'automate ne répond pas a ma
trame...J'ai essayé tes deux premiere techniques, mais le résultat est
le même...