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 ;-)
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 : Sélectionner tout - Visualiser dans une fenêtre à part int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Retrouvez moi sur :
Mon Espace Developpez.com-------------------------------
Dvp.NET, une librairie open-source de composants .NET
Mon blog: Up there in the code----------------------------
Twitter: NatMarchand
Ma société: So@t
Showrizo : Suivez votre planning de séries télé sous Windows 8
Si tu as un tableau de bytes alors j'ai remarqué que ToString te renvoi la valeur décimal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 met
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 pas'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 utiliser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 ?![]()
non, j'ai mis
mais c'est vrais qu'il fallait ajouter
Code : Sélectionner tout - Visualiser dans une fenêtre à part while (serialPort1.BytesToRead > 0 && serialPort1.BytesToRead < 6)
mais j'ai tjs le même message d'erreur...
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part string Temp_Exterieur = new_msg.Substring(1, longueur_lue);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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 safeInput
Code : Sélectionner tout - Visualiser dans une fenêtre à part safeInput(buffer);
Par contre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager