Enregister un "char" négatif dans la EEPROM

Bonjour,

Après avoir fait le tour, je ne vois toujours pas comment faire pour enregistrer et lire un "char" négatif dans la ROM.
J'ai choisi un char pour sa longueur, 1 octet et donc entre -128 et 127. La sauvegarde se passe bien mais la lecture, j'ai n'importe quoi. J'ai l'impression qu'on ne peut enregistrer que des valeurs positives comprises entre 0 et 255 dans la mesure où quand je lis -1 il me donne 255.
Il y aurait-il une solution ?
Je vous remercie.

Moi, :wink:

Bonjour,

Un char et un byte sont stockés exactement de la même façon.
La différence apparaît seulement lors de l'affichage.

Tu peux regarder l'encadré "char et byte" vers le bas de cette page

C'est le type de la variable dans laquelle tu vas placer l'octet après lecture dans l'EEPROM qui va modifier la façon d'interpréter la valeur.
Si l'octet est mis dans un char et que tu fais un print de la variable le résultat sera présenté entre -128 et +127
Si l'octet est mis dans un unsigned char ou un byte et que tu fais un print de la variable le résultat sera présenté entre 0 et 255

Il en va de même des opérations que tu pourrais effectuer sur ces variables.

fdufnews:
C'est le type de la variable dans laquelle tu vas placer l'octet après lecture dans l'EEPROM qui va modifier la façon d'interpréter la valeur.
Si l'octet est mis dans un char et que tu fais un print de la variable le résultat sera présenté entre -128 et +127
Si l'octet est mis dans un unsigned char ou un byte et que tu fais un print de la variable le résultat sera présenté entre 0 et 255

Il en va de même des opérations que tu pourrais effectuer sur ces variables.

Merci pour cette précision.
J'ai essayé de changer le type de ma variable contenant la valeur lue, en prenant par exemple un int mais j'ai toujours le même résultat.

boolean cnt = 0;
char ETAT=-1;

void loop()
{
 
if(!cnt){
  EEPROM.write(7,ETAT);
  Serial.print("valeur sauvee");
  Serial.println(ETAT);
  cnt=1;
}
int lu = EEPROM.read(7);
Serial.print("valeur lue  ");
Serial.println(lu);
}

J'ai 255 au lieu de -1.

J'ai essayé avec plusieurs types mais ça ne marche pas vraiment.

Merci

Jusque là, on parlait de variables sur 8 bits.
Un int est sur 16 bits si tu lui affectes un byte tel que retourné par EEPROM.read() tu places une variable non signée dans un int et donc il n'y a pas d'extension du signe.

boolean cnt = 0;
char ETAT=-1;

void loop()
{
 
if(!cnt){
  EEPROM.write(7,ETAT);
  Serial.print("valeur sauvee");
  Serial.println(ETAT);
  cnt=1;
}
char lu = EEPROM.read(7);
Serial.print("valeur lue  et mise dans un char");
Serial.println(lu);
int lu2 = (char)EEPROM.read(7);
Serial.print("valeur lue  et mise dans un int");
Serial.println(lu2);
}

Merci ça a l'air de correspondre à ce que je souhaite.
Par contre je trouve dommage de devoir passer par un "int" pour stocker juste "-1" alors que je voulais à la base passer par un simple char pour justement utiliser qu'un octet.
Ou c'est peut-être l'affichage qui me trompe et qui me fait croire que ce n'est pas "-1" alors que ça l'est dans la mesure où "Serial.print( type char)" affiche un caractère.
Merci en tout cas, je vais me contenter de ça ^^

Pas la peine de passer par un int, un char suffit.

Il ne faut pas mélanger la valeur numérique placée dans la variable et sa représentation

Lorsque tu demandes l'affichage d'une variable char, par défaut print affiche le caractère correspondant.
Si tu veux afficher la valeur numérique d'un char, il faut préciser DEC

char toto=65;
Serial.print(toto); // Affiche A, le caratère correspondant au code ASCII 65
Serial.print(toto,DEC); //Affiche 65, la repéresentation décimale
Serial.print(TOTO,HEX); // Affiche 41, la repéresentation hexadécimale

fdufnews:
Pas la peine de passer par un int, un char suffit.

Il ne faut pas mélanger la valeur numérique placée dans la variable et sa représentation

Lorsque tu demandes l'affichage d'une variable char, par défaut print affiche le caractère correspondant.
Si tu veux afficher la valeur numérique d'un char, il faut préciser DEC

char toto=65;

Serial.print(toto); // Affiche A, le caratère correspondant au code ASCII 65
Serial.print(toto,DEC); //Affiche 65, la repéresentation décimale
Serial.print(TOTO,HEX); // Affiche 41, la repéresentation hexadécimale

C'est ça qui me manquait, merci :slight_smile:

Bonjour,
La doc Arduino n'est pas trop mal, il suffit de la consulter :wink:
print() et println()