lecture d'une chaîne serial

Bonjour à tous,

Je suis débutant (vus les résultats auxquels j'arrive :frowning: ).
Je travaille pour l'instant avec des modules XBee XB24C.
J'en utilise un configuré en routeur AT pour émettre des données ADC issues d'un capteur de température analogique TMP36GZ.
Le deuxième est configuré en coordinateur API et reçoit les données émises. Reste à les interpréter...
Le XBee récepteur est connecté à un ArduinoUno avec un Software.Serial sur les broches 2 et 3.
Le message envoyé par le XBee émetteur commence toujours par 0x7E.
Je le lis avec les sketch suivant :

#include<SoftwareSerial.h>
SoftwareSerial XBee(2,3);
byte donnees[29];
int i=0;
void setup() {
  Serial.begin(9600);
  XBee.begin(9600);

}

void loop() {
  
  if(XBee.available()>29)
  { 
    for(int i=0;i<28;i++)
    {
    //donnees[i] = (XBee.read(),HEX);
     
      {
      Serial.print(XBee.read(),HEX);
    
   //  Serial.print(donnees[i],HEX);
      Serial.print(",");
    }
    }
    
    Serial.println();
 
  }
  
}

Résultat du serial.print :

7E,0,18,91,0,13,A2,0,41,76,8E,76,C,35,E8,E8,0,92,C1,5,1,1,0,0,8,2,7E,B,

Jusqu'ici tout va bien

Il s'agit maintenant d'isoler le ou les bytes qui m'intéressent... J'ai essayé d'utiliser un tableau

#include<SoftwareSerial.h>
SoftwareSerial XBee(2,3);
byte donnees[29];
int i=0;
void setup() {
  Serial.begin(9600);
  XBee.begin(9600);

}

void loop() {
  
  if(XBee.available()>29)
  { 
    for(int i=0;i<28;i++)
    {
    donnees[i] = (XBee.read(),HEX);
     
      {
      //Serial.print(XBee.read(),HEX);
    
   Serial.print(donnees[i],HEX);
      Serial.print(",");
    }
    }
    
    Serial.println();
 
  }
 
}

Et cela me donne

10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,

Et je ne comprends pas pourquoi :frowning: :frowning:

Pouvez-vous m'aider ?

Grand merci d'avance

Bonjour

Perso je n'ai aucune idée du résultat produit par cette ligne     donnees[i] = (XBee.read(),HEX);Je suis même surpris que cela compile.

bricoleau:
Perso je n'ai aucune idée du résultat produit par cette ligne

   donnees[i] = (XBee.read(),HEX);

Je suis même surpris que cela compile.

Bonjour,

Xbee.read() est évalué puis HEX (qui est une constante) est évalué, puis HEX est rangé dans donnees[i].
C'est équivalent à

   XBee.read();
   donnees[i] = HEX;

J'ai dit que j'étais débutant.
Je suis aussi honteux maintenant...
Donc débutant honteux...
J'ai corrigé en

#include<SoftwareSerial.h>
SoftwareSerial XBee(2,3);
byte donnees[29];
int i=0;
void setup() {
  Serial.begin(9600);
  XBee.begin(9600);

}

void loop() {
  
  if(XBee.available()>29)
  { 
    for(int i=0;i<28;i++)
    {
    donnees[i] = XBee.read();     
      {
      
    
   Serial.print(donnees[i],HEX);
      Serial.print(",");
    }
    }
        Serial.println("   "); 
  }
 Serial.print(donnees[6],HEX);
 Serial.print("  ");
 delay(1000);
 for(int k=0;k>28;k++) donnees[k] = 0;
}

Avec l'idée de lire la position [6] de mon tableau.
Cela marche mais donne

A2  A2  A2  A2  A2  7E,0,18,91,0,13,A2,0,41,76,8E,76,C,35,E8,E8,0,92,C1,5,1,1,0,0,8,2,80,9

pour une chaîne qui vaut

7E,0,18,91,0,13,A2,0,41,76,8E,76,C,35,E8,E8,0,92,C1,5,1,1,0,0,8,2,80,9,

Pourquoi la valeur correcte (!) de A2 apparaît-elle 5 fois ?

Merci de m'avoir répondu si vite. J'y ai passé (bêtement) beaucoup de temps..

donnees[6] apparait plusieurs fois car il est à l'extérieur du if, donc est affiché même si tu ne reçois rien.
De plus le test pour la remise à 0 du buffer est inversé. Je suppose que tu as voulu faire:
for(int k=0;k<28;k++) donnees[k] = 0;

Merci Kamill :slight_smile:

Le > à la place du < : une de mes innombrables fautes de frappe..
Le plus préoccupant est que cela marchait...

Pour le "Serial.print(donnees[26],HEX);"

J'avais mis une pause de 1000 pour permettre l'affichage. J'avais oublié que le XBee émetteur était réglé avec une durée de 5000 entre les mesures.....

Mon code corrigé devient

#include<SoftwareSerial.h>
SoftwareSerial XBee(2,3);
byte donnees[29];
int i=0;
void setup() {
  Serial.begin(9600);
  XBee.begin(9600);

}

void loop() {
  
  if(XBee.available()>29)
  { 
    for(int i=0;i<28;i++)
    {
    donnees[i] = XBee.read(); 
   Serial.print(donnees[i],HEX);
    
      Serial.print(",");       
      
    }
        Serial.println("   "); 
  }
Serial.print(donnees[26],HEX);
Serial.print("  ");
 delay(5000);
 for(int k=0;k<28;k++) donnees[k] = 0;
}

C'est simple il suffisait d'y penser comme disait l'autre...
Grand merci pour votre aide efficace.