Réception SerialPort

Signaler
Messages postés
24
Date d'inscription
vendredi 10 décembre 2010
Statut
Membre
Dernière intervention
19 juin 2011
-
Messages postés
24
Date d'inscription
vendredi 10 décembre 2010
Statut
Membre
Dernière intervention
19 juin 2011
-
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

Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
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 !
Messages postés
24
Date d'inscription
vendredi 10 décembre 2010
Statut
Membre
Dernière intervention
19 juin 2011

bonjour,
j'essai ce que vous avez me dis mais ca marche pas.
est ce que vous avez pas autres aides.