SerialPort / détection de trame / VB NET

Résolu
supergalaboy Messages postés 6 Date d'inscription mardi 30 mai 2006 Statut Membre Dernière intervention 13 janvier 2010 - 21 nov. 2008 à 10:53
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 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

5 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
21 nov. 2008 à 12:36
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
3
supergalaboy Messages postés 6 Date d'inscription mardi 30 mai 2006 Statut Membre Dernière intervention 13 janvier 2010
24 nov. 2008 à 16:46
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 nov. 2008 à 20:35
Bonjour,

Quel type de CRC (16 ou 32) ?

Ensuite, comment sont formaté les données ?

http://nhen0039.chez-alice.fr/index.php
0
supergalaboy Messages postés 6 Date d'inscription mardi 30 mai 2006 Statut Membre Dernière intervention 13 janvier 2010
25 nov. 2008 à 09:17
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
0

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

Posez votre question
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 nov. 2008 à 12:28
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
0
Rejoignez-nous