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

PWM63 127 Messages postés lundi 11 octobre 2004Date d'inscription 18 mai 2016 Dernière intervention - 29 févr. 2016 à 11:16 - Dernière réponse : vb95 1419 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 14 janvier 2018 Dernière intervention
- 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
Afficher la suite 

4 réponses

Répondre au sujet
vb95 1419 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 14 janvier 2018 Dernière intervention - 29 févr. 2016 à 13:04
+1
Utile
2
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)
Cette réponse vous a-t-elle aidé ?  
PWM63 127 Messages postés lundi 11 octobre 2004Date d'inscription 18 mai 2016 Dernière intervention - 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.
vb95 1419 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 14 janvier 2018 Dernière intervention > PWM63 127 Messages postés lundi 11 octobre 2004Date d'inscription 18 mai 2016 Dernière intervention - 29 févr. 2016 à 16:20
De rien !
Commenter la réponse de vb95
PWM63 127 Messages postés lundi 11 octobre 2004Date d'inscription 18 mai 2016 Dernière intervention - 29 févr. 2016 à 13:14
0
Utile
Bonjour et merci vb95

J'essaie ça de suite, et je te tiens au courant.
Commenter la réponse de PWM63

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.