我正在从热量表接收UART数据,但我需要一些帮助才能理解我应该如何处理数据。 我有文档,但这对我来说还不够,我对这种计算几乎没有经验。
也许拥有合适技能的人可以向我解释如何使用文档中的更好示例来完成它。
One value consists of the following bytes:
[number of bytes][sign+exponent] (integer)
(integer) is the register data value. The length of the integer value is
specified by [number of bytes]. [sign+exponent] is an 8-bit value that
specifies the sign of the data value and sign and value of the exponent. The
meaning of the individual bits in the [sign+exponent] byte is shown below:
Examples:
-123.45 = 04h, C2h, 0h, 0h, 30h, 39h
87654321*103 = 04h, 03h , 05h, 39h, 7Fh, B1h
255*103 = 01h, 03h , FFh
现在再以实际数据为例。
这是我从文档中获得的有关此信息的信息。
这是我从热量表收到的一些数据
10 00 56 25 04 42 00 00 1B E4
所以在我的例子中,04是[字节数],42是[符号+指数],00 00 1B E4是(整数)。 但我不知道如何进行计算以获得实际值。
任何帮助?
答案 0 :(得分:1)
根据您的示例,您的数据似乎是大端的。所以这就是你如何使用位移和屏蔽将这些字节分成你需要的字段。
n = b[0]
SI = (b[1] & 0x80) >> 7
SE = (b[1] & 0x40) >> 6
exponent = b[1] & 0x3f
integer = 0
for i = 0 to n-1:
integer = (integer << 8) + b[2+i]
答案 1 :(得分:0)
尾数的符号是通过屏蔽(byte & 80h != 0 => SI = -1
)从符号+指数字节的MSb获得的。
指数的符号同样由byte & 40h != 0 => SE = -1
获得。
指数值为EXP = byte & 3Fh
。
尾数INT
是由其他四个字节组成的二进制数,可以读作一个整数(但请注意印度)。
最后,计算SI * INT * pow(10, SE * EXP)
。
在您的示例中,SI = 1
,SE = -1
,EXP = 2
,INT = 7140
,因此
1 * 7140 * pow(10, -1 * 2) = +71.4
解释如何有效地实现这一点并不在本答案的范围内。