FLOAT-Zahl aus 2x 16 bit HEX

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
grinder25
User
Beiträge: 4
Registriert: Mittwoch 20. August 2014, 13:04

Hallo,

Ich habe ein Programm geschrieben dass über Modbus TCP ein Messgerät ausliest.
Das Ergebniss des Messgeräts ist eine FLOAT-Zahl nach IEE 754 (z.B. 0x436bbc2a für 235.73502).

Mittels pymodbus erhalte ich das Ergebnis in einer Liste mit zwei Einträgen:
u1[1] = 0x436b und u1[2] = 0xbc2a

Wie bekomme ich jetzt diese zwei Einträge zusammen und daraus meine Floatzahl??

Ich hatte mir es folgendermaßen vorgestellt:

zusammen=bin(u1[0]<<16) | bin(u1[1])
zahl=float(zusammen)

Erhalte aber den Fehler:
TypeError: unsupported operand type(s) for |: 'str' and 'str'

Hab noch andere Methoden versucht aber keine hat funktioniert. Vllt steh ich ja auf dem Schlauch.
Ich hoffe es findet sich eine Lösung
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Schau dir mal das struct-Modul an.
Das Leben ist wie ein Tennisball.
grinder25
User
Beiträge: 4
Registriert: Mittwoch 20. August 2014, 13:04

Danke für den Tip!

Hab noch etwas Probleme mit Little/Big-Endian gehabt aber so funktionierst:

u1 = unpack('>f', pack('>H', u1_raw[0]) + pack('>H', u1_raw[1]))
print(hex(u1_raw[0]))
print(hex(u1_raw[1]))
print(u1[0])

Ausgabe:
0x436e
0x63dd
238.390090942
BlackJack

@grinder25: Das ist ein wenig umständlich zweimal `pack()` aufzurufen, IMHO.

Edit:

Code: Alles auswählen

In [43]: u1_raw
Out[43]: [17262, 25565]

In [44]: unpack('>f', pack('>2H', *u1_raw))[0]
Out[44]: 238.3900909423828
Antworten