Temperatur aus bytes auslesen.

Hier mal als Beispiel, was ich bisher habe:
Java:
byte data[] = new byte[64];
sensor.read(data);
byte t = data[4];
System.out.println(t);

System.out.print("< [");
for (byte b : data) {
System.out.printf(" %02x", b);
}
System.out.println("]");

Das Ergebnis davon ist z.B. 58 und [01 01 01 00 3a 01 00 00 28 db 38 dd 06 00 00 d5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00].
 
vielleicht erstmal was diese Zeile überhaupt bedeutet:
C:
short temp = *(short *)&buf[4];
buf ist ein unsigned char array.
Mit &buf[4] erhält man einen Pointer auf das Zeichen an Position 4 des Arrays.
Das ganze wird dann zu einen short Pointer gecastet. Dadurch werden nun die Bytes an Position 4 und 5 zusammen als short betrachtet. Da hier aber kein Pointer auf den Wert benötigt wird, sondern der Wert selbst. Wird schließlich noch dereferenziert.

In Java kannst du das z.b. mit einem Bytebuffer machen oder einfach manuell berechnen, was vielleicht etwas einfacher ist:
Java:
int temp = buf[4] << 8 | buf[5];
Hiermit baust du manuell zwei bytes zu einem größeren Wert zusammen.
 
Danke für die Erklärung, mit C/Cpp kenne ich mich nicht aus.

Mit diesem Code erhalte ich als Ergebnis bei etwa 32.7°C: 18177. Muss ich außer der Code Zeile noch etwas beachten?
 
Wie kommst du auf 58?
Java:
int temp = buf[4] | buf[5] << 8;
//also
temp = 0x3a | 0x01<<8;
//=314
Und laut dem C-Code ist die tatsächliche temperatur dann = temp / 10f = 31,4°;
 
Weil er das oben ausgegeben hat und in byte[4] -> 3a drin steht. Und hex 3a = 58. Hab mir aber den C++ Code nicht angesehen, ob da noch was gerechnet wird ;-)
 
Die 58 habe ich ausgelesen, das stimmt aber nicht.

Mit int temp = buf[4]| buf[5]<<8; hat das bei Temperaturen über 25.6° funktioniert, wenn die Temperatur aber darunter fällt, kommt aber -0.1° usw. raus.
 
ok, das problem ist, dass die Werte im Array des C-Codes vorzeichenlos sind.
Java:
int temp = buf[4] | (buf[5] & 0xFF) << 8;
 
sorry, bin heut nicht zu gebrauchen xD
das & 0xFF muss logischerweise an das nicht geshiftete Byte:
Java:
int temp = (buf[4] & 0xFF) | (buf[5]<<8);
 

Neue Themen


Zurück
Oben