CAN ID aus teilen zusammenfühgen

OP #2968777
Lesenswert?

Guten Tag

Ich habe vor eine CAN ID aus bestimmten Werten zusammen zu setzten.
Ich benutzte die Can-Lib vom kreatives-chaos.com.


Die ID soll sich aus BoT- Benachrichtigungstype, der senderadresse, der 
empfängeradresse und dem Datentyp zusammensetzten.

Wenn ich dies mit dem Code hier machen klappt des nicht

msg.id = (BoT<<24) | (boardadr<<16) | (rxdrive<<8) | (DoT<<0);

aber auch so gehts nicht

msg.id = (0x90<<24) | (0x03<<16) | (0x01<<8) | (0x10<<0);

wenn ich es aber manuel eingebe
z.B. mag.id = 0x09030110 klappt es....

wo ist der fehler???
#2968959
Lesenswert?

** Lötlackl schrieb:
> ins blaue geraten
>
1
msg.id = (uint32_t)(BoT<<24) | (uint32_t)(boardadr<<16) |
2
> (uint32_t)(rxdrive<<8) | (uint32_t)(DoT<<0);


wahrscheinlich ein bischen zu spät gecastet.

wenn du das Ergebnis von
   Bot << 24

auf einen uint32_t castest, ist das Kind schon in den Brunnen gefallen, 
weil durch den <<24 alle Bits nach links rausgeschoben wurden, wenn BoT 
ein 16 Bit int ist.

Also: vorher bereits den BoT auf einen uin32_t casten, dann kann man ihn 
auch um 24 Bits nach links verschieben.

   ... ((uint32_t)Bot) << 24)  ...


und mit boardadr dasselbe machen.

Für rxdrive und Dot ist es grundsätzlich nicht notwendig zu casten. Man 
spart dann dem µC die Arbeit, in 32 Bit zu schieben, wenn es nicht 
notwendig ist.
Gast #2969042
Lesenswert?

Jupp schrieb:
> Warum muss denn ueberhaupt gecastet werden?

Weil der Typ sonst int ist, und falls der auf dem (unbekannten) 
Prozessor 16 Bit breit sein sollte, bleibt nach einem Verschieben um 24 
Bit nicht viel davon übrig.

> Hex Werte werden in Hex geschrieben..

Ähm, ja. Und mit einem Löffel kann man Suppe essen.

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