Fermeture d'un port série après avoir reçu des données C#

majined - Modifié le 4 août 2018 à 20:15
wattsoum6.4
Messages postés
1
Date d'inscription
jeudi 7 octobre 2021
Statut
Membre
Dernière intervention
7 octobre 2021
- 7 oct. 2021 à 15:56
Bonjour,
j'ai un petit problème : je réalise un programme capable de recevoir et envoyer des informations de la liaison série. J'ai ainsi créé une fenêtre de configuration des paramêtres du port série. la première connection se fait parfaitement, je reçois bien et j'envois bien. Le problème vient lors d'une deuxième connection. Lorsque je tente de me reconnecter sur le meme port série (ou sur un autre) après avoir reçu des données(si je reçois rien je peux changer de port à la volé sans problème), mon soft plante.
Je vous met le code :

private void button9_Click(object sender, EventArgs e)
        {
            if (serialPort1 != null && serialPort1.IsOpen)
                serialPort1.DataReceived -= serialPort1_DataReceived;
            while (!(serialPort1.BytesToRead <bold>0 && serialPort1.BytesToWrite</bold> 0))
            {
                serialPort1.DiscardOutBuffer();
                serialPort1.DiscardInBuffer();
            }
            serialPort1.Close();
            serialPort1.PortName = comboBox4.Text;
            serialPort1.BaudRate = int.Parse(textBox2.Text);
            serialPort1.DataBits = int.Parse(textBox3.Text);
            serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox5.Text);
            serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox6.Text);
            try
            {
                serialPort1.Open();
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
                serialPort1.Close();
            }
            serialPort1.DataReceived += serialPort1_DataReceived;
            Form2.Hide();
        }


C'est la fonction qui permet de changer les paramêtres du port série.
La suivante est celle qui me permet d'afficher les informations reçus :

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string msg = sp.ReadLine();
            this.Invoke(new EventHandler(delegate
                {
                    textBox1.AppendText(msg + "\n");
                    textBox1.ScrollToCaret();
                }));
        }


Si quelqu'un à une idée d'ou est-ce que ça pourrait venir je suis preneur ;)

Merci

4 réponses

DevLama
Messages postés
356
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
18 novembre 2021
10
4 oct. 2012 à 14:20
SerialPort1.Close()

La Science est Grande et Vaste partageons cette connaisance
0
Non okosa, le close je le fais déjà, le problème était que justement qu'il plantait en le faisant après avoir reçu quelque chose sur le port.

Mais c'est bon j'ai résolu le problème, c'était juqte parce que j'avais oublié de thread la réception donc elle passait en foreground et empechait de quitter mon soft ou de close le port.

Merci quand même
0
bonjour à tous , comment fait on pour " thread la réception", j'ai le même problème, lorsque je ferme le port, avec _serialport1.Close();
il est bloqué dans datareceived(); et je ne sais pas comment arreter cette fonction
0
wattsoum6.4
Messages postés
1
Date d'inscription
jeudi 7 octobre 2021
Statut
Membre
Dernière intervention
7 octobre 2021
> c#
7 oct. 2021 à 15:56
même problème...comment faire merci d'avace
0
Même problème, comment faire svp ?
0
madkeyboard
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Statut
Membre
Dernière intervention
21 décembre 2012
1
10 oct. 2012 à 09:51
Oublie pas de marquer le sujet comme résolu ^^
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
4 août 2018 à 13:33
bonjour
Il ne manquerait pas des signes == ici
 while (!(serialPort1.BytesToRead 0 && serialPort1.BytesToWrite 0))


à modifier en
 while (!(serialPort1.BytesToRead == 0 && serialPort1.BytesToWrite ==  0))

0