Stuktur in EEPROM schreiben (c)

Gast #1462731
Lesenswert?

Hi da ich mich noch nicht wirklich gut mit C auskenne frag ich hier mal 
in die Runde:

Ich habe eine Funktion "writeEeprom" die folgende Parameter benötigt:
writeEeprom(BYTE blockSelect, UINT16 startAddress, BYTE length, const 
BYTE *pData)

blockset:      gibt hier die Adressierung des entsprechenden EEPROMS an
startAddress: die Adresse wohin die Daten geschrieben werden sollen
length:     wieviele Bytes gelesen werden sollen
*pData:     Byte Pointer auf die zu schreibenden Daten

Die Funktion funktioniert auch super, wenn ich ein Byte Array also
BYTE abc[10]; (Natürlich angelegt also abc[0]=0x01...) wie folgt der 
Funktion übergebe:

writeEeprom(0x07, 0, 0x0A, abc)

Mein Problem ist jetzt allerdings, dass ich eine Struktur habe, die ich 
auf eeprom schreiben muss kurz:
typedef struct _CalData
{
  /* reserve */
  float reserve;

  /* final fit */
  float ff;

  /* white fraction */
  float fraction;
 float bb[3];
}caldata

jetzt möchte ich diesese Stuktur ins eeprom schreiben aber wie??
HILFE!!!
Gast #1462769
Lesenswert?

Die Adresse der Struktur kannst du mit &meineStruktur angeben, also 
anstatt deinem "abc". Du mußt wahrscheinlich den Pointer noch casten, 
damit der Compiler nicht nörgelt, also z.B.: (char *)&meineStruktur.

Und dann schau die mal den sizeof() Operator an.

Danach müßte dir ein Licht aufgehen ;-)

Gruß 900ss
Gast #1462935
Lesenswert?

Lege parallel zu deinem struct ein Bytearray mit dem
Schluesselwort "union" an.

Also so:

typedef union {
  struct {
    unsigned short beispiel;
  } dein_struct;

  unsigned char bytes[2];

} cooler_type;


cooler_type deine_variable;


Olaf

p.s: Ansonsten empfehle ich Kernighan und Ritchie. Nur Googlen macht
doof.
#1462950
Lesenswert?

Olaf schrieb:
> Lege parallel zu deinem struct ein Bytearray mit dem
> Schluesselwort "union" an.

Das ist die blödeste Idee überhaupt.
Wozu soll das gut sein, sich die zusätzliche Bürde aufzuhalsen, die 
Arraygröße auch noch (korrekt (*)) mitzuziehen?


(*) Auf einem AVR ist das kein Thema. Aber auf einem PC gilt nicht 
notwendigerweise, dass die sizeof der kompletten Struktur gleich ist der 
Summe der sizeof der Komponenten.
Gast #1463516
Lesenswert?

Vielen Dank auf jeden Fall mal!

Jetzt steht auch was in meinem EEPROM! Ich versuch jetzt mal die Daten 
wieder auszulesen und wieder in die Struktur zu pressen (um zu testen ob 
auch alles richtig übertragen wurde). Falls ich wieder Probleme hab, 
werd ich mich wieder melden!

Wie gesagt: VIELEN DANK!!!
Gast #1463576
Lesenswert?

Also ich habs mal hinbekommen!
Zwar bisher noch recht umständlich aber es klappt :-)

CalData oneDummyData = theDummyData[5]; /*theDummyData wurde vorher 
beschrieben*/
writeEeprom(EEPROM_LM, 10, (BYTE)72,(BYTE *)&oneDummyData);
delayMs(20);

readEeprom(EEPROM_LM, 10, (BYTE)72); /*Lesen von 72 Bytes an der Adresse 
10 im EEprom*/
delayMs(20);


IICBUFFERTYPE theBufferType = *pIicRxBuffer; /*RX Pointer auf 
theBufferType */
CalData oneDummyDataRead;
oneDummyDataRead = *(CalData*)(theBufferType.Data); /*SChreiben der 
Daten mit entsprechendem TypeCasting*/

Toll!
Gast #1463702
Lesenswert?

Leider ist meine Struktur 494 Byte groß und die Funktion 
write/readEEprom lässt nur eine maximale (Byte) Leselänge von einem Byte 
also 255 Werten zu. Folglich muss ich evtl. die Struktur später mal 
teilen. Bisher hab ich aber das Glück, dass ich momentan von der 
Struktur nur 72 Byte brauche.

Trotzdem Danke!
Gast #1465410
Lesenswert?

> Wozu soll das gut sein, sich die zusätzliche Bürde aufzuhalsen, die
> Arraygröße auch noch (korrekt (*)) mitzuziehen?

Also ich moechte immer genau wissen wie gross meine Arrays sind.
Sei es weil ich gerne VORHER wuesste wieviel Platz sie noch im
EEPROM einnehmen, oder auch damit ich weiss was ueber eine Schnittstelle
geht.

Olaf
#1467454
Lesenswert?

Die Idee, da mittels union ein Array parallel zu legen, ist schon 
unsinng. Niemand braucht dieses Array im gegenständlichen Fall. Wenn du 
wissen willst, wieviele Bytes über die Leitung gehen, dann wende sizeof 
auf die Struktur an und ansonsten caste einfach die Startadresse des 
Strukturobjektes zurecht. Kein Mensch braucht hier eine union

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren