2015-03-13 55 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

相關問題