Ich habe hier ein Problem beim Umrechnen einer short-Variable. short value1; short value2; value1 = (((short)(buf[2])<<8) + ((short)(buf[3]))); //[2][3] //Luftfeuchte value2 = (((short)(buf[4])<<8) + ((short)(buf[5]))); //[4]][5] //Temperatur Diese zwei Werte, die ich von einem Mikrocontroller auf den PC übertragen habe, möchte ich nun umrechnen in eine physikalische Einheit und anschließend ausgeben. RH = value1 * 100/ 2^14; T = ((value2 * 165) / 2^16) - 40; printf("T: %d ", RH); printf("RH: %d ", T); Bisher bekomme ich hierfür jedoch keine richtigen Ergebnisse. Was ist daran falsch? Ich habe leider recht wenig Erfahrung mit den verschiedenen Datentypen.
Überleg' Dir mal, welcher Wertebereich Dir zur Verfügung steht, und wie groß die Kontanten sind, durch die Du da jeweils teilst.
Hanz schrieb: > RH = value1 * 100/ 2^14; > T = ((value2 * 165) / 2^16) - 40; Steht das bei dir so im Quelltext? Das ^ ist Exclusiv-Oder und nicht hoch Da ist es besser du schreibst die richtigen Konstanten hin: 8192 und 65536
Hanz schrieb: > RH = value1 * 100/ 2^14; > T = ((value2 * 165) / 2^16) - 40; Wenn du damit sagen möchtes
muss ich dich enttäuschen, der "^" Operator bedeutet nicht "Exponent" sondern XOR.
(ob dass dann nicht auch eine intergerdivision ist, sollte man sich auch anschauen..)
DirkB schrieb: > Da ist es besser du schreibst die richtigen Konstanten hin: 8192 und > 65536 Nee, so etwas lässt man besser den Compiler rechnen, zumal dieser auch weniger Fehler macht (2¹⁴ ist 16384 und nicht 8192 ;-) ). In diesem Fall
1 | RH = value1 * 100/ 2^14; |
2 | T = ((value2 * 165) / 2^16) - 40; |
würde ich aber einfach schreiben:
1 | RH = value1 * 100 >> 14; |
2 | T = (value2 * 165 >> 16) - 40; |
Bei der Extraktion von short-Werten aus den Pufferbytes hast du es ja ebenso gemacht. Übrigens würde ich in
1 | value1 = (((short)(buf[2])<<8) + ((short)(buf[3]))); |
2 | value2 = (((short)(buf[4])<<8) + ((short)(buf[5]))); |
ein paar der Klammern weglassen. Manchmal dienen Klammern der besseren Übersichtlichkeit, zuviele verderben sie aber wieder. So viele hätten gereicht:
1 | value1 = (short)(buf[2]<<8) + (short)buf[3]; |
2 | value2 = (short)(buf[4]<<8) + (short)buf[5]; |
Yalu X. schrieb: > Nee, so etwas lässt man besser den Compiler rechnen, zumal dieser auch > weniger Fehler macht (2¹⁴ ist 16384 und nicht 8192 ;-) ). In der Ecke schäm.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.