![]() |
Delphi-Version: 5
Temperaturwert in Double umwandeln
Hallo,
Ich suche gerade einen einfachen Weg mit Delphi einen Temperaturwert, der über eine Schnittstelle kommt, in einen Double umzuwandeln. Gesendet wird er in 2 Byte Werten, hier ein Beispiel: LowerByte: $50 HigherByte: $05 Als Ergebnis müsste rauskommen: +5,3125°C. Berechnet wird das im Zweikomplement: Higherbyte: bit7: sign (also Positiv oder Negativ) bit6: 64 °C. bit5: 32 °C. bit4: 16 °C. bit3: 8 °C. bit2: 4 °C. bit1: 2 °C. bit0: 1 °C. Für: $05 kommt 5 (Grad Celsius) raus LowerByte: bit7: 1/2 °C. bit6: 1/4 °C. bit5: 1/8 °C. bit4: 1/16 °C. bit3-0: keine Bewertung Für $50 kommt 0,3125 raus zusammen addiert: 5,3125 Um das Higherbyte umzuwandeln habe ich bereits einen kurzen Weg gefunden:
Delphi-Quellcode:
Weise ich iHigherByte nun $50 zu, wird dies korrekt umgewandelt. Aber irgendwie tue ich mich mit der Nachkommastelle schwer. Ich kann natürlich einen Loop schreiben und das händisch auswerten und addieren.
iHigherByte: Integer;
sHigherByte: ShortInt absolute iHigherByte; Gibt es dazu einen kürzeren Weg? |
AW: Temperaturwert in Double umwandeln
Delphi-Quellcode:
var
data: Word; temp: Double; begin data := $5005; temp := ShortInt(Lo(data)) + (Hi(data) shr 4)/16; end; |
AW: Temperaturwert in Double umwandeln
Wahnsinn, danke :)
Da habe ich gestern eine lange Zeit drüber nachgedacht. |
AW: Temperaturwert in Double umwandeln
So jetzt habe ich noch eine weitere Schnittstelle, da sind die Temperaturwerte wie folgt definiert:
LOW: Temperature in 0.1°C resolution int16_t Lower Byte HIGH: Temperature HB Temperature in 0.1°C resolution int16_t Higher Byte In meinem Beispiel hab ich: LOW: $27 HIGH: $FF Es sollte -12,9 Grad rauskommen, da funktioniert der oben genannte Code aber nicht. (Und ja: Ich frage mich warum im Jahr 2022 noch Werte so kompliziert übermitteln muss :wall:) |
AW: Temperaturwert in Double umwandeln
Zitat:
Delphi-Quellcode:
data := $FF27;
temp := Int16(data)/10; |
AW: Temperaturwert in Double umwandeln
Delphi-Quellcode:
falsch
iHigherByte: Integer
denn das sind 4 und nicht 2 Byte, also wenn, dann SmallInt Außerdem ist "iHigherByte" ebenfalls falsch, denn es ist der komplette Wert und nicht nur das eine Byte. |
AW: Temperaturwert in Double umwandeln
Du hast aber schon gemerkt, dass es bereits Antworten gab und der gezeigte Ausgangscode somit gar nicht mehr aktuell ist?
|
AW: Temperaturwert in Double umwandeln
Heißt aber nicht, dass man die restlichen Fehler nicht dennoch nennen darf ... nicht dass noch wer Anders sich sowas abguckt und damit er andere Stellen nicht auch weiterhin so baut.
|
AW: Temperaturwert in Double umwandeln
Zitat:
Es ist nicht FF27 sondern FF7F. Sorry. Vielen Dank für die Hilfe das hat mir viele Stunden Kopfzerbrechen bereitet. :thumb: |
AW: Temperaturwert in Double umwandeln
Zitat:
a) auf der anderen Seite keine CPU mit GHerz werkelt sondern ein kleiner Microcontroller oder noch was kleineres und die Werte der A/D-Wandler halt so liefert? Und ... b) ... der Entwickler sich dachte soll sich doch der drum kümmern der bequem entwickeln und debuggen kann? c) Das Ding in Geräten zum Einsatz kommt wo Stromverbrauch wesentlich ist? d) Auf der anderen Seite das so eine alter S... wie ich gemacht hat, der gar nicht verstehen kann, was da so schwierig sein kann? ... Nur einige Erklärungsversuche. :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz