Récupérer les octets d'1 int [Résolu]

Signaler
Messages postés
127
Date d'inscription
lundi 11 octobre 2004
Statut
Membre
Dernière intervention
18 mai 2016
-
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
-
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

Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
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)
Messages postés
127
Date d'inscription
lundi 11 octobre 2004
Statut
Membre
Dernière intervention
18 mai 2016

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.
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137 >
Messages postés
127
Date d'inscription
lundi 11 octobre 2004
Statut
Membre
Dernière intervention
18 mai 2016

De rien !
Messages postés
127
Date d'inscription
lundi 11 octobre 2004
Statut
Membre
Dernière intervention
18 mai 2016

Bonjour et merci vb95

J'essaie ça de suite, et je te tiens au courant.