NEWS
[gelöst]Convertierung HEX->DEC
-
hallo,
ich lese HEX-Werte von meiner Heizung:
und rechne so um:
DECwert = (parseInt( HEXwert, 16 ) / 256 ).toFixed( 2 );
zb. Rücklauf: 26C0 ergibt: 38,75
aber bei der Aussentempp stimmt meine Rechnung nicht
ich bekomme F924 das ergibt: 249,14 es sollte aber -6,86
was ist an meiner Rechnung hier falsch, wie erkenne ich negative Werte?
LG
Stef
-
Hi Stef,
ist F924 wirklich die ganze Antwort?
Damit bekommst Du aber kein Vorzeichen hin.
Die Antwort ist nicht vielleicht eher 0xc0dbf924?
Sind die Werte vielleicht IEEE-754?
Dann schau mal hier:
https://www.h-schmidt.net/FloatConverter/IEEE754.htmll
Gruß
Franz
-
Also, du musst erstmal 1 von deinem Hexwert subtrahieren (ist zwar in diesem Fall wegen dem anschließenden "/256" nicht so wichtig, aber irgendwie so festgelegt…) und anschließend von HEX in Binär umwandeln
F923 -> 1111 1001 0010 0011
Dann bedeutet das höchstwertige (linke) Bit das Vorzeichen, wenn "1" dann Minus.
Anschließend musst du die Binärzahl invertieren:
1111 1001 0010 0011 -> 0000 0110 1101 1100
Dann kannst du die Binärzahl in Dezimal konvertieren (dabei aber das höchstwertige Bit ignorieren bzw. vorher auf 0 setzen) und durch 256 teilen.
Ob's dafür jetzt in Javascript eine halbwegs komfortable Funktion gibt oder ob du das "zu Fuss" machen musst entzieht sich momentan meiner Kenntnis, kann auch gerade nicht testen...
-
Ich vermute fast, dass es sich bei den Werten um die Widerstandswerte der Temperaturfühler handelt?
Wenn es wirklich Widerstandswerte sind dann gehe ich aufgrund deines Beispiels mit den Temperaturen und den Hex Werten davon aus, dass es sich bei den Fühlern um NTC Widerstände handelt.
(NTC = je kleiner die Temperatur, desto höher der Widerstand)
26C0 in Dec ergibt 9920 (Ohm?)..
F924 in Dec ergibt 63780 (Ohm?)..
Wenn ich mit meiner Vermutung richtig liege,..
Dann ist ohne den Typ von dem NTC zu kennen ein ausrechnen der Temperatur aus dem Widerstand "sehr schwer" bzw. unmöglich da der Widerstand in einem NTC nicht linear zur Temperatur verläuft..
EDIT: Mein Tipp war wohl nicht korrekt. :? :lol:
Der Mihaeru hat die richtige Antwort unter diesem Beitrag geschrieben. :!:
Gruß
-
Wie thisoft geschrieben hat, ist das höchstwertige Bit ausschlaggebend. Dieses liegt bei 16 Bit Werten bei hex 0x8000. Wenn das bit gesetzt ist, ziehst du einfach 0x1000 ab.
So kannst du die Berechnung bei 16 Bit Werten umsetzen:
DECwert = parseInt(HEXwert, 16); DECwert = (( DECwert >= 0x8000 ? DECwert - 0x10000 : DECwert) / 256).toFixed(2);
oder:
DECwert = parseInt(HEXwert, 16); DECwert = (( DECwert & 0x8000 ? DECwert - 0x10000 : DECwert) / 256).toFixed(2);
Edit: DECwert > 0x8000 geändert in DECwert >= 0x8000
…und Beispiel um gezielt das Bit abzufragen
-
jepp, damit geht's
DECwert = parseInt(HEXwert, 16); DECwert = (( DECwert >= 0x8000 ? DECwert - 0x10000 : DECwert) / 256).toFixed(2);
Vielen Dank, sowas hab ich gesucht…