SerialPort / détection de trame / VB NET [Résolu]

supergalaboy 6 Messages postés mardi 30 mai 2006Date d'inscription 13 janvier 2010 Dernière intervention - 21 nov. 2008 à 10:53 - Dernière réponse : NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscription 19 avril 2018 Dernière intervention
- 25 nov. 2008 à 12:28
Bonjour à tous,

Je rencontre un petit problème dans le développement d'une application en VB 2005.
L'application est connectée à un automate qui envoi 3 trames différentes à la vitesse de 1 trame par secondes. Le format des trame sont:

10 02 90 XX XX ... XX XX 10 03
10 02 91 XX XX ... XX XX 10 03
10 02 92 XX XX ... XX XX 10 03

ou les XX représentent la donnée. La difficulté supplémentaire est que la longeur des trames n'est pas fixe (d'ou les ...), la longueur dépend de la présence ou pas de la valeur hexa 10 dans les données. Si une des donnée = 10 alors, l'automate rajoute un 10 devant cette valeur pour montrer que c'est bien de la donnée et non pas le 10 (du 10 03) qui annonce la fin de la trame.

Actuellement, j'utilise le SerialPort pour récupérer par événement la réception des trames.
Après ça, je regarde combien d'octet sont présent dans le buffer et je lis le buffer en mettant les données dans un tableau. Suite à cela, je fais une boucle qui cherche dans le tableau le début d'une trame et une fois détecté, j'affecte les valeurs à des variables.

Mon problème arrive à ce moment là. Puisque les trames ont des longueurs aléatoires (ajout des 10 devant les 10), je ne peux pas directement affecter la donnée à la bonne variable. Je cherche donc un moyen de détecter la fin de la trame 10 03 afin d'être sur d'avoir toute la trame, pour après supprimer les 10 redondant et enfin pouvoir affecter les différentes valeurs aux variables.

Auriez vous des idées pour m'aider?

Merci d'avance

P.S: voici mon code:

Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
        Dim nb_octet As Integer = RS232.BytesToRead ' on récupère le nombre d'octet présent dans le tampon
        Dim trame(nb_octet - 1) As Byte ' Tableau acceuillant les données au format byte
        Dim i As Integer
        RS232.Read(trame, 0, nb_octet) 'on lit le port
        For i = 0 To nb_octet            If trame(i) 16 And trame(i + 1) 2 And (trame(i + 2) = 145 Or trame(i + 2) = 146) Then

            ' 1) J'ai détecter le début de la trame, je voudrais trouver la fin de celle-ci et avoir la trame complète dans une variable (TrameRecu)
            ' 2) Je supprime dans la variable TrameRecu les 10 en trop
            ' 3) J'affecte chaque octet à une variable
            Dim Value1 = mid(....)
            Dim Value2 = mid(...)
            Dim Value3 = mid(...)
            End If
              
        Next
    End Sub
Afficher la suite 

5 réponses

Répondre au sujet
NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscription 19 avril 2018 Dernière intervention - 21 nov. 2008 à 12:36
+3
Utile
Bonjour,

Je te propose une implémentation :

En attribut :
private mBufferData as new list(of byte)
private mLastEscapeChar as boolean

Ensuite dans l'event :
Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
    Dim ltRecv As byte()
    redim ltrecv(RS232.BytesToRead-1) ' on récupère le nombre d'octet présent dans le tampon
    rs232.Read(ltrecv,0,ltrecv.length)
   
    for i as integer=0 to ltrecv.getupperbound(0)
        if ltrecv(i)=&h10 then
            if mlastescapechar then
                mlastescapechar=false
                mBufferData.add(ltrecv(i))
            else
                mlastescapechar=true
            end if
        elseif mlastescapechar then
            select case ltrecv(i)
                case 2
                    mBufferData.clear
                case 3
                    'Evenement pour fin de trame
            end select
            mlastescapechar=false
        else
            mBufferData.add(ltrecv(i))
        end if
    Next i
End Sub

A toi de voir si ça te convient.

http://nhen0039.chez-alice.fr/index.php
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
supergalaboy 6 Messages postés mardi 30 mai 2006Date d'inscription 13 janvier 2010 Dernière intervention - 24 nov. 2008 à 16:46
0
Utile
Salut,

Merci beaucoup pour la solution proposée.

J'arrive bien à détecter le début et la fin de la trame.

J'aurais une nouvelle question :

Une fois que j'ai ma trame dans le mBufferData, je l'analyse, vérifie le CRC et affecte mes données à des variables.

Je voudrais enregistrer chaque variable reçue sur la même ligne d'une feuille excel.

J'ai pensé faire un dataset, mais j'ai des problème avec les threads et le coté abstrait du datatset (pas d'affichage).

Auriez vous des solutions simples à me proposer.

Merci d'avance
Commenter la réponse de supergalaboy
NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscription 19 avril 2018 Dernière intervention - 24 nov. 2008 à 20:35
0
Utile
Bonjour,

Quel type de CRC (16 ou 32) ?

Ensuite, comment sont formaté les données ?

http://nhen0039.chez-alice.fr/index.php
Commenter la réponse de NHenry
supergalaboy 6 Messages postés mardi 30 mai 2006Date d'inscription 13 janvier 2010 Dernière intervention - 25 nov. 2008 à 09:17
0
Utile
Bonjour,

c'est un CRC 16 classique. J'arrive bien à vérifier que ma trame est bonne. Après ça, je découpe ma trame en plusieurs variables (variable de 1 byte ou 2 byte en fonction de la valeur (c'est de l'hexa)).

L'idéal serait d'avoir un compteur qui indique le numéro de la ligne dans laquelle je souhaite écrire le fichier excel et après, que je balaye les cases de cette ligne de la gauche vers la droite en écrivant mes valeurs dedans.

J'ai regardé sur le forum, dans tous les exemples, les données passent dans un dataset pour aller dans l'excel mais je suppose qu'il est possible de copier directement la valeur Hexa dans une case excel. non?

Merci de ton aide

Bonne journée
Commenter la réponse de supergalaboy
NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscription 19 avril 2018 Dernière intervention - 25 nov. 2008 à 12:28
0
Utile
Bonjour,

Pour automatiser Excel, tu peux passer par COM, voici une source qui t'aiguillera dans tes recherches (VB6, mais facilement transposable VB.NET je suppose) :
http://www.vbfrance.com/codes/MANIPULER-EXCEL-DEPUIS-VB6_32405.aspx

http://nhen0039.chez-alice.fr/index.php
Commenter la réponse de NHenry

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.