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 :

Récupérer données avec un backgrounder


Sujet :

C#

  1. #1
    Membre à l'essai Avatar de VTT85
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Récupérer données avec un backgrounder
    Bonjour,

    J'aurais souhaité savoir comment il était possible de récupérer les données de ma carte arduino en direct.

    Je sais actuellement qu'il est possible de faire ça avec un backgrounder. Et je pense que c'est la méthode la plus appropriée.

    Voici mon programme :

    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
    public partial class MainWindow : Window
        {
            SerialPort mySerialPort = new SerialPort("COM12", 115200);
     
            public MainWindow()
            {
                worker.DoWork += worker_DoWork;
                worker.RunWorkerCompleted += worker_RunWorkerCompleted;
                InitializeComponent();
            }
     
            private readonly BackgroundWorker worker = new BackgroundWorker
            {
                WorkerReportsProgress = true
            };
     
     
     
     
            private void btnStart_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    mySerialPort.BaudRate = 115200;
                    mySerialPort.Open();
                    labelScore.Content = "Connected";
                    worker.RunWorkerAsync();
                }
                catch (Exception)
                {
     
                    MessageBox.Show("Please give a valid port number or check your connection");
                }
            }
     
            private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                if (e.UserState != null)
                {
                    labelScore.Content = data;
                }
     
            }
     
            public string data;
     
            private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                data = mySerialPort.ReadLine();
            }
     
            private void worker_RunWorkerCompleted(object sender,
                                                   RunWorkerCompletedEventArgs e)
            {
            }
    }
    Mais bon voilà, je veux changer mon label en direct dès qu'une donnée est renvoyer dans l'arduino.
    ça fonctionne pour le premier coup mais ensuite quand je renvoie des données avec l'arduino, mon label ne s'actualise pas...

    Merci de votre aide

  2. #2
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Bonjour,

    Pour commencer, il faudrait voir ce qu'il se passe réellement en mettant quelques points d'arrêts. Cela te permettra de savoir si tu reçois bien les événements et si tu les traites correctement.

    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
    public partial class MainWindow : Window
        {
            SerialPort mySerialPort = new SerialPort("COM12", 115200);
     
            public MainWindow()
            {
                worker.DoWork += worker_DoWork;
                worker.RunWorkerCompleted += worker_RunWorkerCompleted;
                InitializeComponent();
            }
     
            private readonly BackgroundWorker worker = new BackgroundWorker
            {
                WorkerReportsProgress = true
            };
     
     
     
     
            private void btnStart_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    mySerialPort.BaudRate = 115200;
                    mySerialPort.Open();
                    labelScore.Content = "Connected";
                    worker.RunWorkerAsync();
                }
                catch (Exception)
                {
     
                    MessageBox.Show("Please give a valid port number or check your connection");
                }
            }
     
            private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                if (e.UserState != null) // un point d'arrêt ici pour voir si l'état n'est pas égal à null 
                {
                    labelScore.Content = data;
                }
     
            }
     
            public string data;
     
            private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                data = mySerialPort.ReadLine(); //point d'arrêt ici pour voir si tu alimentes bien ton data régulièrement
            }
     
            private void worker_RunWorkerCompleted(object sender,
                                                   RunWorkerCompletedEventArgs e)
            { 
     
            }
    Il est fort à parier que tu ne passes qu'une seule fois dans ton worker_DoWork (deuxième point d'arrêt). Car une fois réalisé, tu ne le relance pas...

  3. #3
    Membre à l'essai Avatar de VTT85
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Bonjour, tout d'abord merci de ta réponse rapide

    Citation Envoyé par ZenZiTone Voir le message
    Bonjour,

    Pour commencer, il faudrait voir ce qu'il se passe réellement en mettant quelques points d'arrêts. Cela te permettra de savoir si tu reçois bien les événements et si tu les traites correctement.
    Ok j'essaye ça ce soir, car là je ne suis plus devant mon projet.

    Il est fort à parier que tu ne passes qu'une seule fois dans ton worker_DoWork (deuxième point d'arrêt). Car une fois réalisé, tu ne le relance pas...
    Je pense que c'est sûrement l'explication la plus logique au vu de comment se comportait mon programme quand je fesais mes essais.
    Alors dans ces cas là, je ne fais pas fonctionner le backgrounder en boucle comme je le souhaiterais ? Comment je peux modifier mon programme pour faire cette boucle ?

  4. #4
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par VTT85 Voir le message
    Alors dans ces cas là, je ne fais pas fonctionner le backgrounder en boucle comme je le souhaiterais ? Comment je peux modifier mon programme pour faire cette boucle ?
    Je ne connais pas réellement le fonctionnement des BackgroundWorker, mais je suppose que :

    Au début, tu fais un Run. Celui-ci produit le DoWork. Une fois ce DoWork terminé, il passe par le RunWorkerCompleted.

    Tu as donc deux possibilités :
    -Relancer le DoWork lorsque tu passes par RunWorkerCompleted pour relancer la lecture
    -Mettre en place une boucle while(condition) dans le DoWork pour le faire tourner tant que tu souhaites lire des données

    Par contre, je ne connais pas les bonnes pratiques sur le sujet..

  5. #5
    Membre à l'essai Avatar de VTT85
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    -Mettre en place une boucle while(condition) dans le DoWork pour le faire tourner tant que tu souhaites lire des données
    J'avais déjà essayé de faire un while à l'intérieur du DoWork mais ça ne fonctionnait pas...
    Je vais essayer la première méthode ce soir mais sinon on m'a parlé d'un worker progress changed qui serait le bienvenue ici.

    Je ne vois pas comment le faire fonctionner non plus...

Discussions similaires

  1. Récupérer données avec id avec angular JS
    Par tunisiano44 dans le forum AngularJS
    Réponses: 3
    Dernier message: 23/08/2016, 13h16
  2. Récupérer données avec cURL
    Par retwas dans le forum Langage
    Réponses: 1
    Dernier message: 10/09/2013, 11h36
  3. Réponses: 4
    Dernier message: 30/03/2007, 18h42
  4. Récupérer une donnée avec MsgBox
    Par gentoo dans le forum Access
    Réponses: 5
    Dernier message: 29/01/2007, 16h19
  5. Récupérer ma base de donnée avec des tables en .frm uniqueme
    Par Michas dans le forum Administration
    Réponses: 5
    Dernier message: 31/08/2005, 13h57

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