Bonjour,
je reçois un ensemble de bytes sur mon port COM. J'aimerais afficher ces bytes en décimal dans une textbox :
si je reçois 1F, qu'il affiche 31 dans la textbox.
Pouvez-vous m'aider?
Merci à vous ;-)
Version imprimable
Bonjour,
je reçois un ensemble de bytes sur mon port COM. J'aimerais afficher ces bytes en décimal dans une textbox :
si je reçois 1F, qu'il affiche 31 dans la textbox.
Pouvez-vous m'aider?
Merci à vous ;-)
Code:int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Si tu as un tableau de bytes alors j'ai remarqué que ToString te renvoi la valeur décimal.
Code:
1
2
3 byte[] bi = new byte[] {0x1F}; foreach (Byte b in bi) Console.WriteLine(b.ToString());
voila,
j'ai un tableau de bytes, que je sépare par la suite pour les mettre dans une textbox.
J'affiche donc chaque cracatères à l'écran.
longueur_lue = 1.Code:
1
2
3
4
5
6 string Temp_Interieur = msg.Substring(0, longueur_lue); // donnée isolée de la 0 en prenant 1 donnée (1 byte) string Temp_Exterieur = msg.Substring(1, longueur_lue); // donnée isolée de la 1 en prenant 1 donnée (1 byte) string Lum_Interieur = msg.Substring(2, longueur_lue); // donnée isolée de la 2 en prenant 1 donnée (1 byte) string Lum_Exterieur = msg.Substring(3, longueur_lue); // donnée isolée de la 3 en prenant 1 donnée (1 byte) string Valeur_Battery = msg.Substring(4, longueur_lue); // donnée isolée de la 4 en prenant 1 donnée string Valeur_Signal = msg.Substring(5, longueur_lue); // donnée isolée de la 5 en prenant 1 donnée
Donc pour les convertir en valeur décimale, je dois les encoder les bytes reçus sur port com dans un tableau de byte, et pas un tableau de string...c'est ça?
Voila, comment je recevais mes données précédement sur mon port COM:
comment transformer la valeur "value" en byte? Quand je metCode:
1
2
3
4
5
6
7
8
9
10
11 private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { while (serialPort1.BytesToRead > 0 && serialPort1.BytesToRead < 6) { char[] buffer = new char[6]; int bytes_read = serialPort1.Read(buffer, 0, buffer.Length); string value = new string(buffer); safeInput(value); } serialPort1.DiscardInBuffer(); }
on me dit que l'on ne peut convertir un tableau en variable...Code:
1
2 byte value = new byte(buffer);
La méthode Read de la class SerialPort est surchargée, tu peux l'utiliser en lui passant en paramètre un taleau de byte plutôt qu'un tableau de char et éviter une conversion de type
merci....mais....heu....je découvre le c#...aussi
faire comme ceci ne va pas :
tu ferais comment?Code:
1
2
3
4
5
6
7
8
9
10
11 private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { while (serialPort1.BytesToRead > 0 && serialPort1.BytesToRead < 6) { char[] buffer = new char[6]; int bytes_read = serialPort1.Read(buffer, 0, buffer.Length); byte value = new byte(buffer); safeInput(value); } serialPort1.DiscardInBuffer(); }
pige pasCitation:
'byte' does not contain a constructor thats takes 1 arguments
je pensais à changer le type du buffer en utilisant un byte[] plutôt qu'un char[]
Sinon en gardant ton code pour transformer ton char[] en Byte tu peux utiliserCode:
1
2
3
4
5 byte[] buffer = new byte[serialPort1.BytesToRead]; int bytes_read = serialPort1.Read(buffer, 0, serialPort1.BytesToRead); foreach(Byte b in buffer) safeInput(b);
Code:Convert.ToByte(buffer);
salut et merci.
Cependant j'ai encore un souci.
Je m'explique. Dans mon application, je reçois des données regroupées sous forme de 6 bytes.
Mon programme donne ceci :
en montrant ces lignes ci :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { while (serialPort1.BytesToRead > 0 && serialPort1.BytesToRead < 6) { byte[] buffer = new byte[serialPort1.BytesToRead]; int bytes_read = serialPort1.Read(buffer, 0, serialPort1.BytesToRead); foreach (Byte b in buffer) safeInput(b); //char[] buffer = new char[6]; //int bytes_read = serialPort1.Read(buffer, 0, buffer.Length); //byte value = Convert.ToByte(buffer); //safeInput(value); } serialPort1.DiscardInBuffer(); } // insertion des dernières valeur reçues dans la base de données // affichage des dernières valeur reçues dans les textbox et progressbar private void safeInput(byte msg) { textBox1.Invoke(new EventHandler(delegate { //// test d'affichage des données reçues dans latextbox1 //textBox1.SelectedText = string.Empty; //this.textBox1.Text = ""; //textBox1.AppendText(String.Format(msg)); //textBox1.Text = msg.ToString(); int longueur_lue = 1; // on efface ce qu'il y a dans les textbox's 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 des 6 données string new_msg = msg.ToString(); string Temp_Interieur = new_msg.Substring(0, longueur_lue); // donnée isolée de la 0 en prenant 1 donnée (1 byte) string Temp_Exterieur = new_msg.Substring(1, longueur_lue); // donnée isolée de la 1 en prenant 1 donnée (1 byte) string Lum_Interieur = new_msg.Substring(2, longueur_lue); // donnée isolée de la 2 en prenant 1 donnée (1 byte) string Lum_Exterieur = new_msg.Substring(3, longueur_lue); // donnée isolée de la 3 en prenant 1 donnée (1 byte) string Valeur_Battery = new_msg.Substring(4, longueur_lue); // donnée isolée de la 4 en prenant 1 donnée string Valeur_Signal = new_msg.Substring(5, longueur_lue); // donnée isolée de la 5 en prenant 1 donnée //// mise en textbox approprié des valeur inscrite dans le tableau! textBox1.Text = Temp_Interieur.ToString();//tableau_valeur[0]; textBox2.Text = Temp_Exterieur.ToString();//tableau_valeur[1]; textBox3.Text = Lum_Interieur.ToString();// tableau_valeur[2]; textBox4.Text = Lum_Exterieur.ToString();//tableau_valeur[3];
on me dit que :Code:
1
2
3
4
5
6 string Temp_Interieur = new_msg.Substring(0, longueur_lue); // donnée isolée de la 0 en prenant 1 donnée (1 byte) string Temp_Exterieur = new_msg.Substring(1, longueur_lue); // donnée isolée de la 1 en prenant 1 donnée (1 byte) string Lum_Interieur = new_msg.Substring(2, longueur_lue); // donnée isolée de la 2 en prenant 1 donnée (1 byte) string Lum_Exterieur = new_msg.Substring(3, longueur_lue); // donnée isolée de la 3 en prenant 1 donnée (1 byte) string Valeur_Battery = new_msg.Substring(4, longueur_lue); // donnée isolée de la 4 en prenant 1 donnée string Valeur_Signal = new_msg.Substring(5, longueur_lue); // donnée isolée de la 5 en prenant 1 donnée
Citation:
L'index et la longueur doivent faire référence à un emplacement situé dans la chaîne.
Nom du paramètre : length
avant ça marchait bien pourtant.
Bon, c'est vrais qu'avant de mettre new_msg, il y avait simplement msg, soit le tableau passé d'une méthode à l'autre.
Peut-on me direiger svp?
Merci
Ne serait-ce pas que le tableau de bytes que tu reçois ne contient plus que 5 bytes au lieu de 6 pour une raison ou une autre ? 8O
non, j'ai mis
mais c'est vrais qu'il fallait ajouterCode:while (serialPort1.BytesToRead > 0 && serialPort1.BytesToRead < 6)
mais j'ai tjs le même message d'erreur...Code:byte[] buffer = new byte[6];
j'ai testé en m'envoyant (0x35, 0x32, 0x33, x034, 0x35, 0x36) en ne demandant que d'afficher la première valeur (soit 5), et ça affiche 0!
Si je demande d'afficher les deux premières valeurs ça affiche 5 et 2, mais ça plante en indiquant toujours le message d'erreur en spécifiant le message d'erreur à la fin de cette ligne ci :
Code:string Temp_Exterieur = new_msg.Substring(1, longueur_lue);
Citation:
L'index et la longueur doivent faire référence à un emplacement situé dans la chaîne.
Nom du paramètre : length
est-ce ceci qui ne transmet pas bien le tableau?
Code:foreach (Byte b in buffer)
T'as essayé de regarder ce qu'il y a à l'intérieur de ton new_msg après avoir fait :
Parce que pour moi quand tu fais un ToString() sur un tableau de bytes, ça te donne : System.Byte[] et non pas les valeurs contenues dans ton tableau...Code:string new_msg = msg.ToString();
oui, safeInput a besoin d'un tableau de byte puisque tu fais le décodage entièrement sur 6 bytes dedans c'est donc normal que cela plante sur ta deuxième ligne où tu fais appel à substring car ce n'est pas possible d'accèder à l'octet 2 ou 3 d'un byte qui ne devrait faire que 1 octet minimum.
Donc tu as raison il ne faut pas faire un foreach et remplacer par
Puis dans safeInputCode:safeInput(buffer);
Par contreCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 private void safeInput(Byte []msg) { string Temp_Interieur = msg[0].ToString(); string Temp_Exterieur = msg[1].ToString(); string Lum_Interieur = msg[2].ToString(); string Lum_Exterieur = msg[3].ToString(); string Valeur_Battery = msg[4].ToString(); string Valeur_Signal = msg[5].ToString(); Console.WriteLine(Temp_Interieur + ","+Temp_Exterieur+","+Lum_Interieur+","+ Lum_Exterieur+","+Valeur_Battery+","+Valeur_Signal); }
Il y a une erreur x034 ne devrait pas compiler.Citation:
J'ai testé en m'envoyant (0x35, 0x32, 0x33, x034, 0x35, 0x36) en ne demandant que d'afficher la première valeur (soit 5), et ça affiche 0!
Sinon avec ce tableau de byte j'obtiens comme résultat : 53, 50, 51, 52, 53, 54 à l'affichage
je ne comprends pas pourquoi tu dis attendre 5 comme première valeur pour TempInterieur qui est sensé avoir la valeur 0x35 en hexa
Le ToString de msg dans son code s'applique sur le paramètre de safeInput qui est un Byte et non pas un tableau de Byte.
super, merci, ç a a l'aire de fonctionner ;-)
mais j'ai un problème :
voici le code :
J'affiche bien 56 ou 55 dans la textbox 1 mais rien dans les autres....Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 private void safeInput(Byte[] msg) { textBox1.Invoke(new EventHandler(delegate { // // on efface ce qu'il y a dans les textbox's 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 = ""; string Temp_Interieur = msg[0].ToString(); string Temp_Exterieur = msg[1].ToString(); string Lum_Interieur = msg[2].ToString(); string Lum_Exterieur = msg[3].ToString(); string Valeur_Battery = msg[4].ToString(); string Valeur_Signal = msg[5].ToString(); textBox1.Text = Temp_Interieur; textBox2.Text = Temp_Exterieur; textBox3.Text = Lum_Interieur; textBox4.Text = Lum_Exterieur; })); }
Voici mon code du microcontrôleur qui m'envois des données sur pc :
Dites, si je reçois 0xFF, j'afficherai 255?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 void main() { UART1_Init(9600); Delay_ms(1000); UART1_Write(0x38); UART1_Write(0x32); UART1_Write(0x33); UART1_Write(0x34); UART1_Write(0x35); UART1_Write(0x36); Delay_ms(1000); UART1_Write(0x35); UART1_Write(0x36); UART1_Write(0x37); UART1_Write(0x38); UART1_Write(0x39); UART1_Write(0x40); Delay_ms(1000); UART1_Write(0x39); UART1_Write(0x3A); UART1_Write(0x3B); UART1_Write(0x3C); UART1_Write(0x39); UART1_Write(0x3A); }
pouvez-vous m'aider encore un peu?
Merci, vraiment
c'est affiché "0"...et les valeurs dans Temp_Exterieur,Lum_Interieur ,Lum_Exterieur sont nulle...
étonnant...
voila le code entier :
en regardant ce qu'il y avait dans "buffer", j'ai vu que toutes les places du tableau ne sont pas remplies...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { while (serialPort1.BytesToRead > 0 && serialPort1.BytesToRead < 6) { byte[] buffer = new byte[6]; int bytes_read = serialPort1.Read(buffer, 0, serialPort1.BytesToRead); safeInput(buffer); //safeInput(buffer); //char[] buffer = new char[6]; //int bytes_read = serialPort1.Read(buffer, 0, buffer.Length); //byte value = Convert.ToByte(buffer); //safeInput(value); } serialPort1.DiscardInBuffer(); } private void safeInput(Byte[] msg) { textBox1.Invoke(new EventHandler(delegate { // // on efface ce qu'il y a dans les textbox's 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 = ""; string Temp_Interieur = msg[0].ToString(); string Temp_Exterieur = msg[1].ToString(); string Lum_Interieur = msg[2].ToString(); string Lum_Exterieur = msg[3].ToString(); string Valeur_Battery = msg[4].ToString(); string Valeur_Signal = msg[5].ToString(); textBox1.Text = Temp_Interieur; textBox2.Text = Temp_Exterieur; textBox3.Text = Lum_Interieur; textBox4.Text = Lum_Exterieur; })); serialPort1.DiscardInBuffer(); }
Certaines le sont, mais pas toutes.
sinon, je ne vois pas pq les valeurs ne s'affichent pas partout...est-ce dû à ça?
il faut bien récolter les données quelque part avant de les séparées...Code:
1
2 textBox1.Invoke(new EventHandler(delegate {
Je suppose que lorsque l'événement datareceived est enclenché alors il n'y a pas toujours 6 bytes à lire...
Tu peux le contrôler en regardant ce qu'il y a comme valeur dans la variable bytes_read que retourne la méthode Read et tu auras une réponse
Le while aussi n'est peut-être pas bon ne faudrait-il pas écrire plutôt
Code:
1
2
3
4
5
6
7
8
9
10
11
12 const int NbByteToRead = 6 ; if(serialPort1.ByteToread == NbByteToRead) { byte[] buffer = new byte[NbByteToRead]; int bytes_read = serialPort1.Read(buffer, 0, NbByteToRead); if (bytes_read == NbByteToRead) safeInput(buffer); }
Salut,
je te remercie, tu es un gars qui explique bien les choses...à croire que tu enseignes.
Merciiiiiiii