Aide d'affichage de données dans textbox

Aide d'affichage de données dans textbox - C#/.NET managed - Programmation

Marsh Posté le 13-04-2010 à 21:52:15    

Bonjour,
 
je voulais avoir un peu d'aide de votre part.
Je débute en c# et je dois afficher des données (6 bytes) provenant d'un port série. chaque byte vaut une valeur provenant d'un capteur particulier.
Pour cela, j'arrive sans problème à les recevoir dans une textbox.
Cependant, mon souci se trouve ici : je dois avoir 6 textbox, pour chacun des bytes
textbox1 -> byte0
textbox2 -> byte1
textbox3-> byte2
..
textbox6-> byte5
 
lors du prochain envois de données (1 minutes après le dernier) je recois de nouveau 6 bytes (et donc même style d'affichage en écrasant les anciennent données.
 
Ma question est simple : comment séparer les bytes entrent eux et les afficher séparément?
J'ai regardé avec la méthode substring...mais ça ne marche pas. Voici mon code (la partie d'affichage se trouve dans la deuxième partie du code
 

Code :
  1. private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
  2.         {
  3.             string value = "";
  4.             while (serialPort1.BytesToRead > 0)
  5.             {
  6.                 char[] buffer = new char[255];
  7.                 int bytes_read = serialPort1.Read(buffer, 0, buffer.Length);
  8.                 for (int i = 0; i < bytes_read; i++)
  9.                 {
  10.                     value += buffer[i];
  11.                 }
  12.             }
  13.             safeInput(value.ToString());
  14.         }


 

Code :
  1. private void safeInput(string msg)
  2.         {
  3.                 textBox1.Invoke(new EventHandler(delegate
  4.                 {
  5.                     textBox1.SelectedText = string.Empty;
  6.                     textBox1.AppendText(msg.ToString().Substring(1, 1));
  7.                     textBox1.ScrollToCaret();
  8.                     textBox2.SelectedText = string.Empty;
  9.                     textBox2.AppendText(msg.ToString().Substring(2, 1));
  10.                     textBox2.ScrollToCaret();
  11.                     textBox3.SelectedText = string.Empty;
  12.                     textBox3.AppendText(msg.ToString().Substring(3, 1));
  13.                     textBox3.ScrollToCaret();
  14.                     textBox4.SelectedText = string.Empty;
  15.                     textBox4.AppendText(msg.ToString().Substring(4, 1));
  16.                     textBox4.ScrollToCaret();
  17.                 }));
  18.         }


 
 
Merci de votre aide. :)

Reply

Marsh Posté le 13-04-2010 à 21:52:15   

Reply

Marsh Posté le 14-04-2010 à 10:38:56    

Salut et merci pour ta réponse.
J'ai testé ceci :
 

Code :
  1. private void safeInput(string msg)
  2.         {
  3.                 textBox1.Invoke(new EventHandler(delegate
  4.                 {
  5.                     //textBox1.SelectedText = string.Empty;
  6.                     textBox1.Text = "";
  7.                     /*textBox1.AppendText(msg.ToString());
  8.                     textBox1.ScrollToCaret();*/
  9.                     textBox1.Text = msg[0].ToString();
  10.                     //textBox2.SelectedText = string.Empty;
  11.                     textBox2.Text = "";
  12.                     /*textBox2.AppendText(msg.ToString());
  13.                     textBox2.ScrollToCaret();*/
  14.                     textBox2.Text = msg[1].ToString();
  15.                     //textBox3.SelectedText = string.Empty;
  16.                     textBox3.Text = "";
  17.                     /*textBox3.AppendText(msg.ToString());
  18.                     textBox3.ScrollToCaret();*/
  19.                     textBox3.Text = msg[2].ToString();
  20.                     //textBox4.SelectedText = string.Empty;
  21.                     textBox4.Text = "";
  22.                    /* textBox4.AppendText(msg.ToString());
  23.                     textBox4.ScrollToCaret();*/
  24.                     textBox4.Text = msg[3].ToString();
  25.                 }));
  26.         }


Le programme compile, mais le programme s'arrête et l'erreur dit : "l'index se trouve en dehors du tableau".
Je suis débutant en c# et je ne comprend pas ce problème ^^
 
Pourrais-tu m'éclairer?

Reply

Marsh Posté le 14-04-2010 à 12:16:02    

je ne comprends toujours pas pourquoi ça ne va pas...  :pt1cable:  
Je reçois un flux continu d' octets. Est-ce ça?
Comment pourrais-je faire en sorte qu'a bout de 255 valeurs, le buffer se vide? :??:  
 
Merci. ;)

Reply

Marsh Posté le 14-04-2010 à 13:43:39    

ok, je vais testé, je suis débutant et je ne savais pas tout ça...merci des conseils ;-)

Reply

Marsh Posté le 14-04-2010 à 14:51:01    

 
 

Code :
  1. Euh... Au fait, tu n'as toujours pas répondu à mes questions, en particulier celle-ci :
  2. "Est-ce que la première partie inscrit les bonnes valeurs dans la variable "value" ?"


oui c'est les bonnes valeurs
 
 
 

Code :
  1. "Il faut que tu regardes quelle taille fait ta variable msg : attribut Length dans ton outil de débuggage. Et en amont, regarde ce que vaut int bytes_read."


 
comment je fait? ^^ je veux dire, j'utilise Visual studi 2010 depuis même pas 1 mois  :ange:  
Pourrais-tu me guider stp?
 
Merci beaucoup.

Reply

Marsh Posté le 15-04-2010 à 09:25:20    

salut,  
 
je pense savoir où est le problème!
Je m'envoie constamment la chaine 1,2,3, 4 séparé à 1 seconde intervalle.
Je veux mettre les 4 valeurs dans une textbox séparée.
1 -> textbox1
2-> texbox2
...
4-> textbox4
 
or ça marche pour les 4 premières valeurs mais comme je recois 1,2,3,4....1,2,3,4....ça ne va pas
Je pense que je deois vider le buffer de réception après la réception des 4 premier bytes.
J'ai été voir la méthode  
"serialPort.DiscardInBuffer();"
 
mais je dois mal l'utilisée...pouvez-vous m'aider?
 
Mon code est ci-dessous...
 
Ca serait cooool de votre part ;-)
 
 

Code :
  1. private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             if (comboBox1.Visible == true)
  4.             {
  5.                 MessageBox.Show("Veuillez choisir le port COM spécifique et appuyer sur OK pour continuer!", "Mauvaise procédure", MessageBoxButtons.OK, MessageBoxIcon.Stop);
  6.             }
  7.             else
  8.             {
  9.                 if (buttonConnectDeconnect.Text == "Connecté" )
  10.                 {
  11.                     buttonConnectDeconnect.Text = "Déconnecté";
  12.                     label11.ForeColor = Color.Red;
  13.                     buttonConnectDeconnect.BackColor = Color.Red;
  14.                     if (serialPort1.IsOpen)
  15.                     {
  16.                         serialPort1.Close();
  17.                         label11.Text = "Port " + comboBox1.Text + " Fermé";
  18.                     }
  19.                 }
  20.                 else
  21.                 {
  22.                     buttonConnectDeconnect.Text = "Connecté";
  23.                     label11.ForeColor = Color.Green;
  24.                     buttonConnectDeconnect.BackColor = Color.Green;
  25.                     //Serial source
  26.                     serialPort1 = new SerialPort((string)comboBox1.SelectedItem, 9600, Parity.None, 8, StopBits.One);
  27.                     //serialPort1 = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
  28.                     serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
  29.                   //  serialPort1.DtrEnable = true;
  30.                   //  serialPort1.RtsEnable = true;
  31.                     serialPort1.ReadTimeout = 500;
  32.                     //Ouverture du port
  33.                     if (!serialPort1.IsOpen)
  34.                     {
  35.                         serialPort1.Open();
  36.                     }
  37.                 }
  38.             }
  39.         }
  40.         private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
  41.         {
  42.             string value = "";
  43.             while (serialPort1.BytesToRead > 0)
  44.             {
  45.                 char[] buffer = new char[255];
  46.                     int bytes_read = serialPort1.Read(buffer, 0, buffer.Length);
  47.                     for (int i = 0; i < bytes_read; i++)
  48.                     {
  49.                         value += buffer[i];
  50.                     }
  51.                    
  52.                     safeInput(value.ToString());
  53.             }
  54.            
  55.          }
  56.         private void safeInput(string msg)
  57.         {
  58.                 textBox1.Invoke(new EventHandler(delegate
  59.                 {
  60.                    
  61.                     ////textBox1.SelectedText = string.Empty;
  62.                     //this.textBox1.Text = "";
  63.                     ////textBox1.AppendText(String.Format(msg));
  64.                     //textBox1.Text = msg[0].ToString();
  65.                     ////textBox2.SelectedText = string.Empty;
  66.                     //this.textBox2.Text = "";
  67.                     //textBox2.AppendText(msg.ToString());
  68.                     ////textBox2.Text = msg[1].ToString();
  69.                     ////textBox3.SelectedText = string.Empty;
  70.                     //this.textBox3.Text = "";
  71.                     //textBox3.AppendText(msg.ToString());
  72.                     ////textBox3.Text = msg[2].ToString();
  73.                     ////textBox4.SelectedText = string.Empty;
  74.                     //this.textBox4.Text = "";
  75.                     ////textBox4.AppendText(msg.ToString());
  76.                     //textBox4.Text = msg[3].ToString();
  77.                     // séparation du message en 4 morceaux
  78.                     string W = msg.Substring(0, 1);
  79.                     string X = msg.Substring(1, 1);
  80.                     string Y = msg.Substring(2, 1);
  81.                     string Z = msg.Substring(3, 1);
  82.                     // mise des morceaux du message dans un tableau
  83.                     string[] tableau_valeur = new string[4];
  84.                     tableau_valeur[0] = W;
  85.                     tableau_valeur[1] = X;
  86.                     tableau_valeur[2] = Y;
  87.                     tableau_valeur[3] = Z;
  88.                     // mise en textbox approprié des valeur inscrite dans le tableau!
  89.                     textBox1.Text = tableau_valeur[0];
  90.                     textBox2.Text = tableau_valeur[1];
  91.                     textBox3.Text = tableau_valeur[2];
  92.                     textBox4.Text = tableau_valeur[3];
  93.                 }));
  94.         }


 
Merci à vous tous

Reply

Marsh Posté le 15-04-2010 à 10:05:07    

la variable msg = 1 lors de l'arrêt du programme
 
La ligne pointée est

Citation :

textBox1.Invoke(new EventHandler(delegate


 
pour la taille de msg et l'index je ne sais pas comment je peut voir ça dans l'outil de dégugage...sorry, mais je ne demande qu'a apprendre
 
Merci
 

Reply

Marsh Posté le 27-04-2010 à 16:37:35    

essaye de faire plus simple comme programme, genre un "hello world" en mode console.
 
Parce que la, y'a tout à apprendre, je ne vois pas comment on pourra t'aider :/


Message édité par Tamahome le 27-04-2010 à 16:37:45

---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 02-05-2010 à 15:21:00    

Je suis du même avis, apparemment il te manque les notions de base sur la concaténation et les chaînes, la manipulation des contrôles (genre les append/scroll to caret qui arrachent les yeux, j'ai mis quelques instants à comprendre pourquoi c'était pondu comme ça alors qu'il y a un équivalent 1 milliard de fois plus simple et naturel)... alors on est encore loin de pouvoir faire mumuse avec les invocations asynchrones et délégués...

 

Fais des petites interfaces basique, familiarise toi avec les événements, et l'IDE (débuggeur, etc), acquière quelques notions d'objet... avant de te plonger dans des programmes comme ça.


Message édité par TotalRecall le 02-05-2010 à 15:21:33

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed