1

我目前正在努力使用 modbus tcp 并在解释模块的响应时遇到了问题。响应包含两个值,这些值在三个值的数组的位中编码UInt16,其中 r[0] 的前 8 位必须被忽略。

假设调用 UInt16 数组r并且我想要获得的“最终”值是val1and val2,那么我必须执行以下操作:

6

在上面的示例中,对于输入值=768、=1536 和=0,所需的输出值为val1(=3) 和(=6) ,所有值都为 UInt16。val2r[0]r[1]r[2]

我已经尝试(逻辑上)将位右移r[0]8 位,但随后高位丢失了,因为它们存储在r[1]. 我是否必须先连接所有 r 值,然后再进行位移?我怎样才能做到这一点?提前致谢!

4

1 回答 1

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);
于 2015-03-13T13:33:58.567 回答