Une mauvaise conversion avec ToChar()

Résolu
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016 - 20 avril 2016 à 15:57
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016 - 21 avril 2016 à 09:19
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

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 20/04/2016 à 18:52
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. 
1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
20 avril 2016 à 18:43
Bonsoir, VB nos messages se sont croisés, comme j'étais sur la tablette, j'ai mis quelques minutes à le rédiger.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
20 avril 2016 à 18:46
Pas de souci t'inquiète !
Amitiés
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 20/04/2016 à 16:34
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. 
0
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016
20 avril 2016 à 16:35
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! :-)
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
20 avril 2016 à 16:40
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
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
20 avril 2016 à 16:37
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


0

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

Posez votre question
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
20 avril 2016 à 16:47
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 !
0
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016
20 avril 2016 à 17:10
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..
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
20 avril 2016 à 18:44
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.
0
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016
21 avril 2016 à 08:55
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!
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 avril 2016 à 09:01
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.

0
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016
21 avril 2016 à 09:19
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! :-)
0
Rejoignez-nous