2015-03-13 44 views
1

我目前正在用modbus tcp挣扎,并且遇到了解释模块响应的问题。该响应包含两个值,这些值以三个UInt16值的数组的位进行编码,其中r [0]的前8位必须被忽略。如何进行位移和连接以获得正确的结果?

比方说,UINT16数组称为r和“最后”的价值观我想是val1val2,那么我就必须做到以下几点:

6

在上面的例子中,对于输入值r[0] = 768,r[1] = 1536和r[2] = 0,期望的输出值是val1(= 3)和val2(= 6),所有值都是UInt16。

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

+0

你为什么用UINT16工作?该协议是基于(8位)字节设计的,这使得一切都更简单。你不能简单地使用字节吗? – DrKoch 2015-03-13 13:36:47

+0

嗯,模块本身返回UINT16(通过Wireshark验证),我的modbus库也适用于这种类型...所以我会坚持。 – Robert 2015-03-13 13:41:38

回答

2

我已经试图在逻辑上将bit-rightshift 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); 
+0

谢谢,它的作品!我想我一定会仔细看看这个“低级”的东西。 – Robert 2015-03-13 13:39:58

相关问题