对于某些项目,我必须将有符号整数从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