Shiftoperation sinnvoll?

Gast #2160762
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
Angehängte Dateien:
Gast #2160823
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?
#2160867
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren