Récupérer les octets d'1 int

Résolu
PWM63 Messages postés 127 Date d'inscription lundi 11 octobre 2004 Statut Membre Dernière intervention 18 mai 2016 - Modifié par PWM63 le 29/02/2016 à 12:08
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 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 :
byte octet1 = (byte)(val / 256);
byte octet2 = (byte)(val - octet1 * 256);

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;
}


Merci d'avance pour votre aide.

Stéphane

2 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
29 févr. 2016 à 13:04
bonjour
Au lieu d'utiliser
this.serialPort1.Write(s)
avec une chaine de caractères tu ferais mieux d'utiliser la méthode Write avec un buffer de bytes ( tableau de bytes)
1
PWM63 Messages postés 127 Date d'inscription lundi 11 octobre 2004 Statut Membre Dernière intervention 18 mai 2016
29 févr. 2016 à 16:08
Cela fonctionne maintenant correctement, merci vb95.

            ushort val = (ushort)this.numericUpDown_seuil.Value;
            byte[] octets = new byte[3];
            octets[0] = (byte)'B';
            octets[1] = (byte)(val / 256);
            octets[2] = (byte)(val - octets[1] * 256);

            this.serialPort1.Write(octets,0,3);


Je mets le topic en Résolu.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > PWM63 Messages postés 127 Date d'inscription lundi 11 octobre 2004 Statut Membre Dernière intervention 18 mai 2016
29 févr. 2016 à 16:20
De rien !
0
PWM63 Messages postés 127 Date d'inscription lundi 11 octobre 2004 Statut Membre Dernière intervention 18 mai 2016
29 févr. 2016 à 13:14
Bonjour et merci vb95

J'essaie ça de suite, et je te tiens au courant.
0
Rejoignez-nous