我目前正在努力使用modbus tcp并遇到解释模块响应的问题。响应包含两个值,这些值以三个UInt16
值的数组的位进行编码,其中r [0]的前8位必须被忽略。
假设UInt16数组名为r
,我想要的“最终”值为val1
和val2
,那么我必须执行以下操作:
在上面的示例中,输入值val1
= 768,val2
= 1536的所需输出值为r[0]
(= 3)和r[1]
(= 6)和r[2]
= 0,所有值都为UInt16。
我已经尝试(逻辑上)bit-rightshift r[0]
加8,但随后高位丢失,因为它们存储在r[1]
的前8位中。我必须首先连接所有r值并在此之后进行位移吗?我怎样才能做到这一点?提前谢谢!
答案 0 :(得分:2)
我已经尝试(逻辑上)将右移R [0]加8,但随后高位丢失,因为它们存储在r [1]的前8位中。
他们不会失去" - 他们只是在r [1]。
逐步分解它可能是最简单的:
byte val1LowBits = (byte) (r[0] >> 8);
byte val1HighBits = (byte) (r[1] & 0xff);
byte val2LowBits = (byte) (r[1] >> 8);
byte val2HighBits = (byte) (r[2] & 0xff);
uint val1 = (uint) ((val1HighBits << 8) | val1LowBits);
uint val2 = (uint) ((val2HighBits << 8) | val2LowBits);