解压IEEE 754浮点数

问题描述 投票:0回答:1

我正在使用pymodbus模块从tcp客户端读取两个16位寄存器。这两个寄存器组成一个32位IEEE 754编码的浮点数。目前,我具有以下代码中所示的寄存器的32位二进制值。

start_address = 0x1112
reg_count = 2
client = ModbusTcpClient(<IP_ADDRESS>)
response = client.read_input_registers(start_address,reg_count)
reg_1 = response.getRegister(0)<<(16 - (response.getRegister(0).bit_length())) #Get in 16 bit format
reg_2 = response.getRegister(1)<<(16 - (response.getRegister(1).bit_length())) #Get in 16 bit format 
volts = (reg_1 << 16) | reg_2 #Get the 32 bit format

上面的方法可以很好地获取问题正在解码的编码值。我打算在video中进行类似的编码,但是在struct模块中遇到了用于IEEE 754编码的'f'格式。我尝试使用struct模块中的unpack方法解码上面代码中存储在volts中的32位浮点数,但遇到以下错误。

val = struct.unpack('f',volts)
>>> TypeError: a bytes-like object is required, not 'int'

确定尝试将其转换为32位二进制字符串。

temp = bin(volts)
val = struct.unpack('f',temp)
>>> TypeError: a bytes-like object is required, not 'str'

试图像post中那样将其隐藏为类似对象的字节,并以不同的方式进行格式化。

val = struct.unpack('f',bytes(volts))
>>> TypeError: string argument without an encoding

temp = "{0:b}".format(volts)
val = struct.unpack('f',temp)
>>> ValueError: Unknown format code 'b' for object of type 'str'

val = struct.unpack('f',volts.encode())
>>> struct.error: unpack requires a buffer of 4 bytes

我在哪里添加此缓冲区,在文档中哪里指出需要unpack方法使用此缓冲区?它确实在文档中说]

字符串必须完全包含格式要求的数据量(len(字符串)必须等于calcsize(fmt))。

calcsize(fmt)函数以字节为单位返回值,但是len(string)返回字符串长度的值,不是吗?

欢迎提出任何建议。

我正在使用pymodbus模块从tcp客户端读取两个16位寄存器。这两个寄存器组成一个32位IEEE 754编码的浮点数。目前,我有32位二进制值...

python python-3.x struct ieee-754 pymodbus
1个回答
0
投票

我使用BinaryPayloadDecoder.fromRegisters()模块中的pymodbus而不是struct模块找到了解决问题的方法。请注意此解决方案特定于我正在使用的Modbus智能电表设备

© www.soinside.com 2019 - 2024. All rights reserved.