www.mikrocontroller.net

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


Autor: Sebastian.O (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian.O (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Sebastian.O (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: andi r (Gast)
Datum:

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

Autor: Sebastian.O (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.