2016-10-05 8 views
0

Ich versuche, ein serielles Programm mit C++ herauszufinden. Ich sende ein char-Array, das aus mehreren uint8_t und mehreren uint16_t besteht, die ich aufteilen und senden möchte.Unsigned Int-Konvertierung C++

char buf[3]; 
uint16_t var=1500; 

Was zwischen diesen die Differenz (falls vorhanden) ist:

buf[0]= var & 0xFF; buf[1]= var >> 8; 

und

buf[0]= (uint8_t)(var & 0xFF); buf[1]= var >> 8; 

Das andere Ende erwartet 16bit ganze Zahlen mit LSB zuerst und aus irgendeinem Grund, den ich gerade don‘ Ich denke, ich bekomme den erwarteten seriellen Schreibvorgang. Ich weiß, dass es eine Vielzahl von Gründen dafür gibt, aber ich versuche nur, das Konzept hier zu verstehen.

+0

Was ist der Unterschied? Eine der Zeilen enthält eine C-Style-Umwandlung in "uint8_t" und die andere nicht. Welche Frage stellst du wirklich hier? –

+1

Verwendet dieses "andere Ende" vielleicht eine andere Endianz als der Sender? – orphen

+0

Ich bin neugierig, warum Sie 'var & 0xff' machen. Wird die implizite/explizite Umwandlung die höchstwertigen Bits nicht bereits abschneiden? –

Antwort

1

Die meisten seriellen Protokolle möchten Daten in Big-Endian-Reihenfolge. In diesem Fall sollten Sie einfach *reinterpret_cast<short*>(buf) = htons(var) tun. Wenn Sie wirklich Little-Endian benötigen, verwenden Sie htole16, definiert in string/endian.h.

+0

Sie haben Recht. Behoben. –