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

C# Discussion :

Soucis liaison RS232


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Par défaut Soucis liaison RS232
    Bonjour,
    Je suis débutant en C# et je travaille sur une application visant à piloter un appareil de mesure via un PC et une liaison RS232.
    J'arrive à envoyer une commande et recevoir la mesure envoyée par l'appareil, mon probleme survient lorsque je souhaite envoyer une seconde commande par la suite, au lieu de renvoyer la commande proprement, d'autres caractéres sont ajoutés à la fin de la trame et je ne comprends pas pourquoi.
    Lorsque je redémarre l'application la premiere commande est bonne mais pas les autres, je penses que le problème viens du buffer mais je ne sais pas comment le gerer.
    J'ai essayé d'utiliser le DiscardInbuffer/DiscardOutBuffer mais sans succés.

    Voici mon code pour recevoir 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
    private void port_DataReceived(Object sender, SerialDataReceivedEventArgs e) 
    { 
           SerialPort sp = (SerialPort)sender; 
          _fluxRecupere = sp.ReadExisting(); 
          _donnees += _fluxRecupere; 
          _fluxRecupere = ""; 
          _port.Close(); 
          String[] _dataTab = _donnees.Split(','); //Range les données séparées par une virgule dans un tableau 
          for (int i = 0; i < (_dataTab.Count()); i++) 
              { 
                  Console.WriteLine(_dataTab[i]); 
              } 
    }
    Et mon code pour envoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void btnLancerMesure_Click(object sender, RoutedEventArgs e) 
    { 
              string[] SampleCommande = new string[2]; 
              SampleCommande[0] = "C 7 1 \x0d"; 
              SampleCommande[1] = "SS \x0d"; 
             _port.Open(); 
             for (int i = 0; i <= 1; i++) 
       { 
           _port.WriteLine(SampleCommande[i]); 
       } 
    }
    Si quelqu'un sait d'où le probléme provient et peut m'aider j'en serais trés heureux
    Merci d'avance !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 134
    Par défaut
    Quel sont les caractères en trop que tu envoies ?

    A mon avis le problème viens de la ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _port.WriteLine(SampleCommande[i]);
    Lorsque tu utilise WriteLine, les caractères \n\r sont envoyé avec la chaine.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Par défaut
    Je viens de re-tester avec simplement write et c'est le meme probléme.

    En fait il rajoute a la "trame" une partie de la commande précedente, par exemple lors du 2eme essaie j'ai reçu :

    C 7
    C 7 1
    SS


    C'est ce "C 7" qui pose probléme.
    Et si je fait un 3eme essaie j'ai carrément 4 fois la commande qui est envoyer (mais cette fois sans le "C 7", que des commandes conformes)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 134
    Par défaut
    Après le WriteLine, quel est la valeur de BytesToWrite ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Par défaut
    J'envoie un string je n'ai donc pas de valeur pour BytesToWrite.

    J'ai aussi fait des tests avec simplement

    Mais toujours le meme probleme,ce pourrait-il que ce soit au niveau du port qu'il y ai un probléme ? J'utilise un adaptateur USB/RS232 faut il prendre des mesures spécial avec ce type d'equipement ?

  6. #6
    Membre confirmé Avatar de bobjoumi
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut
    je me rappel avoir eu ce genre de problème et en modifiant le nombre de bits par seconde sa a fonctionné

    En bluetooth je précise !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Par défaut
    Je viens de tester avec d'autres vitesses et toujours le meme probleme :

    Une chose étrange, je fait mes tests entre deux pc, quand le PC 1 ecris l'autre reçoit:
    Salut
    SalutS
    SalutSS etc (3envois)

    Mais lorsque j'ecris avec le PC 2 l'autre reçoit :
    Sal
    Salut
    Salut
    Salut (1seul envoie)

    Je ne vois vraiment pas d'où le probleme viens

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par bobjoumi Voir le message
    je me rappel avoir eu ce genre de problème et en modifiant le nombre de bits par seconde sa a fonctionné

    En bluetooth je précise !

    Je plussoye !

    @Daelor : tu es sur des caractéristiques de ton port ? j'entends par là : que les paramètres vitesses, nombre de bits de données, bits de parité, contrôle de flux (Xon/Xoff ou CTS/DTR ou rien) "match" bien ceux de ton périphérique ?
    (ce genre de question vous rajeunit de 20 ans : la RS232C ça ne s'utilise plus beaucoup de nos jours )

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Par défaut
    J'ai revérifié et j'ai bien les memes paramétres de chaques cotés pour mes ports.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SerialPort _port = new SerialPort ("COM4",9600,Parity.None,8,StopBits.One);
    _port.ReadTimeout =5000;
    _port.WriteTimeout = 5000;
    Et j'ai bien la meme chose pour la config de mes ports sous windows.

    Les bouts de code que j'ai mis pour recevoir/envoyer sont bien correct ?

    Il n'y a pas un moyen de controler avec précision ce que l'on envoie sur le port ? (au caractere pret ou qqch dans le genre )

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Et le contrôle de flux ? car ça pourrait ressembler bigrement à un problème de ce coté ?

    Citation Envoyé par Daelor Voir le message
    Il n'y a pas un moyen de controler avec précision ce que l'on envoie sur le port ? (au caractere pret ou qqch dans le genre )

    Avec un analyseur de connexion série. Ca ne court plus les rues.

  11. #11
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    il faut regarder du coté du consommateur...

    SI les données envoyées en RS232 ne sont pas consommées, tu as le risque qu'elle stagne dans la pile d'envoi et soit réemise plus ou moins à chaque fois.

    Après, tu peux nettoyer le contenu de la pile mais surtout faire un controle sur le fait que l'envoi (ou la lecture) se sont effectués correctement.

    J'ai fait pas mal de com RS232 entre PC et carte électronique, et je n'ai jamais eu ce genre de soucis (mais je gèrais parfaitement Ecriture / Reception des données des 2 cotés...)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Par défaut
    Tout d'abord merci pour vos réponses !

    J'ai fait d'autres tests et le probleme viens de mon code pour recevoir et decouper la "trame".

    Tout fonctionne si je me contente d'un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void port_DataReceived(Object sender, SerialDataReceivedEventArgs e) 
    { 
          string FluxRecuperer;
          FluxRecuperer = port.ReadExisting();         
          Console.WriteLine(FluxRecuperer);     
    }
    Il doit donc y avoir un probleme dans ma concaténation et mon découpage. Mais je ne vois vraiment pas où

  13. #13
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Vérifie le contenu de _donnees avant réception

  14. #14
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    Daelor, il faut faire attention quand tu utilises Data_Received que le nombre d'octets à lire peut continuer d'être alimenter par la source émettrice.

    Perso, quand je sais combien d'octets j'attends, je mets un flag qui permet de définir le nombre d'octets devant être reçu avant de déclencher l'event de réception. C'est très pratique de fonctionner ainsi (même si ce n'est pas l'unique façon de procéder)

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Par défaut
    Merci Arnard et theMonz31 !

    J'avais en effet un probleme au niveau de ma variable "_donnees" et au niveau du temps de réception.

    Par contre il me reste un dernier point à regler pour que mon code soit propre, pour visualier "_donnees" j'ai ajouter une MessageBox en debut de mon evenement de reception, mais si je l'enleve l'application continue d'executer sans attendre et ne reçoit pas toutes les données.

    Je ne connais pas exactement le nombre d'octet que je doit recevoir, y a t-il une fonction qui permet de forcer l'ecoute du port pendant Xsec apres avoir reçu la premiere données ?

    Voilà mon code (qui fonctionne comme souhaité) :
    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
    private void port_DataReceived(Object sender, SerialDataReceivedEventArgs e)
            {
                MessageBox.Show(_donnees);
                _donnees = "";
                SerialPort sp = (SerialPort)sender;           
                _fluxRecupere = sp.ReadExisting();
                _donnees += _fluxRecupere;  
                _fluxRecupere = "";            
                port.Close();          
     
                String[] _dataTab = _donnees.Split(','); //Range les données séparées par une virgule dans un tableau 
                for (int i = 0; i < (_dataTab.Count()); i++)
                {
                    Console.WriteLine(_dataTab[i]);
                }            
            }

  16. #16
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Il y a ReadTimeOut sur SerialPort, qui lève une exception lorsque le temps est atteint, mais je ne sais pas si tu peux intégrer ça par rapport à une première lecture... http://msdn.microsoft.com/en-us/libr...adtimeout.aspx

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Par défaut
    Le ReadTimeOut est utile si le message est trop long, ou si le port ne répond pas pendant Xms.

    J'ai réussi avec une temporisation Thread.Sleep(1000) à la place de la MessageBox.

    Tout est OK merci encore de votre aide

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

Discussions similaires

  1. Reception trame et envoi trame pour liaison rs232
    Par gaetan.tranvouez dans le forum C
    Réponses: 6
    Dernier message: 09/06/2006, 14h50
  2. Aide Liaison Rs232
    Par go1985 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 05/06/2006, 14h33
  3. Liaison RS232
    Par theanswerdu40 dans le forum C++
    Réponses: 1
    Dernier message: 28/02/2006, 07h53
  4. Liaison RS232 en langage C sur Windows
    Par Spikedu63 dans le forum Windows
    Réponses: 9
    Dernier message: 12/10/2005, 15h46
  5. Langage C et liaison RS232
    Par Spikedu63 dans le forum C
    Réponses: 9
    Dernier message: 17/09/2005, 12h26

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