www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Struct abspeichern


Autor: Danni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend !

Ich habe ein kleines Problem, und zwar habe ich eine Struktur die aus
diversen Bitfeldern und einem long int besteht und die 8 Byte lange ist
(sizeof). Wie kann ich auf die 8 einzelnen Bytes zugreifen?
Hatte mir überlegt nen Zeiger auf den Anfang der Struktur zu legen und
immer das vom Zeiger addressierte Byte abzuspeichern. Das drauffolgende
Byte  mittels zeiger+sizeof(unsigned char) genauso adressieren.
Geht sowas?
Kann mir jemand da mal mit nem C Codefragment helfen?

Danke

Danni

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Danni,

ich habe einmal kurz ein Codefragment geschrieben. Hoffe, dass keine
Fehler enthalten sind.
Prinzipiell kannst Du aber auch eine Union verwenden.

struct
{
  unsigned int Bit0   : 1;
  unsigned int Bit1_5 : 4;
  long LongVariable;
} Variable;

unsigned char* PointerToLong;

// Pointer auf Long Variable setzen
PointerToLong = &Variable.LongVariable;

// Zugriff auf die einzelnen Elemente
Byte0 = PointerToLong[0];
Byte1 = PointerToLong[1];

Autor: Danni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abend !

Danke für die Hilfe aber habe mich leider etwas znglücklich ausgedrückt
und zwar meine ich mal anls Beispiel eine Struktur:

struct
{
unsigned int x:3
unsigned int y:5

*
*

long int k;
} name;

Nehmen wir mal an die Struktur ist so groß, dass diese 8 Byte im
Speicher belegt. Wie bekomme ich Byte0, Byte1 ...  Byte7 einzeln
ausgelesen, so dass ich diese byteweise in ein i2c EEPROM packen kann?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Danni!

Wie wärs mit
(*unsigned char)name[0];?

Viele Grüße
Steffen

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also probieren wir es noch einmal.
Ich habe sowieso einen cast vergessen.
Hoffentlich habe ich Dein Problem jetzt verstanden.


unsigned char* PointerToStruct;
unsigned charZiel[8];

PointerToStruct = (unsigned char)&name;

for(int i=0; i<8; i++)
  Ziel[i] = *PointerToStruct++;

Autor: Danni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm werde ich probieren, vielen Dank,

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der cast muss natürlich (unsigned char*) heißen!

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danni,
definiere dir eine union, die aus deiner Struktur und einem gleich
grossen byte array besteht und fertig.

typedef union
{
   struct
   {
      unsigned int x:3
      unsigned int y:5
      *
      *
      long int k;
   } name;

   unsigned char bytes[8];
} myUnion;

Der Rest ist klar oder (C-Grundlagen).

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

besser;

typedef union
{
   struct
   {
      unsigned int x:3
      unsigned int y:5
      *
      *
      long int k;
   } name;

   unsigned char bytes[sizeof(name)];
} myUnion;

Matthias

Autor: Danni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Danke für die viele Hilfe,
Möchte er gern mit dem struct machen da es vom Programm am besten
passt, sollte eigentlich auch gehen

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst Du auch.
Du kannst dann trotzdem eine union verwenden:

void WriteToEEprom( struct irgendwas* What )
{
  union {
    struct irgendwas Original;
    unsigned char Bytes[ sizeof( struct irgendwas ) ]
  } *Wandler;

  Wandler = &What;

  for( i = 0; i < sizeof( irgendwas ); ++i )
    WriteByteToEEprom( Wandler->Bytes[i] );
}

Hmm. Wenn ich mir das so anschaue, ist wahrscheinlich
die cast-Loesung doch einfacher:

void WriteToEEprom( struct irgendwas* What )
{
  for( i = 0; i < sizeof( irgendwas ); ++i )
    WriteByteToEEprom( ((unsigned char*)What)[i] );
}

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll denn der ganze Käse?
Einfach per 'eeprom_write_block' die gesamte Struktur ins EEPROM
schreiben...

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

steht in diesem Thread irgendwo was vom AVRGCC?

Matthias

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das 'eeprom_write_block' sollte nur als Pseudocode dienen, ein
Äquivalent wird es wohl in so ziemlich jedem AVR-C-Compiler geben, oder
etwa nicht?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

es steht nichtmal was von AVR in diesem Thread :-) Und
eeprom_write_block hilft dir auch nur für interne EEPROM der AVRs. Wenn
du ein externes EEPROM nutzen willst brauchts halt einen eigenen Code.
Und da muss Danni wissen wie er eine Struktur als Array von chars
behandeln kann. Und genau darum ging es hier. Mir (und aller
Wahrscheinlichkeit nach auch dir) ist natürlich klar das man da einfach
hingeht und sowas
//Schreibt einen Datenblock ab src mit Länge length ins EEPROM ab dst
bool eepromWriteBlock(void * src, void * dst, size_t length)
{
    uint8_t * lsrc = src;    
    uint8_t * ldst = dst;    
    bool res = true;

    for(size_t i = 0; i < length; i++)
    {
        res = res && eepromWriteUInt8(src++, dst++);
    }

    return res;
}

void foo(void)
{
    if(false == eepromWriteBlock(&someGlobalStruct,
                                 &structEEPROMLocation,
                                 sizeof(someGlobalStruct));
    {
        printf("The EEPROM .....")
    }
}


schreibt. Aber ob das für einen Anfänger als Antwort ideal ist?

Matthias

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.