mcGeorge:
Ich möchte einen Float-Wert in einem Eeprom speichern. Der Eeprom arbeitet ja Byte-Orientiert
Also byteweise und nicht wie im Thema angegeben bitweise.
mcGeorge:
und der Float-Wert ist (lt. Doku) ja 4 Byte groß.
Wenn Du unsicher bist oder Du es dem Compiler überlassen möchtest, die genaue Datengröße festzustellen, kann Du es mit "sizeof" genau feststellen.
mcGeorge:
Wie kann ich unter C eine Float-Variabel direkt (also die 4 Byte) auslesen und schreiben, damit ich die Werte in ein Eeprom schreiben kann oder aus dem Eeprom wieder herstellen kann?
Da gibt es verschiedene Möglichkeiten. Ich deklariere mir für einen solchen Fall einen Byte-Pointer auf die Float-Variable.
Deklaration:
float myFloatVar;
byte* wert = (byte*) &myFloatVar;
Nun kann ich mit wert[0], wert[1], wert[2], wert[3] auf die einzelnen Bytes zugreifen.
Ich habe mal einen Beispiel-Sketch gemacht, in dem diese Technik genutzt wird und die beiden Funktionen EEPromSave und EEPromLoad dabei so allgemein gehalten, dass man diese Funktionen auch in richtigen Sketches zum Speichern in und Laden aus dem EEPROM verwenden kann.
#include <EEPROM.h>
void EEPromSave(byte* wert, int numbytes, int eprom_offset)
{
// input:
// wert: pointer to byte array which holds the value to save
// numbytes: number of bytes to be saved
// eprom_offset: offset in EEPROM for saving bytes
// output: void (nothing)
for (int i=0;i<numbytes;i++)
EEPROM.write(eprom_offset+i, wert[i]);
}
void EEPromLoad(byte* wert, int numbytes, int eprom_offset)
{
// input:
// wert: pointer to byte array which takes the loaded value
// numbytes: number of bytes to be loaded
// eprom_offset: offset in EEPROM for loading bytes
// output: void (nothing)
for (int i=0;i<numbytes;i++)
wert[i] = EEPROM.read(eprom_offset+i);
}
#define FLOATSAVEOFFSET 100
void setup()
{
float myFloatVar;
byte* myFloatVarBytes = (byte*) &myFloatVar;
Serial.begin(9600);
myFloatVar=47,11;
Serial.print("myFloatVar anfangs: ");Serial.println(myFloatVar);
EEPromSave(myFloatVarBytes, sizeof(myFloatVar), FLOATSAVEOFFSET);
myFloatVar=0;
Serial.print("myFloatVar anderer Wert: ");Serial.println(myFloatVar);
EEPromLoad(myFloatVarBytes, sizeof(myFloatVar), FLOATSAVEOFFSET);
Serial.print("myFloatVar aus EEPROM: ");Serial.println(myFloatVar);
}
void loop()
{
}
Achtung: Das EEPROM ist nicht beliebig oft beschreibbar!
Also am besten die Zeile mit dem Aufruf von EEPromSave auskommentieren, wenn sie nicht tatsächlich benötigt wird. Lesen aus dem EEPROM kann und darf man beliebig oft.