Stuktur in EEPROM schreiben (c)

Gast #1462731
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
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
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.
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
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
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
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
> 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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.