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 :

Besoin d'aide communication port serie


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : ouvrier

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Besoin d'aide communication port serie
    Bonjour a tous.

    Je suis en un petit nouveau sur le forum mais aussi en développement.

    j'ai acheté un arduino récemment pour faire un petite station météo pour un projet futur d'observatoire astronomique.

    j'ai réussi a coder mon arduino pour qu'il récupère les données de la sonde et j'ai réussi a créer une petite interface en c#

    la voici:
    Nom : meteo.jpg
Affichages : 149
Taille : 57,1 Ko
    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
    80
    81
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.Text.RegularExpressions;
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            SerialPort port;
     
     
     
            public Form1()
            {
                InitializeComponent();
     
            }
     
     
     
            private void button1_Click(object sender, EventArgs e)
            {
                if (button1.Text == "Connecter") 
                {
     
                    port = new SerialPort();
                    port.BaudRate = 9600;
                    port.DataBits = 8;
                    port.StopBits = StopBits.One;
                    port.Parity = Parity.None;
                    port.PortName = comboPort.SelectedItem.ToString();
                    port.ReadTimeout = 200;
                    port.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                    port.Open(); 
                    button1.Text = "Deconnecter";
                }
                else 
                {
                   port.Close(); 
                   button1.Text = "Connecter";
                }
            }
     
            private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
     
                String texte = port.ReadExisting();
                SetText(texte);
            }
     
            delegate void SetTextCallback(string text);
            private void SetText(string text)
            {
     
                if (textBox4.InvokeRequired)
                {
     
     
                    SetTextCallback d = new SetTextCallback(SetText);               
                  textBox4.Invoke(d, new object[] {text});
     
                }
                else
                {
                    textBox4.Text += text;
     
                    string[] newData = textBox4.Text.Split(new char[] { });
                    textBox1.Text = newData[0] + " %";
                    textBox2.Text = newData[1] + " °C";
                    textBox3.Text = newData[2] + " °C";
     
     
                }
    le problème c'est que les données arrivent toutes les 2sec sur le port série et que la ce code ne s'actualise pas il me prend juste la première chaine arrivant et c'est tout.

    j'avais pensé a un timer mais je ne sais pas du tout comme le mettre en œuvre. ou est ce qu'il existe un fonction pour lire juste la dernière ligne de la textbox, si cela existe je n'ai rien trouver sur le net pouvant m'aider.

    cordialement

    Damien

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    astrodam89,


    Il faut peut être modifier les propiétés ReadBufferSize et ReceivedBytesThreshold pour recevoir toutes les données.
    Ou quelque chose de plus "tarabiscoté" comme fermer le port et le rouvrir à chaque fois vu que les données n'arrivent que toutes les 2s.

    Salutations.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Normalement ça devrait fonctionner.
    Peut-être un problème de refresh ?
    Essayes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    textBox4.Refresh();
    textBox1.Refresh();
    textBox2.Refresh();
    textBox3.Refresh();
    Le mieux c'est de mettre un point d'arrêt (F9) dans ta méthode DataReceived. Comme ça tu vois combien de fois tu y passes. Si tu ne passe qu'une fois ou bien les fois suivantes qu'est-ce qui diffère.

    Quoi qu'il en soit le Timer on oublie Il faut juste que tu réceptionnes trame par trame. A toi de définir quand la trame est complète et d'effectuer le traitement dessus (parsing et affichage)

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : ouvrier

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    j'ai essayé avec le Refresh mais ca ne marche pas

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Et le point d'arrêt ça donne quoi ?

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : ouvrier

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par lead8209 Voir le message
    Et le point d'arrêt ça donne quoi ?
    j'ai mit le point d’arrêt sur le data received et il y pas bien plusieurs fois.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 72
    Points : 107
    Points
    107
    Par défaut
    Bonjour,
    Essaye ce bout de code, l'idée c'est de lire caractère par caractère ton buffer.
    Attention aux caractères de fin de chaine qui ont leurs importances dans la réception.

    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
     
           public void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // Si port Com fermé ne rien faire
                if (!port.IsOpen) return;
     
                // Obtient le nombre de byte en attente dans le buffer
                int bytes = port.BytesToRead;
     
                // création du buffer
                byte[] buffer = new byte[bytes];
     
                // Lire les datas stockés dans le buffer 
                port.Read(buffer, 0, bytes);
     
     
                for (int i = 0; i < buffer.Count(); i++)
                    texte += Convert.ToChar(buffer[i]);
              }

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : ouvrier

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    merci mais le problème ne viens pas réellement de la réception de données, je les reçois juste de manière asynchrone.
    mon principale problème et juste de récupérer la dernière chaine dans la textbox et de façon régulière pour pouvoir les envoyer dans d'autre textbox

Discussions similaires

  1. Communication port serie en java
    Par rimas2009 dans le forum Général Java
    Réponses: 3
    Dernier message: 24/04/2009, 16h59
  2. Besoin d'aide sur port parallèle
    Par Crabe05 dans le forum C
    Réponses: 2
    Dernier message: 30/10/2008, 17h58
  3. communication port serie avec GTK+?
    Par cguignol dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 28/06/2007, 11h15
  4. Communication port serie avec un microcontrolleur
    Par crazydede8 dans le forum C
    Réponses: 4
    Dernier message: 29/07/2006, 14h49
  5. [communication] Port serie
    Par Mr bizzz dans le forum Flash
    Réponses: 8
    Dernier message: 07/06/2006, 01h38

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