我的modbus设备出现了问题:
设备以modbus协议发送数据。
我从modbus通信中读取了代表压力值的4个字节
我必须在无符号的32位整数中转换这4个字节。
有modbus文档:
COMBINING 16bit REGISTERS TO 32bit VALUE
Pressure registers 2 & 3 in SENSOR INPUT REGISTER MAP of this guide are stored as u32 (UNSIGNED 32bit INTEGER)
You can calculate pressure manually :
1) Determine what display you have - if register values are positive skip to step 3.
2) Convert negative register 2 & 3 values from Signed to Unsigned (note: 65536 = 216 ):
(reg 2 value) + 65536* = 35464 ; (reg 3 value) + 65536 = 1
3) Shift register #3 as this is the upper 16 bits: 65536 * (converted reg 3 value) = 65536
4) Put two 16bit numbers together: (converted reg 2 value) + (converted reg 3 value) = 35464 + 65536 = 101000 Pa
Pressure information is then 101000 Pascal.
我不太清楚......例如,我们没有4个字节来提供这个计算。
所以,如果有人有一个公式将我的字节转换为32位无符号整数,那么它可能会非常有用
答案 0 :(得分:0)
你应该能够以某种类型的表示形式读取你的字节(hex,dec,bin,oct ......)
让我们假设您正在接收以下字节帧:
in hex:
0x00, 0x06, 0x68, 0xA0
bin中的:
0000 0000, 0000 0110, 0110 1000, 1010 0000
所有这些都是相同4字节值的不同表示。
你应该知道的另一件事是字节位置(endianess):
如果您的框架是在 big endian 中传输的,那么您将按照您拥有它们的顺序读取字节(因此0x00, 0x06, 0x68, 0xA0
是正确的)
如果帧是以 little endian 传输的,则需要执行以下操作:
将前2个字节切换为最后2个字节:
0x68, 0xA0, 0x00, 0x06
然后切换第一个和第二个字节以及第三个和第四个字节之间的位置:
0xA0, 0x68, 0x06, 0x00
因此,如果您的框架位于 little endian 中,则正确的框架将为0xA0, 0x68, 0x06, 0x00
。
如果您不知道结束语,请假设它在 big endian 中。
现在你只需要放置'你的价值观来源:
0x00, 0x06, 0x68, 0xA0 will become 0x000668A0
或
0000 0000, 0000 0110, 0110 1000, 1010 0000 will become 00000000000001100110100010100000
获得十六进制或二进制文件后,您可以convert your bin to an integer或convert your hex to an integer
Here你可以找到一个有趣的工具,用于在所有字节顺序中将HEX转换为float,unit32,int32,int16。
<强> TL; DR 强>
如果你可以使用python,你应该使用struct:
import struct
frame = [0x00, 0x06, 0x68, 0xA0] # or [0, 6, 104, 160] in dec or [0b00000000, 0b00000110, 0b01101000, 0b10100000] in bin
print struct.unpack('>L', ''.join(map(chr, frame)))[0]