CAN Bus Auslesen: Verketten von 2 Bytes

Hallo Zusammen,

ich versuche mich seit ein paar Tagen am auslesen eines CAN Bus.
Als Hardware verwende ich einen Arduino Uno und ein MCP2515 CAN.

Die Schaltung habe ich hinbekommen, die CAN Messages werden auch im Serial Monitor angezeigt.

Jetzt würde ich gerne 2 Bytes aus einem Can Bus Telegram lesen und zusammen in einer Variablen ablegen.

Aus folgender Nachricht benötige ich das 3. (A3) und 4. Byte (12):

100 8 FE CF A3 12 FE CF FE CF

In der Variablen soll das dann so aussehen: 12A3

mit folgendem Befehl bekomme ich die einzelnen Bytes ausgelesen:

int y = canMsg.data[2]; (A3)
int z = canMsg.data[3]; (12)

Das Verketten gelingt mir nicht - kann mir da vielleicht jemand einen Tip geben=?

Danke!

uint16_t ergebnis = canMsg.data[2]<<8 | canMsg.data[3];

Schiebe das Byte 2 acht Bit nach links und veroder Das mit dem Byte 3.
Wenn Du mehr als 16 Bit schieben willst, musst Du den Datentyp explizit mit angeben, sonst wird INT verwendet.

MfG

Edit
|| -> |
(kein logisches Oder ||, sondern das bitweise Oder | )

Ich würde da ja die "12" data[3] shiften und mit der "A3" data[2] verodern (little endian).
Mathematisch passiert da eine Rechnung der Art data[3]*256 + data[2].

Gruß Walter

postmaster-ino:
uint16_t ergebnis = canMsg.data[2]<<8 | canMsg.data[3];

Schiebe das Byte 2 acht Bit nach links und veroder Das mit dem Byte 3.
Wenn Du mehr als 16 Bit schieben willst, musst Du den Datentyp explizit mit angeben, sonst wird INT verwendet.

MfG

Edit
|| -> |
(kein logisches Oder ||, sondern das bitweise Oder | )

Danke! Jetzt klappt es.

Jetzt würde ich gerne 2 Bytes aus einem Can Bus Telegram lesen und zusammen in einer Variablen ablegen.

Aus folgender Nachricht benötige ich das 3. (A3) und 4. Byte (12):

100 8 FE CF A3 12 FE CF FE CF

In der Variablen soll das dann so aussehen: 12A3

Mathematisch passiert da eine Rechnung der Art data[3]*256 + data[2].

Statt der leicht zu verwechselnden oder ( || oder | ) wäre auch + gegangen :slight_smile:
Der schlaue Compiler hätte übrigens auch *256 als <<8 realisiert.

Ausserdem sind in postmasters Lösung die Bytes vertauscht (LittleEndian {A3,12} => 0x12A3=4771)

... also Etwas soll der TO ja auch noch machen ... selbst gefundene Fehler macht man nie wieder ... Ausrede such

MfG