PWM63
Messages postés127Date d'inscriptionlundi 11 octobre 2004StatutMembreDernière intervention18 mai 2016
-
Modifié par PWM63 le 29/02/2016 à 12:08
vb95
Messages postés3510Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention15 septembre 2024
-
29 févr. 2016 à 16:20
Bonjour,
Je cherche à récupérer en C# les octets d'1 entier pour les ajouter dans 1 chaîne de caractères.
Je récupère tout d'abord mon entier à partir d'1 numericUpDown compris entre 0 et 1023.
int val = (int) this.numericUpDown_valeur.Value;
J'ai essayé de récupérer ainsi les 2 octets qui compose cet entier :
Pour les ajouter ainsi dans 1 chaîne de caractères :
string s = "A";
s += (char)octet1;
s += (char)octet2;
Le but étant d'envoyer cette chaîne par le port série :
this.serialPort1.Write(s);
Le problème est que si mon entier est compris par exemple entre 128 et 255, je ne récupère pas (dans 1 autre programme qui lit le port série) la bonne valeur.
Et ce problème semble bien se situer dans l'envoi de la chaîne et non dans sa réception (dans l'autre programme).
En effet, si j'essaie de relire les octets de ma chaîne pour récupérer de nouveau mon entier, j'ai le même problème :
byte[] debug_octets = Encoding.ASCII.GetBytes(s);
int debug_val = debug_octets[1] * 256 + debug_octets[2];
if (val==debug_val)
{
this.textBox_debug_val.Text="val ok";
}
else
{
this.textBox_debug_val.Text = "debug val = " + debug_val;
}
Juste pour info, je récupère la donnée du port série dans l'autre programme en C (pas C#) ainsi :
byte octet;
int valeur ;
//...
if (Serial.available() > 0)
{
octet= Serial.read();
code = char(octet);
switch (code)
{
case 'A':
//Valeur (0 à 1023 sur 2 octets)
if (Serial.available() > 1)
{
octet= Serial.read();
valeur = octet* 256;
octet= Serial.read();
valeur += octet;
// ici, la valeur récupérée n'est pas la bonne quand l'entier est censé être compris par exemple entre 128 et 255.
//traitements suite
}
break;
//traitements autres case
}
}
J'ai essayé de triturer mon code dans tous les sens pour essayer de récupérer systématiquement la bonne valeur attendue (ex : récupérer 200 et non 63 si j'ai 200 dans numericupdown), mais sans succès.
Par exemple, ce code C# a exactement le même problème :
short val = (short)this.numericUpDown_val.Value;
byte[] octets = BitConverter.GetBytes(val);
Array.Reverse(octets);
byte[] result = octets;
string s = "A";
s += System.Text.Encoding.ASCII.GetString(result);
this.serialPort1.Write(s);
byte[] debug_octets = Encoding.ASCII.GetBytes(s);
int debug_val = debug_octets[1] * 256 + debug_octets[2];
if (val==debug_val)
{
this.textBox_debug_val.Text="val ok";
}
else
{
this.textBox_debug_val.Text = "debug val = " + debug_val;
}
29 févr. 2016 à 16:08
Je mets le topic en Résolu.
29 févr. 2016 à 16:20