basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008
-
3 déc. 2007 à 18:28
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008
-
6 déc. 2007 à 12:10
Bonsoir,
mon application devrais recevoir une information d'un terminal externe via la sortie série, cette information est sous la forme suivante en en Hexa:
02 47 20 20 32 32 39 38 30 2E 20 20 6B 67 0D 00
la trame commence par "02" et se termine par par "OD" suivi de "00" [soit 13 et 00 en ASCII.
mon code est le suivant:
Private Sub MSComm1_OnComm()
Dim xPos As Integer
Buffer = Buffer & MSComm1.Input
Dim i As Integer
Dim t As String
Hexa_Valeur = ""
If Len(Buffer) > 15 Then
For i = 1 To Len(Buffer)
t = Hex(Asc(Mid(Buffer, i, 1))) If Len(t) 1 Then t "0" + t
Hexa_Valeur = Hexa_Valeur & t & " "
Next i
Label1.Caption = Hexa_Valeur
xPos = InStr(1, Buffer, Chr(2), vbBinaryCompare)
If xPos = 1 Then
Text2.Text = Mid(Buffer, 4, 6)
If Len(Buffer) > 10 Then
Buffer = Right(Buffer, Len(Buffer) - 10)
End If
If Len(Buffer) > 22 Then Buffer = ""
End If
Hexa_Valeur = ""
Text1.Text = Len(Buffer)
Buffer = ""
End If
End Sub
mais je tombe souvent sur des cas où la trame que mon tampon garde ne commence pas par 02 et par conséquent je n'arrive pas à extraire la donnée désirée.
Qu'est ce que je dois faire.
Merci d'avance!
Le savoir est la lumière de nous tous, partageons le!
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 4 déc. 2007 à 16:52
Bonjour
Do while instr(Buffer,chr$(13)&chr$(0))>0 'Fin de trame présente ?
'Oui, donc on traite
do while Buffer<>"" and left$(Buffer,1)<>chr$(2) 'On recherche' le début de trame
Buffer=mid$(Buffer,2)
loop
'Ensuite, si le buffer n'est pas vide et que une fin de trame est présente, on traite
If Buffer <> "" and instr(Buffer,chr$(13)&chr$(0))>0 Then
Text2.Text = Mid$(Buffer, 4, 7)
Buffer=mid$(Buffer,2) 'On fait le ménage pour la suite.
End If
Loop
Avec ce code, c'est obligé que ça fonctionne.
Ton problème était que tu utilisais ton Buffer Pour préparer l'écriture dans le TxtBx.
Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 3 déc. 2007 à 21:17
Un fois une trame traitée, tu dois la virer du buffer pour ne conserver que ce qui n'est pas traiter. Mais attention, d'un cycle à l'autre, tu dois toujours garder la fin de ton buffer (ce qui n'est pas traiter) et le remplir au fur et à mesure.
Par contre je ne comprend pas ton code à partir de xPos = InStr(.... Tu recherche le premier 02, ok, mais ensuite tu ne te sers plus de xPos, mais au contraire tu utilise ton buffer comme si 02 etait le premier caractère du buffer. Hors se sera rarement le cas dans ton code.
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 4 déc. 2007 à 00:53
ok je me reexplique,
la trame envoyée par mon terminal commence toujours par "02" raison pour laquelle je dois compter la position de 02 dans Buffer si elle est = à 1 c'est que j'ai cené ma trame depuis le depuis sinon je ne peux pas extraire mon info qui se situe exactement ici :
Mid(Buffer, 4, 6)
mais comme je ne tombe pas toujours sur "02" dans la première position '''xPos = 1''' je suis bloqué et je ne sais pas comment résoudre ce problème?!!!
Le savoir est la lumière de nous tous, partageons le!
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 4 déc. 2007 à 09:00
C'est bien cela, tu ne dois pas utiliser les positions absolues des tes données, mais des position relatives par rapport à la position xPos du premier caractère de ta trame.
Ta donnée est positionnée au 4eme caractère de la trame, c'est à dire le 1er caractère + 3 soit xPos+3
Tu veux en prendre les 6 caractères. Cela implique que tu es au moins reçu ces 6 caractères de la trame c'est à dire que dans ton buffer tu dois avoir au moins les 6 caractères de la données + les caractères les précédents, et ceux depuis la position du premier caractère.
Donc la longueur de ton buffer doit etre au minimum de xPos+2+6 --> Mid(buffer, xPos+3,6) et Len(buffer)>xPos +8
Une fois traitée, il faut supprimer ta trame du buffer, c'est à dire qu'il faut enlever les 16 caractères à partir xPos ainsi que les précédents. --> buffer= Mid(buffer,xPos+16)
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 4 déc. 2007 à 15:51
NHenry merci pour ton idée, mais le même problème persiste:
avec ton code:
Do While Buffer <> "" And Left$(Buffer, 1) = Chr$(2)
Buffer = Mid$(Buffer, 4, 7)
Text2.Text = Buffer
Loop
le problème est le même parfois j'obtiens l'info et parfois non autrement dit ma trame reçu au moment de l'execution de mon programme commence belle et bien par 02 (Nikel) et parfois par un autre caractère "47 p.e" et la il y a un soucis je n'arrive pas à récuperer mon info.
Merci de m'aider davantage.
Le savoir est la lumière de nous tous, partageons le!
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 4 déc. 2007 à 16:35
si je mets à la fin : Buffer=mid$(Buffer,2) je n'affiche que 0 au niveau de mon text2.text, il faut absolument vider Buffer afin de recevoir une nouvelle trame de mon terminal qui lui envoie en rafal les données toutes les ms, alors avec ton code meme si je mets Buffer = "" à la fin je reste toujours dans la meme config: parfois je reçois mon info (cad la trame commence par "02") et parfois je reçois une trame qui ne commence pas par 02 et dans ce cas je n'affiche rien.
Le savoir est la lumière de nous tous, partageons le!