對於某些項目,我必須將有符號整數從Java over serial發送到微控制器上的C++程序。它對於正整數很好地工作,但負整數被包裹起來並在C++端顯示爲正整數。通過串行發送負整數
下面是發送在Java端的INT功能:
void writeIntToSerial(Serial port, int number) {
port.write(byte(number << 24));
port.write(byte(number << 16));
port.write(byte(number << 8));
port.write(byte(number << 0));
}
我不只是之前和之後的有效載荷發送原始整數,但一些控制字符。所有這一切正常。
接收(C++)端將輸入流讀入char的緩衝區數組,然後根據流中的控制字符用狀態機解釋流。
的字符流轉換回整數部分是一個基本的位位移:
int startAngle = 0;
// [...]
startAngle = (payload[0] << 24) + (payload[1] << 16) + (payload[2] << 8) + payload[3];
如前所述,它工作得很好,爲正值,但即-60將轉換爲196(256 - 60 )。
我意識到解決方案可能是微不足道的,但我一直在盯着這段代碼太久......我迷路了。
這是你的實際的代碼?我很難相信即使對於正值,顯示的代碼也能工作。 – Kayaman
是的。當發佈這個我意識到粘貼寫**浮動** ToSerial(),而不是寫在Java端的Java ** ToSerial(),但那是從那以後更正。代碼工作正常(對於正整數)。 – Oldaric
那麼'port.write()'的定義是什麼?顯然它需要一個int參數,但它對它有什麼作用?由於您正在向左移動,因此在嘗試發送int'-1'時,它首先會寫入'0xFF000000',然後'0xFFFF0000',然後'0xFFFFFF00',最後寫入'0xFFFFFFFF'。我無法想象'write()'只會使用8個最重要的位。 – Kayaman