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 :

[C#]Communication Série (SerialPorts)


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par défaut [C#]Communication Série (SerialPorts)
    Bonjour,
    Donc mon problème est le suivant je désire communiquer entre deux applications via un port COM virtuel(pour l'instant j'essai de le faire en 1 seul appli) le problème que je rencontre est que l'écriture fonctionne correctement mais la lecture ne fonctionne pas.
    J'ai essayer toutes les méthodes Read de la classe SerialPorts en vain.
    Sur le code qui suit j'attend un événement SerialDataReceivedEventArgs qui me permettrais d'effectuer ma lecture mais je ne recoit jamais cette événement donc si quelqu'un à déjà rencontré ce problème ou pense avoir une solution je lui en serai reconnaissant.
    Merci d'avance .
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    public partial class Form1 : Form
        {
            SerialPort _liaison;
            string texte;        
     
            public Form1()
            {          
                 InitializeComponent();
                _liaison = new SerialPort();
                _liaison.PortName = "COM1";
                _liaison.BaudRate = 115000;//Vitesse de dialogue avec le Millenium.
                _liaison.Parity = Parity.Even;//Parité paire (fixé par le Millenium).
                _liaison.DataBits = 7;//Format de la trame 7 bits (lui aussi fixé par le Millenium).
                _liaison.StopBits = StopBits.One;////1 bit de Stop(fixé par le Millenium). 
                _liaison.Handshake = Handshake.RequestToSend;
                _liaison.DtrEnable = true;
                _liaison.RtsEnable = true;
                _liaison.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                _liaison.Open();
     
            }
     
            private void bt_lecture_Click(object sender, EventArgs e)
            {
                if (_liaison.IsOpen == false)
                {
                    _liaison.Open();
                }
     
     
                textBox1.Text = _liaison.ReadExisting();//.ToString();
            }
            void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                textBox1.Text = _liaison.ReadExisting();
                this.Invoke(new EventHandler(DoUpdate));
            }
            private void DoUpdate(object s, EventArgs e)
            { 
                textBox1.Text = _liaison.ReadExisting();
            }
            private void button_ecriture_Click(object sender, EventArgs e)
            {
     
                try
                {
                    if (_liaison.IsOpen == false)
                    {
                        _liaison.Open();
                    }
     
                    //Ecriture sur le port serie.   
                    _liaison.Write("test");
     
                }
                catch (TimeoutException) { }
     
            }
     
        }

  2. #2
    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
    Tu entends quoi par port virtuel ? Peux-tu expliciter comme cela se traduit sur ton système ? Car là je ne vois que COM1 d'instancié, or, je ne suis pas sûr que tu puisses simuler 2 client via un seul port, virtuel ou non...

    Et comment es-tu sûr d'écrire correctement, vu que tu n'arrives pas à lire ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par défaut
    Citation Envoyé par Arnard Voir le message
    Tu entends quoi par port virtuel ? Peux-tu expliciter comme cela se traduit sur ton système ? Car là je ne vois que COM1 d'instancié, or, je ne suis pas sûr que tu puisses simuler 2 client via un seul port, virtuel ou non...

    Et comment es-tu sûr d'écrire correctement, vu que tu n'arrives pas à lire ?
    - Donc c'est un port Virtuel créer via VSPE.
    - Je suis sur que l'écriture fonctionne correctement car j'ai tester la réception avec HyperTerminal.
    Mais pour l'instant j'essai simplement d'avoir 2 boutons un bouton qui me permet d'écrire et un qui me permet de lire mais j'arrive parfaitement à écrire mais je n'arrive pas à lire .

  4. #4
    Membre éprouvé Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Par défaut
    Je comprend pas trop ta méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        textBox1.Text = _liaison.ReadExisting();
        this.Invoke(new EventHandler(DoUpdate));
    }
    private void DoUpdate(object s, EventArgs e)
    { 
         textBox1.Text = _liaison.ReadExisting();
    }
    pourquoi invoker alors que tu n'utilise pas de thread et quand bien même, tu utilise textbox dans une methode qui n'est pas invoké.

    Pour lire, il me semble que c'est ReadLine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        textBox1.AppendText(_liaison.ReadLine());
    }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par défaut
    En faite j'avais lu sur différents forum que la lecture du SerialPort se faisait dans un thread a part appelle ThreadPool c'est pourquoi je devais faire invoke pour pouvoir rafraichir mon affichage.
    Mais je n'arrive toujours pas à avoir mon événement donc mon problème est toujours le même je ne reçoit jamais ce que j'envoie sur le serailPort.

    Peu être avec un Thread de Lecture et un thread d'Ecriture mais je n'ai toujours pas "encore" de résultat positif.
    Merci de prend du temps à me répondre

  6. #6
    Membre éprouvé Avatar de monnoliv
    Homme Profil pro
    Opticien-ébéniste: lunettes de WC
    Inscrit en
    Août 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Opticien-ébéniste: lunettes de WC

    Informations forums :
    Inscription : Août 2003
    Messages : 139
    Par défaut
    je ne reçoit jamais ce que j'envoie sur le serailPort
    Donc tu pontes les broches 2 et 3 de ton port série ?
    pourquoi invoker alors que tu n'utilise pas de thread et quand bien même
    Sorry mais serialPort_DataReceived est en réalité appelé par une Thread différente, il faut donc bien utiliser un Invoke si on veut afficher sur la form. Je n'ai pas de quoi vérifier cela maintenant mais ça m'étonnerait qu'il en aille autrement.
    Voici un code qui fonctionne:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                RxString = serialPort1.ReadExisting();
                this.Invoke(new EventHandler(AfficherTextASync));
            }
     
            private void AfficherTextASync(object sender, EventArgs e)
            {
     
                textBox1.AppendText(RxString);
            }
    Déclarer RxString globalement

  7. #7
    Membre éprouvé Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Par défaut
    C'est bien sur thread secondaire :

    L'événement DataReceived est déclenché sur un thread secondaire lorsque des données sont reçues de l'objet SerialPort. Cet événement étant déclenché sur un thread secondaire et non sur le thread principal, toute tentative de modification d'éléments inclus dans le thread principal
    http://msdn.microsoft.com/fr-fr/libr...(v=VS.80).aspx

Discussions similaires

  1. visual.net c++ ( communication série)
    Par stgi02 dans le forum MFC
    Réponses: 2
    Dernier message: 27/02/2006, 22h49
  2. Communication Série un peu trop lente?
    Par SimonBrodeur dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 16/01/2006, 14h41
  3. [communication série] problème lecture/écriture
    Par davinout dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 01/06/2005, 13h14
  4. [VB.NET] Communication série
    Par DotNET74 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/03/2005, 14h02
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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