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

majined - 2 oct. 2012 à 16:27 - Dernière réponse : vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention
- 4 août 2018 à 13:33
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
Afficher la suite 

Votre réponse

6 réponses

DevLama 353 Messages postés mercredi 13 avril 2011Date d'inscription 10 janvier 2018 Dernière intervention - 4 oct. 2012 à 14:20
0
Merci
SerialPort1.Close()

La Science est Grande et Vaste partageons cette connaisance
Commenter la réponse de DevLama
0
Merci
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
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
Même problème, comment faire svp ?
Commenter la réponse de majined
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 10 oct. 2012 à 09:51
0
Merci
Oublie pas de marquer le sujet comme résolu ^^
Commenter la réponse de madkeyboard
vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention - 4 août 2018 à 13:33
0
Merci
bonjour
Il ne manquerait pas des signes == ici
 while (!(serialPort1.BytesToRead 0 && serialPort1.BytesToWrite 0))


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

Commenter la réponse de vb95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.