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 :

lecture port série [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut lecture port série
    Bonjour, j'essaie actuellement de récupérer des données via un port série. En fouillant sur le forum j'ai réussi à faire un code qui me permet de récupérer les données. Les données proviennent d'une sonde de température et sont envoyées vers le port série via un microcontroleur. J'essaie de réaliser une petite interface qui permet de visualiser la température en temps réel. Le problème est qu'au moment de l'affichage dans la textbox, les données s'écrive les unes à la suite des autres. Sauriez-vous m'aider à finir ce projet relativement simple?

    Voici mon code

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
     
    namespace SerialComm
    {
        public partial class Form1 : Form
        {
            static SerialPort serialPort1;
            string RxString;
            public Form1()
            {
                serialPort1 = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
                InitializeComponent();
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                serialPort1.ReadTimeout = 500;
     
            }
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
            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);
                label1.Text = RxString;
     
     
            }
            //private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            //{
            //    string value = "";
            //    while (serialPort1.BytesToRead > 0)
            //    {
            //        char[] buffer = new char[255];
            //        int bytes_read = serialPort1.Read(buffer, 0, buffer.Length);
            //      //  string texte = serialPort1.ReadLine();
     
            //        for (int i = 0; i < bytes_read; i++)
            //        {
            //            value += buffer[i];
            //        }
            //    }
            //    safeInput(value.ToString());
            //}
     
            //private void safeInput(string msg)
            //{
            //    textBox1.Invoke(new EventHandler(delegate
            //    {
            //        textBox1.SelectedText = string.Empty;
            //        textBox1.AppendText(msg.ToString());
            //        textBox1.ScrollToCaret();
     
     
            //    }));
            //}
     
            private void button1_Click(object sender, EventArgs e)
            {
                serialPort1.Open();
            }
     
     
        }
    }

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    Pourquoi ne pas mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textBox1.Text=RxString;
    car justemment la méthode AppendText est équivalent à de la concaténation.

    Bien à vous,

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    textBox1.AppendText(RxString); fait que tu as ce comportement.

    Utilises plutôt textBox1.Text = RxString;


    [EDIT] grillé

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    J'ai testé en changeant .appendtext en .text. Le soucis est que les données ne sont plus affichée correctement alors qu'avec le appendtext l'affichage était correct. Une idée de ce qui peut provoquer ca?

  5. #5
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Essaye avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textBox1.Text+=RxString;

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 15
    Points
    15
    Par défaut
    Et quel est l'affichage correct de tes données ?

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Qu'est-ce que tu entends par "plus affichée correctement" ?

    En fait comment veux tu voir ta température s'afficher ?
    Avec la propriété Text, dès qu'une température est lue, elle vient remplacer la valeur de la TextBox.

    Si tu veux garder dans ta TextBox les anciennes valeurs et que tu veux tracer ligne par ligne les températures, il faut autoriser le mode multiligne (Multiline) et penser à faire un saut de ligne :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
            this.TboxLog.AppendText("\n" + "test");

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textBox1.Text+=RxString;
    Cela a le même effet que appendtext. Le problème ne viendrait-il pas de la réception? Les données étant envoyée en continu ne faudrait-il pas découper les données reçues? Je précise je reçois directement une chaine de caractère

  9. #9
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Si tu ne nous donne pas plus d'infos sur ce que tu reçois, comment et comment tu veux que ça apparaisse, ça va vraiment être compliqué pour nous de t'aider

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    La valeur est envoyée sous forme de caractère. Exemple: 25.0000. Lorsque j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textBox1.Text=RxString;
    seul 0 s'affiche. Lorsque j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textBox1.Text+=RxString;
    cela donne 25.000025.000025.0000. et ainsi de suite pour les valeurs suivante. Je veux simplement afficher une valeur à la fois. Est-il possible qu'au moment de la réception les valeurs s'écrive à la suite dans rxstring?

  11. #11
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Essaye de mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textBox1.Text=RxString;
    et de mettre un breakpoint dessus. Tu débug en pas à pas et tu vois ce qui cloche avec ta variable

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Voila j'ai suivi ton conseil et j'ai regardé ce que contient la variable. En fait toute les valeurs reçues s'écrivent à la suite dans la variable. La textbox affiche donc bien ce que contient la variable. Comment puis-je faire pour éviter cela? Les données sont envoyées toute les 2secondes. Il y a t'il moyen d'arreter la lecture entre ces 2 secondes et de remettre rxstring à NULL afin qu'une seule valeur soit écrite dedans?

    Merci de votre aide pour solutionner ce problème qui pour moi deviens un casse tête

  13. #13
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Quand tu mets un break point ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                RxString = serialPort1.ReadExisting();
    }
    Que contient ton RxString ? Si ce n'est pas ce que tu souhaites il faut que tu regardes pour dans la doc de la méthode ReadExisting()

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Je suis actuellement en train de lire la doc sur les méthodes de lecture. Je pense que readexisting ne convient pas pour ce que je dois faire. Cette méthode convertit toute les données présentes en mémoire tampon de lecture en une chaine de caractère si j'ai bien compris. Or je ne souhaite écrire dans rxstring que la dernière valeur lue par le port et pas tout le tableau de la mémoire tampon

  15. #15
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Essaye un coup avec ReadLine voir ce que ça donne

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Merci pour tes solutions proposées. J'ai déjà testé avant avec readline(). J'ai mis un point d'arret et ma variable reste à Null. J'ai également une exception timeout qui me dit que le délai d'attente pour l'opération a expiré. Si je garde readexisting(), n'y a t'il pas moyen de modifier la valeur de rxstring en ne gardant que les x dernier caractère et de réécrire cette valeur modifiée dans une autre variable qui elle sera affichée dans la textbox?

  17. #17
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Donne nous le contenu de la variable et on va te dire ça

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Voila le contenu de la variable. Je l'ai récupéré en plaçant un point d'arret. RxString = "026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000026.5000"

    Ce qui m'intéresse est 026.5000 c'est à dire les 8 derniers caractères de la chaine

  19. #19
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string toto = serialPort1.ReadExisting();
    toto = toto.substring(toto.Length - 7);

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    J'ai essayé et le code ne marche qu'une fois. Ensuite j'ai une exception qui me dit "StartIndex ne peut pas être inférieur à zéro.
    Nom du paramètre : startIndex"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Lecture port série
    Par mickael.be dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/07/2008, 09h49
  2. lecture port série
    Par biscot19 dans le forum C
    Réponses: 6
    Dernier message: 13/07/2007, 08h54
  3. lecture port série
    Par alex2395 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/03/2007, 15h59
  4. [API Win32 sans MFC] Lecture port série: thread bloqué
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/05/2006, 13h34
  5. Pb de lecture port série
    Par amalis dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 18/03/2006, 16h21

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