Réception d'une trame via Port Série

Résolu
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 8 mars 2008 - 3 déc. 2007 à 18:28
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Derniè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!

10 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
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
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Derniè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!
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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)

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0

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

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
4 déc. 2007 à 13:01
Bonjour

J'avais trouver une autre solution :

Dim lStr as string 'Chaine contenant la trame

do while lStr<>"" and left$(lStr,1)<>chr$(2)
    lStr=mid$(lStr,2)
loop

Comme cela, le premier caractère (si la chaine n'est pas vide) est forcément le STX (02).

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Derniè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!
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
4 déc. 2007 à 16:13
Bonjour

tu applique bien dans cet ordre ? :

do while Buffer<>"" and left$(Buffer,1)<>chr$(2)
    Buffer=mid$(Buffer,2)
loop

If Buffer <> ""
    Buffer = Mid$(Buffer, 4, 7)
    Text2.Text = Buffer
End If

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
4 déc. 2007 à 16:14
Bonjour

J'oubliais, à la fin :

le
Buffer=mid$(Buffer,2)
n'est à ne surtout pas oublier pour éviter de toujours traiter le mme paquet.

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Derniè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!
0
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 8 mars 2008
6 déc. 2007 à 12:10
Merci infiniment pour vous tous
ça marche.

Le savoir est la lumière de nous tous, partageons le!
0
Rejoignez-nous