Réception d'une trame via Port Série [Résolu]

Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008
- - Dernière réponse : 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!
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
14600
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 décembre 2019
137
3
Merci
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

Dire « Merci » 3

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

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
31
0
Merci
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
Commenter la réponse de cs_casy
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008
0
Merci
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!
Commenter la réponse de basamir
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
31
0
Merci
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
Commenter la réponse de cs_casy
Messages postés
14600
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 décembre 2019
137
0
Merci
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
Commenter la réponse de NHenry
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008
0
Merci
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!
Commenter la réponse de basamir
Messages postés
14600
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 décembre 2019
137
0
Merci
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
Commenter la réponse de NHenry
Messages postés
14600
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 décembre 2019
137
0
Merci
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
Commenter la réponse de NHenry
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008
0
Merci
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!
Commenter la réponse de basamir
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008
0
Merci
Merci infiniment pour vous tous
ça marche.

Le savoir est la lumière de nous tous, partageons le!
Commenter la réponse de basamir