KelaireM
Messages postés16Date d'inscriptionmercredi 20 avril 2016StatutMembreDernière intervention 5 juillet 2016
-
20 avril 2016 à 15:57
KelaireM
Messages postés16Date d'inscriptionmercredi 20 avril 2016StatutMembreDerniè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.
'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
vb95
Messages postés3418Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023165 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.
Whismeril
Messages postés18414Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 7 juin 2023624 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.
vb95
Messages postés3418Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023165
>
Whismeril
Messages postés18414Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 7 juin 2023 20 avril 2016 à 18:46
vb95
Messages postés3418Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023165 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.
Whismeril
Messages postés18414Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 7 juin 2023624 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
KelaireM
Messages postés16Date d'inscriptionmercredi 20 avril 2016StatutMembreDerniè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..
Whismeril
Messages postés18414Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 7 juin 2023624 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.
KelaireM
Messages postés16Date d'inscriptionmercredi 20 avril 2016StatutMembreDerniè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?
20 avril 2016 à 18:43
20 avril 2016 à 18:46
Amitiés