none
vider un buffer de réception serialport RRS feed

  • Question

  • Bonjour,

     

    je suis sur un projet qui consiste à lire des données reçues par le port com de mon pc.

    Les données proviennent d'une plaquette électronique comme cici :

    -2 seconde d'attente

    -on reçoit 1,2,3,4 (4 bytes d'affilé)

    - on attent 2 secondes

    -on reçoit 5,6,7,8

    - on attent 2 secondes

    -on reçoit 9,?,?,?

     

    jusque là j'arrive à recevoir les données sans problèmes.

    Ensuite, je dois séparer les données : si je reçoit le groupe 1,2,3,4, je dois les séparer pour faire en sorte que chacune sois dans une textbox particulière :

    1 -> textbox1

    2 -> textbox2

    ...

    4 -> textbox4

     

    pour ce groupement ça marche, mais à partir de 5, mon code flanche.

    Je me suis dit que je devais vider le buffer de réception (serialport.discardinbuffer()), mais rien...ça ne va pas.

     

    Voici le code.

     

      private void button1_Click(object sender, EventArgs e) 
      {if (comboBox1.Visible == true)
       {MessageBox.Show("Veuillez choisir le port COM spécifique et appuyer sur OK pour continuer!", "Mauvaise procédure", MessageBoxButtons.OK, MessageBoxIcon.Stop);   }
       else
       {
        if (buttonConnectDeconnect.Text == "Connecté")
        {
         buttonConnectDeconnect.Text = "Déconnecté";
         label11.ForeColor = Color.Red;
         buttonConnectDeconnect.BackColor = Color.Red;
         if (serialPort1.IsOpen)
         {
          serialPort1.Close();
          label11.Text = "Port " + comboBox1.Text + " Fermé";
         }
        }
        else
        {
         buttonConnectDeconnect.Text = "Connecté";
         label11.ForeColor = Color.Green;
         buttonConnectDeconnect.BackColor = Color.Green;
         //Serial source
         serialPort1 = new SerialPort((string)comboBox1.SelectedItem, 9600, Parity.None, 8, StopBits.One);
         //serialPort1 = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
         serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
         // serialPort1.DtrEnable = true;
         // serialPort1.RtsEnable = true;
         // serialPort1.ReadTimeout = 500;
         //Ouverture du port
         if (!serialPort1.IsOpen)
         {
          serialPort1.Open();
         }
        }
       }
      }
      private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
      {
       string value = "";
       while (serialPort1.BytesToRead > 0)
       {
        char[] buffer = new char[4];
         int bytes_read = serialPort1.Read(buffer, 0, buffer.Length);
         for (int i = 0; i < bytes_read; i++)
         {
          value += buffer[i];
         }
              safeInput(value.ToString());
       }
          }
      private void safeInput(string msg)
      {
        textBox1.Invoke(new EventHandler(delegate
        {     
    ////textBox1.SelectedText = string.Empty;
         //this.textBox1.Text = "";
         ////textBox1.AppendText(String.Format(msg));
         //textBox1.Text = msg[0].ToString(); 
         ////textBox2.SelectedText = string.Empty;
         //this.textBox2.Text = "";
         //textBox2.AppendText(msg.ToString());
         ////textBox2.Text = msg[1].ToString();
         ////textBox3.SelectedText = string.Empty;
         //this.textBox3.Text = "";
         //textBox3.AppendText(msg.ToString());
         ////textBox3.Text = msg[2].ToString();
         ////textBox4.SelectedText = string.Empty;
         //this.textBox4.Text = "";
         ////textBox4.AppendText(msg.ToString());
         //textBox4.Text = msg[3].ToString();
         // on efface les textboxs
          textBox1.SelectedText = string.Empty;
          this.textBox1.Text = "";
          textBox2.SelectedText = string.Empty;
          this.textBox2.Text = "";
          textBox3.SelectedText = string.Empty;
          this.textBox3.Text = "";
          textBox4.SelectedText = string.Empty;
          this.textBox4.Text = "";
          // séparation du message en 4 morceaux
         string W = msg.Substring(0, 1);
         string X = msg.Substring(1, 1);
         string Y = msg.Substring(2, 1);
         string Z = msg.Substring(3, 1);
              // mise des morceaux du message dans un tableau
         string[] tableau_valeur = new string[4];
         tableau_valeur[0] = W;
         tableau_valeur[1] = X;
         tableau_valeur[2] = Y;
         tableau_valeur[3] = Z;
         // mise en textbox approprié des valeur inscrite dans le tableau!
         textBox1.Text = tableau_valeur[0];
         textBox2.Text = tableau_valeur[1];
         textBox3.Text = tableau_valeur[2];
         textBox4.Text = tableau_valeur[3];
              // on vide le buffer de réception
         serialPort1.DiscardInBuffer();
        }));
      }

     

     

    je suis nouveau dans le c#, j'apprend grace aux tutoriels sur le net.

     

    Merci de votre aide

    • Modifié Alex Petrescu vendredi 16 avril 2010 12:30 code format
    jeudi 15 avril 2010 14:51

Réponses

  • Tu n'as pas besoin de vider le buffer parceque c'est dejà initializé automatiquement dans la boucle chaque fois.

     Essaye de remplacer la fonction port_DataReceived par ça

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
     {
      while (serialPort1.BytesToRead > 0) 
      { char[] buffer = new char[4]; 
       int bytes_read = serialPort1.Read(buffer, 0, buffer.Length);
       string value = new string(buffer); 
       safeInput(value);
      }
     }
    dimanche 18 avril 2010 14:20

Toutes les réponses

  • Bonjour,

     

    Qu’est-ce que se passe si votre objet serialPort1 reçoit des données pendant l’exécution de port_DataReceived ? Essayez d’envoyer les données a des intervalles plus longues, pour vérifier si vous n’avez une perte de données du deuxième cycle pendant le traitement du premier.

     

    Cordialement,

    Alex


    Appel à contribution ! http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/ff4910bf-dca4-4664-b01e-b58bd860a643
    vendredi 16 avril 2010 12:57
  • Bonsoir,

     

    Je reçoit des données 4bytes par 4 bytes.

    SI je reçois des données (ensemble de 4 bytes), je prend chacun des bytes reçu et je les met dans une textbox.

    Quand je reçoit le message d'après (et à partir du premier byte du second paquet, soit le 5ème byte reçu); je reçois ce message "L'index et la longueur doivent faire référence à un emplacement situé dans la chaîne."

     

    J'ai mis un temps de réception de 1 minutes mais rien...tjs le même message.

     

    Merci de votre aide.

     

    Thib

    vendredi 16 avril 2010 14:20
  • Tu n'as pas besoin de vider le buffer parceque c'est dejà initializé automatiquement dans la boucle chaque fois.

     Essaye de remplacer la fonction port_DataReceived par ça

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
     {
      while (serialPort1.BytesToRead > 0) 
      { char[] buffer = new char[4]; 
       int bytes_read = serialPort1.Read(buffer, 0, buffer.Length);
       string value = new string(buffer); 
       safeInput(value);
      }
     }
    dimanche 18 avril 2010 14:20
  • Merci Hammadi pour l’exemple.

     

    Thib, tenez-nous au courant si vous enregistrez des progrès à l’aide de ce code.

     

    Cordialement,

    Alex


    Appel à contribution ! http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/ff4910bf-dca4-4664-b01e-b58bd860a643
    lundi 19 avril 2010 10:11
  • bonjour, effectivement ça passe beaucoup mieux.

     

    Merci bcp.

     

    j'ai un probleme d'affichage, mais ce n'est qu'un détails.

     

    Je reçois par exemple 40 en hexa : @ en caractère et 64 en décimal.

     

    Comment puis-je faire pour mettre 0x40 en décimal?

     

    Merci ;-)

    jeudi 6 mai 2010 06:49
  • Bonjour,

     

    Vous pouvez utiliser int.Parse avec ces paramètres :  

     

    int dec1 = int.Parse(“40”, System.Globalization.NumberStyles.HexNumber);

     

     

    Si vous avez le string initial avec le format ‘0x40’ il faut enlever la première partie: ‘0x’ avant d’utiliser int.Parse

     

    Cordialement,

    Alex


    Appel à contribution ! http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/bd974e0e-5519-4122-b8fc-3b998207c34f
    jeudi 6 mai 2010 08:08