Forum: Mikrocontroller und Digitale Elektronik Arduino und Bitmanipulation


von Matthias K. (bartimaeus)


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
}

von Peter II (Gast)


Lesenswert?

Matthias K. schrieb:
> int val, high, low;

teste mal mit

unsigned int val, high, low;

von Matthias K. (bartimaeus)


Lesenswert?

Danke! Das wars schon...
So einfach kann eine Lösung sein :)

von Sebastian W. (sebastian_w29)


Lesenswert?

In so etwas bis ich auch schon übel reingerasselt. Zum Beispiel:
1
unsigned char u8 = 0x88;
2
unsigned long u32 = u8<<8;

Danach enthält u32 ... 0xFFFF8800!

LG, Sebastian

von Peter II (Gast)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


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]

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.