Une mauvaise conversion avec ToChar() [Résolu]

Signaler
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
5 juillet 2016
-
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
5 juillet 2016
-
Bonjour à tous,

Je tente d'envoyer un tableau de string contenant des valeurs Hexadecimal via un port RS232.

Dans un premier temps, je coupe le string tous les deux caractères pour obtenir un octet, que je place dans un nouveau tableau, jusqu'à la fin du mot. Ensuite, je convertie ces valeurs en int32 puis en char. Je place ensuite cette valeur dans un buffer pour l'envoyer lorsque j'ai un bloc de 2Ko, via le port série.

Mais petit problème!
La conversion se passe très bien.. Sauf! Pour les valeurs de 1 octet! (tbl(3), tbl(7) et tbl(10)) où j'obtiens "?" (3F en hexa) (un caractère qui n'appartient pas à la table ascii) alors que les valeurs 84 et 85 et 9F existe bien, dans la table ASCII étendue.

Pourquoi?!

Mes variables donnee et BUFFER sont déclarée en tant qu'Object.



'_____ LES VALEURS DU TABLEAU ______

tbl(1) = "A55AA5A5E6008003E6FA0008B831A8409AF4FDE0C9A286FA870B3DF8FAE00008"
tbl(2) = "A55AA5A5E6018100E6030300E608D0F7E6860000E60A00A0E60B00A2E60900A2E6F14840E6F20060B821E6F0AA00CA006A0ACA00F209F06046F682003D0EE6F0AA00CA006A0ACA00380AF075F084CA00120ADC07B808EA00E80946F683003D0CE6F0AA00CA006A0ACA00380ADC05A804CA00860AEA00E80946F684003D1BE6F0AA00CA006A0AE00CCA00380AF075F084CA00120AF0902D09CA00F209DC07B90800C00881187028913DF7F00CCA00860AEA00E80946F685003D1CE6F0AA00CA006A0ACA00380AF075F084E00DCA00120AF0902D0AE000DC07A90800D0CA006A0A0881187028913DF7F00DCA00860AEA00E80946F69F003D2DE6F0AA00CA006A0AE6F1E000ECF1E6F13409ECF1CA00380AECF5ECF4F2F710FE06F71000E086CA00120AB807087228613DFAE6F0EA00CA006A0ADB00CC00E6018100F2F710FE06F71000E086A807CA00860A087228613DFA0D4B46F69E003D0CE6F0AA00CA006A0ABB6BECF5ECF4E6F0EA00CA006A0ADB0046F69D003D30E6F0AA00CA006A0ABB3947F031003D03B54AB5B50D2447F032003D05E6F0EA00BB69B748B7B747F033003D19BB37F080BB35F090BB33F0A0BB31F0B0BB2FF0C0BB2DF0D0BB2BF0E0CA00680BBB78CA003E0BE6F11C40B8D1E6F11E40B8E10D0946F693003D04E6F0AA00BB440D02EA003208E6F0EA00BB3EEA003208E6F14440E6F24840E6F35C40E6F40040A8519AF5FDE0F2F01CFFA903B842CB00E6F14440E6F24840E6F35C40E6F40040A8519AF5FDE0A903B842A8519AF5FDE0A913B842CB00E6F14440E6F24840E6F35C40E6FB0040A8A19AFAFDE0A983B8B2A8A19AFAFDE0A993B8B2A8A19AFAFDE0E10BA9A3B8B2CB00E6F14440E6F24840E6F38040B903A8519AF5FDD0E6F40020B842CB00E6F14440E6F24840E6F38040B903A8519AF5FDD0E6F40020B842E6F38040B913A8519AF5FDD0E6F40020B842CB00F2F0F2FEE6F1C7FF6001F6F0F2FEE000F6F0B4F1E6F00480BB2BE6F01027CC0028013DFDE6F00780BB23F6FABCF1F2F0B8F17801F6F0B8F1F2F0BCF068013DFCF6F9BAF1F6F8B8F1F00BBB12F2F0B8F1E6F1FEFF6001F6F0B8F1F2F0BCF068012DFC28B140BC8D03F00BBB020DFACB00F6F0BEF1F2F0BAF17804F6F0BAF1F2F0BCF066F008002DFBCB00E6F0AAAAF6F0C0F0E6F05455F6F0C0F0E6F0FF96F6F0C0F0E6F00018F6F0C0F0E6F0FF8EF6F0C0F0CB00E6F0AAAAF6F0C0F0E6F05455F6F0C0F0E6F0FF96F6F0C0F0E000F6F0C0F0CB00"
tbl(3) = "84"
tbl(4) = "0000E0"
tbl(5) = "BC05"
tbl(6) = "A55AA5A5EC01EC03E601FF03E603030048803D19E6F2047FE0E1B812E00EE6F20A7FA81268132D0178E4E6F80008E6F90000E6FA00D8E6FB0080E6FC3652E02DE00FEA00D80148823D1DCA00DE019AF41500CA000A02CA001C02CA002003CA00320348F03D0D06FB001018A026FE001038D048E03DEA48D03DE80D02E6FF0880EA00D80148833D16CA00DE019AF40E10E009CA005C0348F03D0B06FB800018A006FE800018D028C13DF30D02E6FF1380EA00D80148853D0CCA009C03E6F10000E6F200D8DC01B892E018E00FEA00D80146F816003D0A1A880203ECF0ECF11A880003FCF9FCF8E00F0D7746F80C003D1848A02D0948A12D0A48A22D0B48A32D0CE6FF02800D0CCA00DA030D09CA003E040D06CA00E0040D03CA005E050D000D5C46F80D003D11BB5B9AF40B10BB6EE009CA004202CA002003CA00320348F03D030D02E6FF13800D480D000D0046F810003D4148D02D1CBB59E6F2AA00E6F35400E6F4B00048D13D02E0050D0848D23D02E0150D0448D33D0BE0550D00DC1AB842B853E6F4F000DC0AB842CA002003E6F50CFFD700FF00A84566FACC0046FAC0003D010D0646FAC4003D027C340D017C64684748412D0348422D010D02E0280D0848452D0348462D010D02E0380D01E018E00F0D02E6FF0280FC03FC01DB00E00446FADF009D1146FAC0008D0E3D0346FB00F09D0AF01B66F17F003D061FF4F01B66F1FF0F3D010FF4CB00E6F1C000E6F2AA00E6F3F500DC01B832CB00F01A66F1FC00E6F2AA00E6F35400E6F48000E6F5AA00DC11B842B853E6F43300DC0AB84BCB00F01A66F1FC00E6F2AA00E6F35400E6F4AA00E6F5800048902D02E6F4A500DC11B852B843E03548902D02E6F55300DC0AB85BCB00F01A66F1FC00E6F4500048902D02E6F45500E6F2AA00DC01B842E6F4AA00DC0AB84BCB00F01A66F1FC00E6F2AA00E6F35A00E6F4A000E6F5AA00DC11B842B853CB00E6F1C000F02DF03EE6F43C00E005DC01B854E6F45400DC029853DC01B854E6F4AA00DC029853DC01B854E6F45400DC029853DC01B854E6F4AA00DC029853DC01B854E6F45A00E6F5550048913D01E055DC01B854CB00E6F1C000E6F45E00E6F55E00DC01B854CB00E6F1067F84011CFFA82166F27F003DFCCB00E00FE6F1087F84011CFFA82166F230002D03E6FF01800D08E6F10A7FA82166F210002D02E6FF1180CB00E00FCA000A02BB89BBDDBBE548F03D17ECFDECFEF01A66F1FC00E6F2F200E6F480007C14DC0DA83E08E218D0DC01B83228413DF8FCFEFCFDBB82BBC4BBCCCB00E6F20A7F84021CFFA89266F91F00E6F2087FA81266F130005C417091A81268175C517091E6F2067FA81266F17F002D01CFF9A81266F1007F2D01DFF9CB00E00FF01DF02EE6F30A7F84031CFFA84366F400C0DC01C4420800F05C06F21000E6F3107F9843DC01B842082228513DFABBC8E018E6F3027FA84366F40F00E6F3007FA82366F200F0702456F20AA0F04266F40F002D05F04266F403F02D010D01E008CB00E00FE019E6FAC000E00BBB8948F03D48F09EE6F10A7F84011CFFA82166F200C0DC0DD439080066F300C040233D1006F91000E6F1107FF05C9821DC0D983940233D0628513DF9BB6C48803D010D03E6FF01800D26F09EE6F255AADC2DB8290892B8290892E6F53E00E002DC0DB829089228513DFBE019E6FAC000E6FB8000CA005C0348F03D0DCA000E03E6F10A7F84011CFFA82166F21F0058212D02E6FF0180CB00CA000A02E019E6FAC000E6FB8000CA004202CA002003CA00320348F03D2DE6F10A7FA82168233D28CA000A02E019E6FAC000E00BCA004202CA002003CA00320348F03D1AE6F10A7FA82166F200C03D14F05CE6F3107F98433D0F28513DFCF09EE045E002DC0DB829089228513DFBBB0748803D02E00F0D02E6FF0180CB00E018CA000A02E009CA00B802E019CA00B802CA00320348F03D21E6F1007FA82166F2FF0F76F200A0B821E6F1027FA82166F20F0056F20A003D11E6F1007FA82166F200F056F200A03D09E6F10A7FA82166F21C0056F20C003D01E008CB00"
tbl(7) = "85"
tbl(8) = "0000E0"
tbl(9) = "BC05"
tbl(10) = "9F"
tbl(11) = "0000E0"
tbl(12) = "0000C000A08C1B00240000000000FF80"


'_______ La partie intéressante _____


For l = 1 To Data.Length - 1

'Réinitialisation
j = 0
BUFFER = Nothing

hbwait(1000)

'Découpe de la trame à envoyer
While (Data(l) <> Nothing)
C0(j) = Data(l).Substring(0, 2)
Data(l) = Data(l).Substring(2, Len(Data(l)) - 2)
j = j + 1
End While

'Conversion en Char et ajout dans le buffer
For j = 0 To 2047
If (C0(j) <> Nothing) Then
donnee = C0(j)
donnee = Convert.ToInt32(donnee, 16)
donnee = Convert.ToChar(donnee)
Buffer = Buffer & donnee
End If
Next

'Envoie des données en un bloc de 2Ko
SPort1.Write(Buffer)

'Réinitiaisation de C0
For j = 0 To 2048
C0(j) = Nothing
Next

Next


Merci pour votre aide!

9 réponses

Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Essaie cette Sub ( Data contient le tbl à envoyer)


Private Sub WriteRS232(Data() As String)

Dim Buffer() as byte

Redim buffer(0 To 2047) ' buffer 2048 octets
For i = 0 To Data.Length - 1 step 2
buffer(i\2) = Convert.ToByte(Data.substring(i,2),16) ' conversion en byte
Next
SPort1.Write(Buffer,0,2048) ' envoie 2048 octets
SPort1.Close()

End Sub


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
Messages postés
16052
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juin 2021
551
Bonsoir, VB nos messages se sont croisés, comme j'étais sur la tablette, j'ai mis quelques minutes à le rédiger.
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137 >
Messages postés
16052
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juin 2021

Pas de souci t'inquiète !
Amitiés
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonjour
Quel VB utilises-tu ! ( VBA, VB6, VB Script ou VB net )
Je pense VB Net mais pas certain à 100%
Obligatoire l'envoi par bloc de 2048 octets ?
J'attends ta réponse
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
5 juillet 2016

Bonjour, merci de ta réponse!

-Oui, j'utilise bien du VB.NET! (FrameWork 4.5 exactement...)

-C'est tout à fait ça, ce sont des données en hexadécimal, c'est pourquoi ici :

            
While (Data(l) <> Nothing)
C0(j) = Data(l).Substring(0, 2)
Data(l) = Data(l).Substring(2, Len(Data(l)) - 2)
j = j + 1
End While


je découpe ces données (Data() est en fait tbl()) tous les deux caractères, dans un nouveau tableau, pour ensuite les convertir les convertir! :-)
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
oubli de ma part : obligatoire l'envoi par bloc de 2048 octets ?
Il est préférable de travailler sur des bytes que sur des int32 dans ton cas
Messages postés
16052
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juin 2021
551
Bonjour,

Je n'ai rien pour tester là, mais Vb.net est un langage "plutôt" typé, donc ça
  donnee = C0(j)'là donnee est un string je suppose
  donnee = Convert.ToInt32(donnee, 16)'là ça devient un int
  donnee = Convert.ToChar(donnee)'et là un char

C'est pas terrible, je ne sais pas si cela va solutionner ton problème, mais il est plus que conseiller d'utiliser des variables différentes définies dans le bon type.


Quelques bonnes pratiques:

Option Strict On
Option Explicit On
et désactiver la référence à Microsoft.VisualBasic


Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Salut Whismeril
Mes yeux n'avaient point vu ces erreurs

Pour KelaireM inspire toi de ceci :http://codes-sources.commentcamarche.net/forum/affich-10061243-recuperer-les-octets-d-1-int

C'est du C# mais facilement transposable !
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
5 juillet 2016

Bonjour et merci de ta réponse Whismeril!

J'ai tenté de modifier le code avec les Option Explicit et Strict en utilisant des variables intermédiaire : je n'ai donc plus de variable "Object".
Mais le résultat est le même.. j'obtiens un "?"
Je le redis, ça marche très bien avec les autres valeurs (>1octet), qui pourtant sortent du code ASCII non étendu.. :-(

Pour te répondre vb95, oui, l'envoie des données par 2Ko est obligatoire.. (Pour programmer un uC infineon)


Voilà mon "nouveau" code


Sub Decoupage2a2(Data() As String)

Dim j As Integer
Dim C0(13000) As String
Dim valeur As Integer
Dim donneestr As Char
Dim donnee As String
Dim BUFFER As String

For l = 1 To Data.Length - 1

j = 0
BUFFER = Nothing

hbwait(1000)

While (Data(l) <> Nothing)
C0(j) = Data(l).Substring(0, 2)
Data(l) = Data(l).Substring(2, Len(Data(l)) - 2)
j = j + 1
End While

'Envoie du bloc de 2 Koctets
For j = 0 To 2047
If (C0(j) <> Nothing) Then
donnee = C0(j)
valeur = Convert.ToInt32(donnee, 16)
donneestr = Convert.ToChar(valeur)
BUFFER = BUFFER + donneestr
End If
Next

SPort1.Write(Buffer)

'Réinitiaisation de C0
For j = 0 To 2048
C0(j) = Nothing
Next

Next

SPort1.Close()

End Sub



Aucune erreur n'est trouvée lors de l’exécution..
Messages postés
16052
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juin 2021
551
J'ai bien précisé que cela ne solutionnerait par forcément ton problème.
Mais même si un code, mal typé marche dans un cas, il peut ne pas fonctionner dans un autre sans que l'on sache pourquoi.
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
5 juillet 2016

Bonjour,

la conversion marche très bien cette fois!
Par contre, si je regarde avec un sniffer : le bloc ne s'envoie pas d'un seul trait (il est découpé en petits morceaux, parce que c'est un tableau?).

Je vais faire des petits tests pour améliorer cela, peut être mixer les deux techniques?

En tout cas je vous remercie pour vos solutions!
Messages postés
16052
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juin 2021
551
Bonjour,
il est découpé en petits morceaux, parce que c'est un tableau?

non ça c'est la joie du protocole RS...
Ça peut envoyer un message d'un coup ou par morceau.

Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
5 juillet 2016

Toutes mes excuses, je viens de tester en "conditions réelles", en étant connecté au uC : les blocs s'envoient parfaitement!

Le fait que je me parlais à moi-même (via RS 232! Non, c'est faux, je ne suis pas sckyzo :D) apportait peut être des erreurs supplémentaires...

Le sujet est donc résolu! Un grand merci à vous deux pour vos réponses! :-)