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!!!
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
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.
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!!!
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!
ich würde noch das "(BYTE)72" durch "sizeof(calData)" ersetzen, dann klappt das ganze auch noch wenn sich dein struct ändert
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!
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.