将16位有符号(x2)转换为32位无符号

时间:2018-01-22 09:07:18

标签: type-conversion modbus

我的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位无符号整数,那么它可能会非常有用

1 个答案:

答案 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 integerconvert 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]