Forum: Mikrocontroller und Digitale Elektronik Shiftoperation sinnvoll?


von makrox (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
im Anhang habe ich ein CAN protocoll eingestellt.
Ich möchte die Daten passend auf jeweils 1 byte splitten.

Bisher meine Idee:
1
Byte1 = (unsigned char) (Data1 >> 6);
2
Byte2 = (unsigned char)((Data1 << 2) + (Data2 >> 12));
3
Byte3 = (unsigned char)(Data2 >> 4);
4
Byte4 = (unsigned char)(Data2 << 4) + (Data3 >> 10);
5
Byte5 = (unsigned char)(Data3 >> 2);
6
//...

Man erkennt schon die Problematik, was die Übersichtlichkeit des Codes 
angeht.

Gibt es für solche Dinge eine geschikte Lösung, die dann auch noch 
halbwegs lesbar ist?
Mir fällt gerade nichts ein, deshalb mein post.

Grüße
mx

von Mani (Gast)


Lesenswert?

Schau Dir mal structs bzw. union an...

von makrox (Gast)


Lesenswert?

Hi da habe ich auch schon daran gedacht, nur irgendwie muss ich die 
Daten da ja auch rein bringen. Ein byte kann ja bits von 2 unabhängigen 
Daten enthalten.
Geht das mit einem Struct ohne Shiften, ich weiß nicht wie?

Kannst du mir da ein Beispiel zeigen?

von Vlad T. (vlad_tepesch)


Lesenswert?

makrox schrieb:
> Kannst du mir da ein Beispiel zeigen?


union CanMsg
{
  struct RawData{
    uint8_t bytes[8];
  }rawData;

  struct MyData
  {
    unsigned dummy: 8; // Byte 0 not specified
    unsigned data1:14;
    unsigned data2:14;
    unsigned data3:14;
    unsigned data4:14;
  }structuredData;
}

must halt schauen, ob die Bits korrekt auf die Daten abgebilded werden.
Das ist höchst architektur- und compilerabhängig, deswegen eigentlich 
nicht zum Datenaustausch zu empfehlen.

Besser ist was generisches, was eine abstrakte Nachrichtenbeschreibung 
nimmt und diese in einen anderen Typen umwandelt, bzw eine 
Struktdefinition und  Konvertierungsroutine erstellt

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
Noch kein Account? Hier anmelden.