Puis copier un uint8_t dans un uint8_t pour le sauver dans un char

Bonjour à tous,

Je sauve dans un eeprom une chaine de caractère comme celle-ci

{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x83, 0xBA, 0x6C, 0x6C, 0xCD, 0xFA, 0xA5, 0x65, 0x9D, 0x2E }

Puis l'extrait et je dois retrouver celle valeur dans un char. Ce char soit m'acchiser

char monChar[100];
Serial.println(monChart);

{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x83, 0xBA, 0x6C, 0x6C, 0xCD, 0xFA, 0xA5, 0x65, 0x9D, 0x2E }

Voici le code:
Au debut, je crée un pointer et le lui attribue la premiere valeur : {
Ensuite dans le for, j'ajoute 0x et la valeur venant de mon eeprom,
je déplace mon pointer, j'ajoute une virgule, je déplace mon pointer et je recommance pour le prochain chiffre. A la fin je termine un }

J'affiche la valeur finale

Serial.print(F("Qu'es-ce que ca donne?"));
Serial.println((char*)buf);

sauf que je devrait encore sauver buf dans

monChar[100];
Serial.print(monChart);
uint8_t buf[100];
              memset(buf,'\0',100);
              uint8_t * ptr = buf;
              
              *ptr = '{';
              ptr += strlen((char *) ptr);

for (int entry = 0; entry < 16; entry++)
              {
                uint8_t data = _readEEPROM(EEPROM_ADDR, _eeprom.nwkskeypage, entry);
                 
                _config_radio.nwkskey[entry]=data;  // Ceci fonctionne


                *ptr = '0x';
                ptr += strlen((char *) ptr);
                *ptr = data;
                ptr += strlen((char *) ptr);
                if (i < 16){
                  *ptr = ',';
                  ptr += strlen((char *) ptr);
                }


              }
ptr += strlen((char *) ptr); 
    
              Serial.print(F("Qu'es-ce que ca donne?"));
              Serial.println((char*)buf);

le problème est que buf m'affiche

{x⸮,x,x⸮,x⸮,xz,x⸮,x⸮,x⸮,xl,xl,x⸮,x⸮,x⸮,xe,x⸮,x.,}

je me demande bien si je peux simplement copier un uint8_t dans un uint8_t aussi simplement

*ptr = data;

Comment puis corriger mon problème ou alors comment sauver mes valeurs extraites dans

char monChar[100];

Merciiii

il ne crie pas le compilo quand vous écrivez

  *ptr = '0x';

si vous connaissez la taille de la cString (votre buffer que vous avez écrit en EEPROM) pourquoi ne pas le relire d'un coup dans le tableau depuis l'EEPROM?

si vous ne connaissez pas la taille, vous lisez octet par octet jusque au caractère nul de la fin

#include <EEPROM.h>

const char message[] = "{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x83, 0xBA, 0x6C, 0x6C, 0xCD, 0xFA, 0xA5, 0x65, 0x9D, 0x2E }";
const uint16_t adresseDebut = 0;

void setup() {
  Serial.begin(115200);
  // on écrit notre message dans l'EEPROM d'un coup
  EEPROM.put(adresseDebut, message); // va metter tout le message en EEPROM y compris le \0 de fin puisque sizeof() va en tenir compte

  // si on ne connait pas la longueur, on peut lire octet par octet jusqu'à trouver le '\0'
  char lu;
  uint16_t adresse = adresseDebut;
  while ((lu = EEPROM.read(adresse)) != '\0') {
    Serial.print(lu);
    adresse++;
  }
  Serial.println();
}

void loop() {}

Ou alors en sauvant dans un tableau si vous voulez jouer avec les données

#include <EEPROM.h>
const char message[] = "{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x83, 0xBA, 0x6C, 0x6C, 0xCD, 0xFA, 0xA5, 0x65, 0x9D, 0x2E }";
const uint16_t adresseDebut = 0;

void setup() {
 Serial.begin(115200);
 // on écrit notre message dans l'EEPROM d'un coup
 EEPROM.put(adresseDebut, message); // va mettre tout le message en EEPROM y compris le \0 de fin puisque sizeof() va en tenir compte

 // si on ne connait pas la longueur, on peut lire octet par octet jusqu'à trouver le '\0'
 char lu;
 uint16_t adresse = adresseDebut;

 const uint8_t tailleTableau = 200;
 char tableau[tailleTableau + 1]; // plein de place + 1 pour le caractère nul éventuellement
 uint8_t indice = 0;

 Serial.print(F("Je lis :\t"));
 while ((lu = EEPROM.read(adresse++)) != '\0') {
   if (indice < tailleTableau) tableau[indice++] = lu;
   else Serial.println(F("TROP LONG !!"));
   Serial.print(lu);
 }
 Serial.println();
 tableau[indice] = '\0';
 Serial.print(F("J'ai lu :\t"));
 Serial.println(tableau);
}

void loop() {}

et si vous voulez analyser le contenu du tableau résultant de la lecture vous pouvez utiliser avantageusement la fonction strtol() qui sait décoder votre hexadécimal directement

char tableau[] = "{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x83, 0xBA, 0x6C, 0x6C, 0xCD, 0xFA, 0xA5, 0x65, 0x9D, 0x2E }";

void setup() {
  Serial.begin(115200);
  
  Serial.print(F("Analyse de")); Serial.println(tableau);
  
  char * debut = strchr(tableau, '{'); // http://www.cplusplus.com/reference/cstring/strchr/?kw=strchr
  if (debut != NULL) {
    char* token = strtok(debut + 1, ","); // on saute l'accolade ouvrante
    while (token != NULL) {
      uint8_t v = strtol (token, NULL, 16); // http://www.cplusplus.com/reference/cstdlib/strtol/
      Serial.print(F("Valeur = 0x")); Serial.print(v, HEX);
      Serial.print(F(", soit en base 10 --> ")); Serial.println(v);
      token = strtok(NULL, ",");
    }
  }
}

void loop() {}

mais bon, si la valeur 0 n'est pas une valeur acceptable dans vos données, vous pourriez aussi sauver directement les valeurs binaires en EEPROM au lieu de l'ASCII.. ce serait plus simple à l'écriture et la lecture...

Bonjour,

D'après toi qu'est ce que c'est sensé afficher?
Ce ne sont ni des caractères ascii ni même des caractères utf8.

Si tu veux les afficher, il faut faire une boucle et les afficher en hexa.