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

Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
- - Dernière réponse : KelaireM
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
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!
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
1728
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2018
1
Merci
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. 

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Whismeril
Messages postés
12394
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
Bonsoir, VB nos messages se sont croisés, comme j'étais sur la tablette, j'ai mis quelques minutes à le rédiger.
vb95
Messages postés
1728
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2018
> Whismeril
Messages postés
12394
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
Pas de souci t'inquiète !
Amitiés
Commenter la réponse de vb95
Messages postés
1728
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2018
0
Merci
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. 
Commenter la réponse de vb95
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
0
Merci
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! :-)
vb95
Messages postés
1728
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
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
Commenter la réponse de KelaireM
Messages postés
12394
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
0
Merci
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


Commenter la réponse de Whismeril
Messages postés
1728
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2018
0
Merci
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 !
Commenter la réponse de vb95
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
0
Merci
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..
Whismeril
Messages postés
12394
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
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.
Commenter la réponse de KelaireM
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
0
Merci
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!
Commenter la réponse de KelaireM
Messages postés
12394
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
0
Merci
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.

Commenter la réponse de Whismeril
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
0
Merci
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! :-)
Commenter la réponse de KelaireM

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.