Pages: [1]   Go Down
Author Topic: [Resolu] EEPROM et union "libre" ...  (Read 639 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 39
Ardui-Novice
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous.

Grace à vos nombreux conseils avisés, mon projet avance toujours. Mon objectif était de pouvoir sauvegarder la valeur ( float ) de déclenchement de certaines alarmes dans une EEPROM. Aucun souci pour lire ou écrire un octet, mais comment faire pour sauvegarder des floats - ou autres - La solution de multiplier le float par 10x, récupérer chaque digit et les savegarder les uns apres les autres ne me satisfaisait pas, mais alors pas du tout. Je me suis tourné vers l'utilisation des pointeurs, je suis certain que ce doit être possible de les utiliser dans un cas comme le mien mais je n'ai pas reussi.

 Edit : "maintenant ça y est !

Je séchais jusqu'à ce que je découvre - en fouillant vraiment -union. Voiçi le code tel qu'il est au moment ou je laisse ces lignes.

Code:
void setup() {
  Serial.begin(9600);  
}

void loop() {

  union u_tag {
    byte b[4];
    float valeur;
  }
  u;

  u.valeur = 123.456;

  for (int i = 0; i < sizeof(u.valeur); i++){
    Serial.print(i);
    Serial.print(" ");
    Serial.println(u.b[i], BIN);
  }
  Serial.println("");
  
  // ces valeurs sont celles affichées par le moniteur série
  u.b[0] = 121;
  u.b[1] = 233;
  u.b[2] = 246;
  u.b[3] = 66;  

  Serial.println(u.valeur,3);
  
  delay(1000);
}

C'est formidable. Ca fonctionne, le moniteur serie m'affiche :

Quote
0 1111001
1 11101001
2 11110110
3 1000010

123.456

Je souhaiterai pouvoir "automatiser" ce traitement.

Une de mes nombreuses question est la suivante. Existe t-il en language Arduinesque lune fonction TypeOf ou GetType, une fonction qui me permettrai de connaitre le type d'une variable - int, long, float, objet ou autre - ?

Merci bien à tout ceux qui m'ont deja aidé et un grand merci à la communauté  smiley

Un Ardui-Novice




« Last Edit: February 06, 2013, 09:35:17 am by ludobabs » Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Ta méthode dépend de l'architecture sur laquelle tu travailles. Rien ne te dit qu'un float fait vraiment 4 octets smiley-wink
Si tu veut "voir" un type float, int, ... comme un tableau d'octets il te fait passer par un cast d'adresse.

Une de mes nombreuses question est la suivante. Existe t-il en language Arduinesque lune fonction TypeOf ou GetType, une fonction qui me permettrai de connaitre le type d'une variable - int, long, float, objet ou autre - ?
Arduino = C++, ni plus ni moins, le logiciel Arduino n'est rien d'autre qu'une surcouche par dessus des fonctions C et C++ classique.
En C++ tu peut connaitre le type d'un objet (et uniquement d'un objet = instance de classe) avec la technique RTTI :
http://fr.wikipedia.org/wiki/Run-time_type_information
(include : <typeinfo>, fonction : typeid())
Mais c'est une très mauvaise façon de programmer, encore plus sur un microcontrôleur (je suis même pas sûr que avr-g++ implémente cette fonctionnalité)

Dans ton cas ce que tu cherches à faire c'est :
Code:
float valeur = 13.37;
byte* ptr = (byte*) &valeur;

Serial.println(ptr[0]);
Serial.println(ptr[1]);
Serial.println(ptr[2]);
Serial.println(ptr[3]);
(le cast d'adresse marche avec n'importe quel type)

Et de manière plus générique :
Code:
monType valeur = xxxxx;
byte* ptr = (byte*) &valeur;

for (byte i = 0; i < sizeof(valeur); ++i)
  Serial.println(ptr[i]);
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 39
Ardui-Novice
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Quote
Rien ne te dit qu'un float fait vraiment 4 octets

Mince alors, ça ce n'est pas forcément une bonne nouvelle. Mais peu importe puisque je n'ai plus d'union à faire et donc plus besoin de connaitre la taille occupée par la variable que je souhaite sauvegarder.

C'est génial. Merci bien  smiley-lol

Du coup voiçi le code modifié. Il fait la "même" chose que le premier que je vous ai soumis, mais en plus simple et en plus "universel"

Code:
void setup() {
  Serial.begin(9600); 
}

void loop() {

  float test = 123.456;
  byte* ptr = (byte*) &test;

  for (byte i = 0; i < sizeof(test); ++i) {
    Serial.println(ptr[i],BIN);
  }

  ptr[0] = 121;
  ptr[1] = 233;
  ptr[2] = 246;
  ptr[3] = 66;

  Serial.println(test,3);

  delay(10000);

}



le moniteur serie m'affichant :

Quote
1111001
11101001
11110110
1000010
123.456

Un obstacle de "passé", vivement le prochain.....

Logged

Pages: [1]   Go Up
Jump to: