python - 将两个 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
解决方案
您l
在struct.pack
. 请改用无符号类型L
。
请参阅结构格式字符。
推荐阅读
- java - 有没有办法在 Kotlin 中隐藏 Java 方法?
- c# - 确定 C# 中指定进程的磁盘 I/O 读写数据总量(以字节为单位)?
- javascript - 从分组的日期时间创建对象
- python - 在 Python 中按顺序获取查询字符串参数
- java - 从 Firebase 数据库检索时对象缺少数据
- c# - Quartz.NET如何在任务失败或成功时获得结果
- django - 在带有 json api 的 django rest 框架中使用 slug 而不是 ID
- javascript - 新附加的项目会导致之前附加的项目失去切换功能
- python - Python3 `builtins` 并不总是 `__builtins__`
- java - zxing中如何指定扫描区域