Forum: Compiler & IDEs Stuktur in EEPROM schreiben (c)


von Sebastian.O (Gast)


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!!!

von Gast (Gast)


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

von Olaf (Gast)


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.

von Karl H. (kbuchegg)


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.

von Sebastian.O (Gast)


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!!!

von Sebastian.O (Gast)


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!

von andi r (Gast)


Lesenswert?

ich würde noch das "(BYTE)72" durch "sizeof(calData)" ersetzen, dann 
klappt das ganze auch noch wenn sich dein struct ändert

von Sebastian.O (Gast)


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!

von Olaf (Gast)


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

von Karl H. (kbuchegg)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.