IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB.NET] SerialPort dans une classe


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 54
    Points
    54
    Par défaut [VB.NET] SerialPort dans une classe
    Bonjour,

    Voila ça fait bientot 2 jours que je regarde tous les forums à la recherche d'un bug possible dans mon code de la liaison série mais je ne trouve rien!
    Je log toutes les trames reçu sur le port série et je me suis rendu compte que des trames incohérentes étaient dans le fichier. J'ai eu ce problème que 2 fois pour l'instant et sur 2 PC différents...

    Aperçu du fichier :
    <B01C0994104340C76086904110B> ' trame valide
    <STA3013500B5B0126019405229B> ' trame valide
    <'04B 98 0494F F06878022F484 ' trame incohérente
    <'T46004 04D4C 309 ' cette trame se répète indéfiniment jusqu'à la fin du fichier suite à un plantage !!!???
    <'T46004 04D4C 309
    <'T46004 04D4C 309

    Le format de la trame incohérente ressemble un peu mais pas complètement. Je suis sur de l'appareil qui envoi les données car 2 PC recoivent les trames en même temps et aucun problème sur l'autre PC (les 2 PC ont la même version).

    Voici mon code :

    J'ai fais une classe ou je déclare le serialport, mon buffer plus d'autres variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private WithEvents MonPortCOM As Ports.SerialPort
    Private Buffer As StringBuilder
    ...
    Public sub New()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Me.MonPortCOM = New Ports.SerialPort(nomPort, 19200, Ports.Parity.None, 8, Ports.StopBits.One)
    Me.Buffer = New StringBuilder(128)
     
    Me.MonPortCOM.Encoding = Encoding.Default
     
    ' Ouvre le port com
    Me.MonPortCOM.Open()
    ... plus d'autre variables ...
    Je recois les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Private Sub DataReceived_PortSerie(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles MonPortCOM.DataReceived
     
    Me.Buffer = Me.Buffer.Append(Data)
     
    ' Recherche les caractères qui m'interesse
    ' Je parcours mon buffer du début à la fin
    ' Je ne mets pas le code car c'est long
     
    ' Quand je trouve la trame qui m'interesse, je l'extrais
    dim Passage as string = Me.Buffer.ToString(IndexCaractereDebut, IndexCaractereFin)
     
    ' Je log ce passage dans un fichier texte
    Me.AjoutePassageTexte(Passage)
     
    ' Je met ce passage dans une structure
    ' et je raise un evenement pour la form main
    MaStructure = ExtraireChampsPassage(Passage)
     
    ' Ma structure contient que des champs bytes ou integer
    RaiseEvent PassageRecu(MaStructure)
     
    ' Puis je supprime mon buffer traité
    Me.Buffer = Me.Buffer.Remove(0, IndexCaractereFin + 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Public Sub AjoutePassageTexte(ByVal Passage As String)
     
                Dim sw As StreamWriter = Nothing
     
                Try
                    If Me.FichierPassageTexte <> "" Then
                        sw = New StreamWriter(Me.FichierPassageTexte, True)
                        sw.WriteLine(Passage)
                    End If
     
                Catch ex As Exception
                    Console.WriteLine("AjoutePassageTexte " & ex.Message)
     
                Finally
                    If sw IsNot Nothing Then
                        sw.Close()
                    End If
                End Try
     
            End Sub
    Je tiens à préciser que ça fonctionne "bien" puisque j'ai laissé mon PC en test toute la nuit et je n'ai pas eu une erreur ! (plus de 45000 trames recu toutes les 1s). Je ne sais pas si l'erreur vient du plantage du fichier de log, d'un manque de mémoire, du stringbuilder...

    Est ce que mon raiseevent est bon déjà ? Sachant que dans la form main je m'abonne à cet évènement et j'utilise Me.BeginInvoke car le DataReceived du port série est dans un autre Thread. Si vous avez besoin d'autres précisions...

    Merci

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le dialogue série n'est pas une chose fiable à 100%
    il est donc normal d'avoir des trames fausses de temps à autre, une trame reçue doit donc être vérifiée et non utilisée si elle est pas bonne ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    Tu penses que le PC recoit par la liaison série une trame correcte et qu'il me renvoie une trame fausse ?

    Il y avait 2 PC relié par liaison série à la machine et l'autre PC a tout reçu sans soucis. Ca me parrait bizarre quand même.

    Encore un truc impossible à trouver !

  4. #4
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Ton appareil qui emet le message RS232 possede il 2 ports COM ou as tu 'splitte' le cable entre les 2 PC ?
    Les longueurs de cable entre ton appareil et les 2 PC sont elles equivalentes et de quelle longueur ?

    Malgre ces questions je crois moyennement a un probleme de materiel (mais il faut toujours verifier quand meme...).

    Tes trames finissent par un CRLF ? A quelle frequence arrivent elles ? A combien as tu mis la prorpriete ReceivedBytesThreshold de ton serial port ?

    Tant qu'a loguer, peux tu enregistrer non seulement ta trame decodee, mais aussi le contenu du buffer avant et apres extraction de ta trame pour t'assurer qu'il ne s'agit pas d'une erreur de ton code ?
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par arno2000 Voir le message
    Tu penses que le PC recoit par la liaison série une trame correcte et qu'il me renvoie une trame fausse ?

    Il y avait 2 PC relié par liaison série à la machine et l'autre PC a tout reçu sans soucis. Ca me parrait bizarre quand même.

    Encore un truc impossible à trouver !
    la liaison série RS232 c'est du courant et en plus la liaison n'est pas différentielle, en cas de parasite, la trame est foutu
    rien à voir avec par exemple un cable réseau qui a une liaison différentielle, donc l'effet des parasites electriques arrivent beaucoup moins
    et en plus le protocole réseau s'assure que la trame est bonne matériellement et la redemande si elle est fausse (via un checksum)

    donc je répète, il peut arriver que tu recoives n'importe quoi de temps à autre, c'est à toi de vérifier que c'est une trame valide, il y a plusieurs méthodes ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    Ok merci pour vos réponses.

    Alors pour les questions de OhMonBato :

    Ton appareil qui emet le message RS232 possede il 2 ports COM ou as tu 'splitte' le cable entre les 2 PC ?
    Les longueurs de cable entre ton appareil et les 2 PC sont elles equivalentes et de quelle longueur ?
    J'ai "splité" un cable RS232 pour aller sur 2 PC. Je n'ai connecté que l'émission d'un PC à l'appareil l'autre PC n'as que la reception et la masse. (aucun soucis la dessus c'est sur)
    Même longueur à quelque centimètres près, environ 2 m.

    Tes trames finissent par un CRLF ? A quelle frequence arrivent elles ? A combien as tu mis la prorpriete ReceivedBytesThreshold de ton serial port ?
    Effectivement, toutes les trames finissent pas CRLF et la fréquence peut varier. Je dirais au maximum 3 trames en 1 sec. Mais l'appareil attent un acquitement du PC "maitre" pour continuer l'envoi des prochaines trames. Donc si ça va trop vite, il n'y aura que le PC "esclave" qui sera à la rue. Et là, le problème est arrivé sur le PC "maître"
    J'ai laissé ReceivedBytesThreshold à la valeur par défaut, je viens de regarder et c'est 1.

    Pour le log, je pense sérieusement à faire comme tu me le suggère. Car je viens de recevoir un coup de fil pour me dire que le problème c'est reproduit sur ce PC une fois de plus... Je mets en doute le PC aussi (du moins le convertisseur USB-Série) car 2 fois ça fait beaucoup. Surtout que sur d'autre PC, il n'y a pas eu ce problème (encore). J'ai d'ailleurs refait des tests sur mon PC (45000 trames ont été reçu toutes les 500msec) et aucun soucis à déplorer...

    Je vais loguer tous les caractères reçu ainsi que le buffer et on verra bien !

    Merci quand même.

  7. #7
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Si tu utilises un convertisseur USB/RS232 j'avoue etre plus circonspect. J'en utilise egalement tres regulierement et si je n'ai aucun soucis en reception generalement, je suis plus reserve sur l'emission. Avec certains modeles j'arrive meme parfois a l'ecran bleu de la mort...
    Quel modele utilises tu ?
    Si tu n'as pas besoin de connaitre l'heure EXACTE d'arrivee de ta trame (a qques dixiemes de secondes pres), je te conseille egalement d'augmenter la valeur de ReceivedBytesThreshold, a priori tu as une trentaine de caracteres dans ta chaine de maniere continue, fais l'essai en mettant la propriete a cette valeur.
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    Je ne connais pas le modèle exact car c'est celui du client. Oui pas besoin de connaitre l'heure exacte.

    Par contre je ne peux pas trop modifier le ReceivedBytesThreshold car l'appareil peut envoyer un seul octet certaines fois. C'est dans le cas ou le PC n'a pas acquitté une trame.

    De toute façon je vais tester avec son PC et si c'est vraiment le convertisseur, soit il le change soit il passe en RJ45 car on peut se connecter sur cette appareil avec ce type de liaison...

    Merci pour vos réponses.

    Je vais mettre le tag résolu et je vous tiendrai au courant sur ce que j'ai trouvé.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    Voila je vous donne des nouvelles de mon problème !

    C'était bien un problème hardware et pas logiciel. Le convertisseur USB renvoi n'importe quoi au bout d'un certain temps. Bug dans le driver ???

    Merci à ceux qui ont essayé de m'aider

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C++ .Net] richTextBox dans une class
    Par swo.line dans le forum C++
    Réponses: 0
    Dernier message: 19/04/2008, 08h44
  2. [VB.Net] Appeler un cookie dans une classe
    Par zooffy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/06/2006, 23h47
  3. [VB.NET] Declaration problématique dans une classe
    Par joefou dans le forum VB.NET
    Réponses: 8
    Dernier message: 01/03/2006, 11h38
  4. [VB.NET] Server.MapPath et Session dans une classe
    Par nancy54 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/09/2004, 14h23
  5. [C#] [.NET] Lecture d'une classe dans un fichier
    Par niPrM dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 08h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo