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


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 118
    Par défaut lecture port série
    Bonjour,

    je n'arrive pas à recevoir de données en série via mon port com. Pourtant je m'y accroche mais rien.
    Pouvez-vous m'aider plz?
    Voici mon premier code qui marche nickel : je choisi le port com où il y a un truc de connecté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comboBox1.DataSource = SerialPort.GetPortNames();
    J'ai ensuite un bouton qui me permet de me connecter à mon port com et j'aimerais qu'il permette aussi de recevoir les info et les afficher dans une textbox.
    Perso, ici je test avec un byte mais plus tard je vais travailler avec 5 bytes à afficher dans 5 textbox différents. Là je sens que je serai un peu perdu.

    Mais commençons par recevoir 1 byte et l'afficher :

    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
            private void timer1_Tick(object sender, EventArgs e)
            {
                label1.Text = DateTime.Now.ToString("dd-MM-yyyy");
                label2.Text = DateTime.Now.ToString("hh:mm:ss ");
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                if (comboBox1.Visible == true)
                {
                    MessageBox.Show("Veuillez choisir le port COM spécifique et appuyer sur OK pour continuer!", "Mauvaise procédure", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                else
                {
     
                    if (buttonConnectDeconnect.Text == "Connecté")
                    {
                        buttonConnectDeconnect.Text = "Déconnecté";
                        label11.ForeColor = Color.Red;
                        buttonConnectDeconnect.BackColor = Color.Red;
     
                        if (SerialPort1.IsOpen)
                        {
                            SerialPort1.Close();
                            if (SerialPort1.IsOpen == false)
                                label11.Text = "Port " + comboBox1.Text + " Fermé";
                            else
                                label11.Text = "Port " + comboBox1.Text + " Ouvert";
                        }
     
                    }
                    else
                    {
                        buttonConnectDeconnect.Text = "Connecté";
                        label11.ForeColor = Color.Green;
                        buttonConnectDeconnect.BackColor = Color.Green;
     
                        //Serial source
                        SerialPort port = new SerialPort(comboBox1.DataSource.ToString(), 9600, Parity.None, 8, StopBits.One);
     
                        //Ouverture du port
                        if (SerialPort1.IsOpen == false)
                        {
                            SerialPort1.Open();
                            if (SerialPort1.IsOpen == true)
                            {
                                label11.Text = "Port " + comboBox1.Text + " Ouvert";
                            }
                            int recivedData = SerialPort1.ReadByte();
                            textBox2.Text = recivedData.ToString();
                        }
                    }
                }
            }
    9a ne marche pas des masses.

    Pouvez-vous m'aider svp...j'ai déjà rechercher sur le net mais ils disent tous des choses différentes et il n'y a pas bcp d'exemple dans la littérature!

    Merci à vous

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Hello,

    Suis pas tout à fait d'accord avec toi. Il y a des exemples sur le web...

    Je pense qu'il faut que tu te penches sur l'évènepment DataReceived.

    Comment fais-tu pour tester? Y-at-il effectivement qque chose qui arrive physiquement sur le "fil"? Parce que le Read() que tu fais est bloquant avec timeout apparemment...

    Christophe

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Quand tu as une erreur dans ton code, indique le message d'erreur obtenu : on est pas devins...

    Sinon y a pas mal de problèmes dans ton code...

    - Tu déclares et initialises une variable port, mais partout ailleurs c'est SerialPort1 que tu utilises, donc en fait l'instance de SerialPort que tu as créée n'est jamais utilisée

    - "comboBox1.DataSource.ToString()" va te renvoyer "System.String[]", puisque la DataSource est un tableau de chaines de caractères. Si tu veux le nom du port sélectionné, essaie plutôt "(string)comboBox1.SelectedItem"

    - N'utilise jamais les textes des contrôles dans la logique de ton code : si un jour tu changes le texte de ces contrôles, tu risques d'oublier de modifier le code qui en dépend, et tu introduis des bugs. Utilise plutôt des variables de type bool (ou autre, selon les cas) pour gérer l'état de ton application

    Sinon, pour changer de port, tu n'as pas besoin de créer une nouvelle instance de SerialPort : il suffit de modifier la propriété PortName de SerialPort1

    Et puis donne des vrais noms à tes contrôles, parce que "comboBox1", c'est pas super expressif... on comprend ce que c'est en voyant comment il est utilisé, mais quand tu commences à avoir beaucoup de contrôles ça devient vite compliqué si tu n'as que des numéros pour les identifier !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 118
    Par défaut
    Bonjour,

    Merci pour celui bien expliqué...il me dirigera.

    Sinon, je suis débutant : moi commencer avec tuto de développez.com...moi apprendre pour moi...
    Je sais que tu n'es pas devin, mais je débute...Mais je prend bien note de tes remarques. Je vous tiens au courant.

    Oui, j'ai un port série relié à un microcontrôleur et je m'envois des bytes...je peux donc savoir quels sont les bytes que je dois recevoir.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 118
    Par défaut
    Salut,

    j'ai testé avec toutes les remarques, mais je n'ai rien qui arrivent sur la textbox2 comme demandé. Pourtant sur mon terminal je vois des choses arriver.
    Comment puis-je vous passer mon code entier pour que vous puissiez éventuellement regarder?

    Merci à vous.

  6. #6
    Membre confirmé Avatar de lasrevinu
    Inscrit en
    Février 2010
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 215
    Par défaut S'en sortir avec les serial port en c#
    Voici en resumé comment s'en sortir avec les serial port en c# (c pas evident)

    tout dabord il faudrai declarer une nouvelle instance de ton serial port en static au debut de ton programme lorsque tu declare tes variables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public partial class TonAppliSerialPort: Form
        {
            static SerialPort serialPort1;
    ensuite lorsque tu initialise ta form juste apres InitializeComponent();
    tu crée une nouvelle instance de ton serial port et un SerialDataReceived Event Handler comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public FrmIselControl()
            {
                //Initialise the form (labels, textBox, buttons)
                InitializeComponent();
     
                //Creates a new instance of the serialPort class
                serialPort1 = new SerialPort();
     
                //Sets the SERIAL PORT ENCODING 
                serialPort1.Encoding = Encoding.Default;
     
                //Recupere les données en entrée du port serie 
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            }
    ensuite tu ouvre ton port serie (un petit try catch, si jamais il y a un pepin):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     private void FrmIselControl_Load(object sender, EventArgs e)
            {
                try
                {
                    //Opening the serial port
                    serialPort1.Open();
     
                }
                catch (Exception ex)
                {
                    messageBox.Show(ex.Message);
                }
            }
    ensuite tu peux ecrire sur ton port serie, voila un petit exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     private void ecrirtureSurPort()
            {
                try
                {
                    string msg = "salut Monsieur le port serie";
                    serialPort1.Write(msg);
                }
                catch (Exception ex)
                {
                    messageBox.Show(ex.Message);
                }
            }
    Ensuite pour lire sur ton port serie, tu devra faire ceci:
    -1)créer une methode datareceived qui prend en parametre le SerialDataReceivedEventArgs que tu as instancié au tout debut de ton 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
           private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
    //string vide
                string value = "";                
    //tant qu'il y a des données entrée on continue
                while (serialPort1.BytesToRead > 0)
                {
    // on crée un char de 255 caractere
                    char[] buffer = new char[255];
    //lecture du buffer jusqu'a sa longeur buffer.Length
                    int bytes_read = serialPort1.Read(buffer, 0, buffer.Length);
    //on remplit notre string value
                    for (int i = 0; i < bytes_read; i++)
                    {
                        value += buffer[i];
                    }
                }
                safeInput(value.ToString());
            }
    -2)créer une methode pour pouvoir ecrire sur les controle(c'est ce qui t'interresse) le port serie utilse un thread(fil d'execution) different du thread utilisé pour ecrire sur des controles, textbox..
    c'est pour cela que tu devra invoker un delegate qui prend en parametre le message que tu lis du port serie. comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            private void safeInput(string msg)
            {
                InputTextBox.Invoke(new EventHandler(delegate
                {
                        InputTextBox.SelectedText = string.Empty;
                        InputTextBox.AppendText(msg.ToString());
                        InputTextBox.ScrollToCaret();
                    }                
                }));
            }
    REMARQUE IMPORTANTE:
    il se peut que les message envoyé ne soient pas interpretés par la machine avec laquelle vous communiquer, si cela arrive penser a mettre un carriage return \r ou une nouvelle ligne \n ou les deux \r\n, tout depend de la machine.
    vous pouvez aussi utiliser readto et readexisting, (se renseigner sur msdn)

    voila j'espere que ce message aidera nombreux d'entre vous.
    bon courage.
    Lasrevinu

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

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