一般串口通信返回得数据为两个字节(byte);
此时两个字节总共有16位,举个例子:
当返回数据位 10时:
返回的两个字节数据16进制数是 0x00,0x0A,
返回的两个字节数据10进制数是00,10,
返回的两个字节数据2进制数是0000 0000 0000 1010;
所以此时直接讲第一个字节数据左移八位后加上第二个字节就是正常数据。
(0x00 << 8) + 0x0A; *注意:0x00 << 8 要加上括号
代码实现:
int Currentvalue = (byte[0] << 8) + byte[1];
当返回数据为负数 -10时:
返回的两个字节数据16进制数是 0xFF,0xF6,这是因为负数在机器中存储为补码(详情搜补码)
返回的两个字节数据2进制数是1111 1111 1111 0110;
如果这个时候我们直接调用上面的代码实现,会发现它的值为65535,很明显值不对。
这是因为有无符号位的问题,此时应该将转化后的数值转化为有符号位的;
int Currentvalue =(short)( (byte[0] << 8) + byte[1]);
此时返回数值为-10,获取正常。
本文详细解释了如何在串口通信中正确解析返回的负数,涉及补码表示、字节合并和有符号整数转换,重点在于理解无符号位问题并提供代码示例。
747





