Arduino und Bitmanipulation

OP #3027278
Lesenswert?
• ▲
▼
Hallo,
ich sitz gerade vor einem sehr merkwürdigen Problem.
Ich verwende einen Arduino um eine Serielle Kommunikation zwischen einem 
anderen Mikrokontroller und meinem PC herzustellen. Da mein anderer 
Mikrokontroller ein 16Bit Datenwort über einen 8Bit UART sendet, muss 
ich mit meinem Mikrokontroller gewährleisten, dass das Wort in ein High 
und Low Byte umgewandelt wird. Beide Wörter werden dann nacheinander 
über UART an den Arduino geschickt.
Das funktioniert alles soweit. Am Arduino kommen die richtigen Daten an.

Mein Arduino muss nun diese beiden Wörter wieder aneinanderreihen, aber 
irgendwie funktioniert das nicht so wie es sein sollte.
Mit folgendem Beispielcode bekomme ich auf dem Seriellen Monitor diese 
Ausgabe:
1
FFFFAABB

Der Befehl
1
val = ( high << 8) | low;
setzt mir meine 8Bit Wörter wieder zusammen, aber statt
1
0xaa00 + 0xbb = 0xaabb

bekomme ich:
1
0xaa00 + 0xbb = 0xffffaabb


Ich hab auch schon versucht mit einer Bitmaske die vorderen 16Byte 
abzuschneiden
1
& 0x0000ffff

aber auch das führt immer auf das selbe Ergebnis. Woran liegt das? Habe 
ich eine Chance, das zu umgehen?

Ich hoffe ihr könnt mir helfen.
Grüße
Matthias



Code:
1
void setup()  
2
{
3
  // Open serial communications and wait for port to open:
4
  Serial.begin(57600);
5
  while (!Serial) {
6
    ; // wait for serial port to connect. Needed for Leonardo only
7
  }
8

9
  Serial.println("Kommunikation initalisieren...\n");
10
}
11

12
void loop()
13
{
14
  int val, high, low;
15
 
16
  high = 0xaa;
17
  low = 0xbb;
18
  
19
  val = ( high << 8) | low;
20
  
21
  Serial.print(val, HEX);
22
  Serial.print("\n");
23
}
Persönliche Seite #3027323
Lesenswert?
• ▲
▼
Peter II schrieb:
> Sebastian W. schrieb:
>> In so etwas bis ich auch schon übel reingerasselt. Zum Beispiel:
>> unsigned char u8 = 0x88;
>> unsigned long u32 = u8<<8;
>> Danach enthält u32 ... 0xFFFF8800!
>
> das glaube ich nicht.

Nicht-Glauben hilft dir hier aber nix.  Es kommt 0xFFFF8800 raus.

Übrigens warnt ein guter Compiler wie GCC das an:
1
<stdint>:6:20: warning: conversion to 'uint32_t' from 'int' may change the sign of the result [-Wsign-conversion]

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.