对于某些项目,我必须通过串行将有符号整数从Java发送到微控制器上的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的缓冲区数组,然后根据流中的控制字符使用状态机解释流。
将字符流转换回整数的部分是基本的bitshift:
int startAngle = 0;
// [...]
startAngle = (payload[0] << 24) + (payload[1] << 16) + (payload[2] << 8) + payload[3];
如前所述,它对正值很有效,但是-60会转换为196(256 - 60)。
我意识到解决方案可能是微不足道的但是我已经盯着这段代码太久了......我迷失了。
答案 0 :(得分:0)
在一端看起来你正在序列化float
,而另一端你正在收到int
。由于这些数据类型在内部存储的方式,必然存在一些不一致。
因此,您要么发送/接收浮动或 int ,要么不要混淆。
答案 1 :(得分:0)
那是因为你把它们加在一起所以它们会被标记为32bit。
如果您将它们组合在一起,您应该得到正确的结果。
答案 2 :(得分:0)
在您发送-60的示例中,您发送字节
0000 0000
0000 0000
0000 0000
1100 0100
然后重新组装到
0...1100 0100
这是196,所以代码工作得很好。如果你发送了一个大于255的正数,你也应该在接收端出现伪造。这是因为你正在转移Java端的错误方向。
答案 3 :(得分:0)
我猜有效负载的类型是char还是unsigned char? 然后有效载荷[x]&lt;&lt; y将以无符号字符大小移动,这显然不会超过8位。如果我的假设是正确的,那么您的代码应该是
startAngle = (static_cast<unsigned int>payload[0]) << 24) + ((static_cast<unsigned int>payload[1]) << 16) + ((static_cast<unsigned int>payload[2]) << 8) + payload[3];
答案 4 :(得分:0)
好的。
在发送方面,我需要右移而不是左移:
startAngle = (static_cast<uint32_t>(payload[0]) << 24)
| (static_cast<uint32_t>(payload[1]) << 16)
| (static_cast<uint32_t>(payload[2]) << 8)
| payload[3];
在接收端,这个bithift-cast序列可以解决这个问题:
{{1}}