首页 > 解决方案 > 将两个 16 位寄存器组合成一个 32 位浮点数

问题描述

所以我有一个项目,我正在从 MODBUS 寄存器读取数据。

每个寄存器是 16 位,每个值是 32 位。所以我必须一次读取两个寄存器来读取每个值。

所以我现在正在做的是读取两个寄存器并将它们存储在一个regs数组中并像这样获取它们的位:

bits = (regs[0] << 16) + regs[1]

然后我尝试将这些位转换为这样的浮点数:

s = struct.pack('>l', bits)
final = struct.unpack('>f', s)[0]

应该是我final的 32 位浮点数。这几乎一直有效,但是,在某些情况下,我会收到此错误:

Read registers failed: 'l' format requires -2147483648 <= number <= 2147483647

所以我回去添加了一个打印语句,在我把它变成一个浮点数之前看看比特是什么样子的,它是这样的:3309382817,这显然超出了这个范围......

那么我做错了什么导致我得到这个错误?有什么我想念的吗?


更新:

只是为了提供更多信息,在打印的值的同时再次运行它regs并得到这个:

[50561, 10024]  # this is the value of regs
3313575720      # this is the value of bits

标签: pythonbit-manipulation

解决方案


lstruct.pack. 请改用无符号类型L

请参阅结构格式字符


推荐阅读