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 :

Stopper l'événement DataReceived du contrôle SerialPort


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Programmation C#
    Inscrit en
    Décembre 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Programmation C#

    Informations forums :
    Inscription : Décembre 2014
    Messages : 89
    Points : 48
    Points
    48
    Par défaut Stopper l'événement DataReceived du contrôle SerialPort
    Salut à tous !
    Alors voilà je suis depuis quelques temps sur un problème qui m'empêche d'avancer : j'ai fabriqué un scanner de cartes sans contact Arduino, avec un logiciel en C# capable de récupérer le numéro de badge scanné. J'utilise pour cela l'évenement dataReceived du contrôle utilisateur SerialPort (avec un delegate et un invoke pour afficher le numéro de badge dans un label à l'écran). Le soucis est le suivant : Je n'ai aucun problème du moment que j'ouvre le port et que je le ferme, SANS scanner de badge. Mais à partir du moment où je tente de scanner un badge et de fermer le port à la fermeture du soft, ce dernier plante littéralement...
    En faisant mon petit tour sur la MSDN, j'ai vu que l’événement dataReceived est executé sur un thread en parallèle...et moi je ferme le port depuis le thread principal (donc je pense que le plantage est dû à ça).
    Je pensais à stopper l'événement dataReceived du SerialPort (pour ensuite fermer proprement le port), mais je ne sais pas comment y parvenir. Sinon il y a t-il une meilleure solution ?

    Merci d'avance

    PS : J'ai vu que d'autres topics avaient étés créés à ce sujet (sur d'autres forums) mais je n'ai pas trouvé de réponse explicite.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    ca aurait été mieux de nous montrer un peu le code et de nous donner les détails de l'erreur (type, message et ligne où ca plante)

    à défaut tu peux tenter :
    - se désabonner de l'event avant de close
    - sur l'event si tu as fait close alors ne rien faire

  3. #3
    Membre du Club
    Homme Profil pro
    Programmation C#
    Inscrit en
    Décembre 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Programmation C#

    Informations forums :
    Inscription : Décembre 2014
    Messages : 89
    Points : 48
    Points
    48
    Par défaut
    En fait je ne peux pas vous donner d'erreur précise, puisque Visual Studio ne m'en indique aucune. Simplement le soft ne répond pas, et tout a l'air de bien se dérouler dans la console.
    Concernant ce que je voudrais faire, voici mon code complet (je scanne un badge, son numéro est recherché dans une base de données, et une messagebox me renvoie le N°Client associé si le badge existe ou une erreur si le badge est inexistant) :

    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
    MySqlConnection connection = new MySqlConnection("SERVER=127.0.0.1; DATABASE=test; UID=root; PASSWORD=");
    private delegate void onrecupereHandler(string receive_rfid);
    private onrecupereHandler onrecupereDelegate;
     
    public Login()
    {
        InitializeComponent();
        onrecupereDelegate = new onrecupereHandler(onrecupere); //On crée le delegate
        try { SCANNER.Open(); SCANNER.Write("a"); } catch { } //On prépare le scanner en lui envoyant "a"
    }
     
    private void SCANNER_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
       string receive_rfid = SCANNER.ReadLine(); //On récupère le n° de badge scanné
       this.Invoke(this.onrecupereDelegate, new object[] { receive_rfid }); //et on le transmet à la fonction onrecupere()
    }
     
    private void onrecupere(string receive_rfid)
    {
       //On recherche le n° de client auquel est rattaché le badge et on l'affiche dans une MessageBox
       connection.Open();
       string client = null;
       MySqlCommand command = connection.CreateCommand();
       command.CommandText = "SELECT * FROM clients WHERE badge = " + receive_rfid + ";";
       MySqlDataReader reader = command.ExecuteReader();
       //Il y a un résultat
       if(reader.Read())
       {
          client = reader["id"].ToString();
          MessageBox.Show("N°Client : " + client);
       }
       //Il n'y a pas de résultat
       else { MessageBox.Show("Le badge scanné n'est attaché à aucun compte client.");}
       try { SCANNER.Write("d"); SCANNER.Close(); } catch { } //On arrête le scanner en lui envoyant "d" => ça plante ICI, au "SCANNER.Close();"
       reader.Close();
       connection.Close();
       Application.Exit(); //Juste pour voir si ça plante
    }
    Je pense que ce plantage est dû à l'événement dataReceived qui tourne en arrière-plan...Qu'en pensez-vous ?

    - se désabonner de l'event avant de close
    Je ne comprends pas bien ce que vous voulez dire par "se désabonner", pouvez-vous m'en dire plus svp ?

    Merci de votre soutien

  4. #4
    Membre du Club
    Homme Profil pro
    Programmation C#
    Inscrit en
    Décembre 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Programmation C#

    Informations forums :
    Inscription : Décembre 2014
    Messages : 89
    Points : 48
    Points
    48
    Par défaut
    Ok donc je viens de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.SCANNER.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(this.SCANNER_DataReceived);
    avant mon SCANNER.Close(); pour se désabonner de l'event mais rien y fait, ça plante toujours

  5. #5
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Selon la documentation:
    By default, the ReadLine method will block until a line is received.
    Donc si je comprends, tu traites les événements dans le mauvais ordre: tu détectes que des données sont reçues, et ensuite tu essayes de lire. Donc comme ReadLine est bloquant, forcement, ton appli attend une nouvelle ligne a lire. Et donc se bloque.

    As-tu essaye un schema comme dans la doc, avec un thread pour la lecture sur le port serial, ou l’exemple de de la doc DataReceived?

  6. #6
    Membre du Club
    Homme Profil pro
    Programmation C#
    Inscrit en
    Décembre 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Programmation C#

    Informations forums :
    Inscription : Décembre 2014
    Messages : 89
    Points : 48
    Points
    48
    Par défaut
    Merci nouanda pour votre explication, maintenant je me méfierais du ReadLine()
    J'ai modifié mon code de façon à pouvoir lire le numéro de badge sur un autre thread, et ça marche ! :

    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
    public void SCANNER_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        Thread lecture_badge = new Thread(Read); //Création du thread de lecture
        lecture_badge.Start(); //Démarrage du thread
    }
     
    public void Read()
    {
        string badge = null;
        if (SCANNER.IsOpen && SCANNER.BytesToRead > 0) badge = SCANNER.ReadLine(); //On lit le N° de badge scanné...
        this.Invoke(this.onrecupereDelegate, new object[] { badge }); //et on le transmet à la fonction onrecupere()
        Thread.CurrentThread.Abort(); //On abandonne le thread actuel
    }
     
    private void onrecupere(string no_badge)
    {
        //On recherche le n° de client auquel est rattaché le badge et on l'affiche dans une MsgBox
        connection.Open();
        MySqlCommand command = connection.CreateCommand();
        command.CommandText = "SELECT * FROM clients WHERE badge = " + no_badge + ";";
        MySqlDataReader reader = command.ExecuteReader();
        if (reader.Read()) //Il y a un résultat
        {
            MessageBox.Show("N°Client : " + reader["id"].ToString()); //On l'affiche dans une MsgBox...
            try { SCANNER.Write("d"); SCANNER.Close(); } catch { } //on arrête le scanner en lui envoyant "d"...
            Application.Exit(); //On ferme le logiciel
        }
        else MessageBox.Show("Le badge scanné n'est attaché à aucun compte client."); //Il n'y a pas de résultat, on peut scanner un autre badge
        reader.Close();
        connection.Close();
    }
    !!!

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

Discussions similaires

  1. Stopper un événement durant une animation
    Par doncho23 dans le forum jQuery
    Réponses: 1
    Dernier message: 27/04/2010, 23h13
  2. Réponses: 1
    Dernier message: 06/03/2010, 18h07
  3. [3.5] Gestion d'évènement d'un contrôle personnalisé
    Par franculo_caoulene dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/09/2008, 17h50
  4. gérer l'évènement Click du contrôle Image
    Par naruto01 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/01/2007, 18h43
  5. événements dans un contrôle ActiveX
    Par ziz2005 dans le forum MFC
    Réponses: 3
    Dernier message: 06/11/2006, 12h28

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