- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 18

Thema: Daten aus 2 hintereinander liegenden Registern in ein char[8] Array einlesen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    Hallo Siro.

    - eigentlich habe ich den pointer als char *pTxRegister deklariert.
    Und im Debag modus siet man auch - nach ++ erhoht sich der Pointer um 1 Byte , nicht um 4.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich hab das grade so ausprobiert mit 4 Bytes,
    Code:
    char Data[8];
    volatile unsigned int value;                      
    volatile char* pRegister;   // muss ein byte Zeiger sein
    
    int main(void)
    { int i;
    
        value = 0xAABBCCDD;         // Testweise einen Wert ins register bzw. Speicher schreiben
        pRegister = (char*)&value;   // hier setze ich die Adresse 
    
        for (i=0; i<4; i++)
        {
          Data[i]=*pRegister++;   // alle Bytes kopieren
    
        }
    }
    ich hab jetzt nur mal 4 Bytes kopiert. Wenn deine anderen 4 bytes genau dahinter stehen, kannst Du natürlich alle 8 kopieren
    Geändert von Siro (18.02.2019 um 22:12 Uhr)

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    Hi Siro,
    danke für Deine Mühen

    Was Du gerade zugeschikt hast - vom Register ins Array - funktioniert bei mir auch - siehe oben um 20:38

    Ich stecke fest bei Übertragung der Daten vom Array ins Register . . . siehe oben um 20:38

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076

    Hin und zurück kopieren sollte so gehen

    Code:
    struct  // hier habe ich eine 8 Byte Struktur
    {
      unsigned int a;   // 4 Bytes
      unsigned int b;  // nochmal 4 Bytes
    } value;
    
    char* pRegister;
    
    unsigned char Data[8];
    
    int main(void)
    {int i;
    
        // 8 Bytes initialisieren
        value.a = 0x11223344;
        value.b = 0x55667788;
    
        pRegister = (char*)&value;  // Zeiger setzen
    
        for (i=0; i<8; i++)    // alle 8 Bytes kopieren
        {
          Data[i]=*pRegister++;
        }
    
       // !!!!! den Pointer wieder richtig setzen !!!! hatte ich eben auch vergessen.....
        pRegister = (char*)&value;  // Zeiger wieder auf Start setzen
    
        for (i=0; i<8; i++)    // alle 8 Bytes zurück kopieren
        {
          *pRegister++=Data[i];
        }
    Geändert von Siro (18.02.2019 um 22:37 Uhr)

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    . . glaube es siet bei mir ziemlich änlich aus ausser das ich CAN Register mit bestimmten Adresse anspreche.

    Aber das ist ja auch NUR Speicher . . .

    ++++++++++++++++++++
    char Data[8] = "11223344";

    volatile char *pTxRegister = (char *)(CAN1_BASE + CAN_TDL0R_OFFSET);

    for (unsigned char i = 0; i < 8; i++){
    *pTxRegister = Data[i ];
    pTxRegister++;
    }

    Müsste doch gehen, ABER
    jedes Zeichen wird nicht nur in das adressierte Byte sondern in jedes der 4 Bytes des Registers übertragen.

    - - - Aktualisiert - - -

    . . ok hab es erst mal so gelöst:
    pTxReg1 = Data[i+3] << 24 | Data[i+2] << 16 | Data[i+1] << 8 | Data[i+0];
    pTxReg2 = Data[i+7] << 24 | Data[i+6] << 16 | Data[i+5] << 8 | Data[i+4];

    i - ist die Verschiebung durch das Data Array.

    Ist nicht so elegant wie ne Schleife aber erfüllt den Zweck.

    Trotzdem würde mich interessieren wieso es mit der Schleife nicht tut ???
    Wo ist da der Fehler ??

  6. #6
    HaWe
    Gast
    ... leider arbeite ich in einer ganz bestimmten Umgebung die KEINEN memcpy hat
    memcpy ist Teil der Bibliothek <cstring> bzw. <string.h> , wieso kannst du die nicht #includen? Das ist schließlich eine C99 Standardbibliothek, die jeder C Compiler einbinden kann.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Die ganze Sache ist nicht so einfach. Das fängt schon mal mit der Größe der Variablen an. Ein int ist in C mindestens 16 Bit, kann aber auch 64 Bit sein. Dazu kommt noch die Anordnung und die Orientierung der Bytes im Speicher, also ob Big oder Little Endian. Sauberer C-Code sollte von all dem nicht abhängig sein. Spätestens bei der Übertragung der Daten zwischen verschiedenen Systemen fällt einem das sonst auf die Füsse.

    Um die Größe sicherzustellen, kann man int32_t bzw. uint32_t verwenden. Und um Probleme mit der Endianes zu vermeiden ist
    Code:
    pTxReg1 = Data[i+3] << 24 | Data[i+2] << 16 | Data[i+1] << 8 | Data[i+0];
    ein Weg. Rückwärts geht es dann über Schieben nach rechts und ausmaskieren. Das sollte auf allen Architekturen das gleiche Ergebnis liefern.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. Char mit array verbinden ?
    Von AsuroPhilip im Forum Software, Algorithmen und KI
    Antworten: 22
    Letzter Beitrag: 08.09.2011, 14:37
  2. Videoframes online in VisualBasic-Array einlesen
    Von malthy im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 8
    Letzter Beitrag: 26.07.2007, 11:52
  3. gelöst : Frage zu C und 2 Dim char Array
    Von jar im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.05.2007, 17:53
  4. zweidemensionales char-array
    Von p_mork im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 15.03.2007, 17:54
  5. Cstring einem char array zuweisen
    Von ceekay im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 17.04.2006, 11:20

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress