版权声明:本文为博主原创文章,未经博主允许不得转载,转载请设置文章链接! https://blog.csdn.net/qq_30460905/article/details/90720518
学C时欠的债,迟早是要还的。。。基础知识都忘了
char为字符类型(-128-127),超过127就会溢出,unsigned char为无符号字符类型(0-255),二者均为一个字节。
当char类型的值为正时,转换后的值为原值。
当char类型为负时,原始值的符号位会转为数据位,即结果值为原始值补码代表的无符号值。
具体计算公式为,结果值=256+原始值。
参考链接:https://zhidao.baidu.com/question/487910754.html
1、问题介绍
在使用串口读取数据之后,需要读取转换的数据,开始没注意数据类型,发现int(char)后为负数,16进制打印出来如下
data[0]: 0x55
data[1]: 0xffffffaa
data[2]: 0x3
data[3]: 0xffffff84
data[4]: 0x1
data[5]: 0x2
data[6]: 0x1
部分程序如下
#include "serial/serial.h"
string rec_buffer; //串口数据接收变量
string port("/dev/ttyUSB0");//串口号
unsigned long baud = 115200;//小车串口波特率
serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000));//配置串口
rec_buffer =my_serial.read(my_serial.available()); //获取串口发送来的数据
const char *receive_data=rec_buffer.data(); //保存串口发送来的数据
加入强制类型转换,将receve_data,转化为无符号指针 b:
参考链接:https://blog.csdn.net/igaming/article/details/25978235
unsigned char *b;
b = (unsigned char *)receive_data;
连接两个字节的数据,高位数据左移八位加上地位数据,注意加上括号,加号优先级高于位移符号:
int distance;
cout<<"b4: "<<int(b[4])<<" b5: "<<int(b[5])<<endl;
distance= (b[4]<<8)+b[5];
cout<<"distance: "<<distance<<endl;