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 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
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
Rejoignez-nous