Réception SerialPort

fl2010 Messages postés 24 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 19 juin 2011 - 3 mai 2011 à 23:08
fl2010 Messages postés 24 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 19 juin 2011 - 4 mai 2011 à 09:32
Bonjour,
Je travaille sur la communication entre un Pc et un régulateur pour lire la température qui varie en fonction de temps.
J’essai d’écrire un programme qui fait la communication mais je n’arrive pas à lire les données correctement. Mon programme me permet de lire seulement les valeurs impaire ce qui n’est pas logique.
S’il vous plait aidez-moi à résoudre ce problème.
Voici le code :
private SerialPort com = new SerialPort();
        public void configPort()
        {
            if (serialPort.IsOpen == true) com.Close();
            try
            {
                SqlCommand commande = new SqlCommand("select Port,Speed_bits,Data_bits,Stop_bits,Parity_bits from ConfigPort1", Program.connexion);
                Program.connexion.Open();
                SqlDataReader read = Program.commande.ExecuteReader();
                while (read.Read())
                {
                    serialPort.PortName = read[0].ToString();
                    serialPort.BaudRate = System.Convert.ToInt32(read[1]);
                    serialPort.DataBits = System.Convert.ToInt32(read[2]);
                    switch (read[4].ToString())
                    {
                        case "Even": serialPort.Parity = System.IO.Ports.Parity.Even; break;

                        case "Odd": serialPort.Parity = System.IO.Ports.Parity.Odd; break;
                        case "None": serialPort.Parity = System.IO.Ports.Parity.None; break;

                    }
                    switch (read[3].ToString())
                    {
                        case "1": com.StopBits = System.IO.Ports.StopBits.One; break;

                        case "1.5": com.StopBits = System.IO.Ports.StopBits.OnePointFive; break;
                        case "2": com.StopBits = System.IO.Ports.StopBits.Two; break;

                    }
                    serialPort.Handshake = System.IO.Ports.Handshake.None;
                    serialPort.ReadTimeout = 500;
                    serialPort.WriteTimeout = 500;
                }
            }
            catch (Exception z) { MessageBox.Show(z.ToString()); }
            Program.connexion.Close();

        }
public void lecture(string adress)
        {
            if (serialPort.IsOpen == false) serialPort.Open();
            ArrayList trame_lecture = new ArrayList();
            ArrayList Adr = new ArrayList();
            ArrayList Consigne = new ArrayList();
            StringBuilder adr = new StringBuilder(adress);
            for (int s = 0; s < adress.Length; s++)
            {
                if (adress.Length == 1) { Adr.Add(48); Adr.Add(48); }

                Adr.Add(Convert.ToInt32(adr[s]));
                Adr.Add(Convert.ToInt32(adr[s]));
            }

            trame_lecture.Add(4);
            trame_lecture.AddRange(Adr);
            trame_lecture.Add(80);
            trame_lecture.Add(86);
            trame_lecture.Add(5);

            envoie(trame_lecture);
        }
public void adressetuve()
        {
            try
            {
                Program.connexion.Open();
                SqlCommand commande = new SqlCommand("select Adresse,Temperat_Con_1 from Oven", Program.connexion);

                SqlDataReader reader = commande.ExecuteReader();

                while (reader.Read())
                {
                  lecture(reader[0].ToString());
                }
                reader.Close();
            }
            catch (Exception z) { MessageBox.Show(z.ToString()); }
            Program.connexion.Close();
        }
public void envoie(ArrayList liste)
        {
            if (serialPort.IsOpen == false) serialPort.Open();
            Byte[] T = new Byte[liste.Count];
            for (int s = 0; s < T.Length; s++)
            {
                T[s] = Convert.ToByte(liste[s]);
            }

            serialPort.Write(T, 0, T.Length);
            string msg = serialPort.ReadExisting();
        }
StringBuilder adr = new StringBuilder();
        string value;
        ArrayList trame = new ArrayList();
        private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (serialPort.IsOpen == false) serialPort.Open();
            value = serialPort.ReadExisting();
            adr = new StringBuilder(value);
            trame.Add(adr[3]);
            trame.Add(adr[4]);
            trame.Add(adr[5]);
            trame.Add(adr[6]);

            this.Invoke(new EventHandler(DisplayText));
           serialPort.Close();
        }

        private void DisplayText(object sender, EventArgs e)
        {

            int i = 0;
            String sList = "";
            for (i = 0; i < trame.Count; i++)
            {
                sList += trame[i];
            }
           textBox3.AppendText(sList);

        }

2 réponses

LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
4 mai 2011 à 07:33
Salut,

A première vue, je dirais que cela vient du fait que tu fasses un
string msg = serialPort.ReadExisting(); après l'envois de la trame
(dans la méthode envoie()) !

Et que tu ne traites pas le message reçus; hors il est forcement
retiré du flux après lecture...

Essayes de mettre cette ligne en commentaire !
0
fl2010 Messages postés 24 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 19 juin 2011
4 mai 2011 à 09:32
bonjour,
j'essai ce que vous avez me dis mais ca marche pas.
est ce que vous avez pas autres aides.
0
Rejoignez-nous