电子说
1、统一用unsigned char不容易出错。另外在VS里面,有个定义:
//在WINDEF.H中被定义
typedef unsigned char BYTE;
因此上位机有的人用BYTE类型来收发数据也行
2、我看有同事用char类型接收,语法上来说char默认是signed char
我只能说强制类型转换过程是有可能修改内存数据的,虽然实测unsigned char转为signed char不会修改内存数据,只是变量解析方式变了,但是这个习惯不好,比如unsigned char转float就会修改内存数据,当然如果用修改指针类型方式则不会修改内存数据(修改指针类型方式的方式其实是在做内存拷贝)。以下为验证代码:
unsigned char rev_buffer[8] = { 0 };
memset(rev_buffer,0,8);
rev_buffer[0] = 0xfe;
printf("%2x\\r\\n", rev_buffer[0]);
signed char sc_rev_buffer_temp[8];
//直接拷贝内存数据。打印signed char类型会出来4个字节是printf函数里面做的
memcpy(sc_rev_buffer_temp, rev_buffer, 8);
printf("%x ", sc_rev_buffer_temp[0]);
printf("%d\\r\\n", sc_rev_buffer_temp[0]);
//unsigned char强制转换为signed char类型
sc_rev_buffer_temp[0] = (signed char)rev_buffer[0];
printf("%x ", sc_rev_buffer_temp[0]);
printf("%d\\r\\n", sc_rev_buffer_temp[0]);
float f_rev_buffer_temp;
unsigned char uf_rev_buffer_temp[8];//辅助打印
//直接拷贝内存数据
memcpy(&f_rev_buffer_temp, rev_buffer, 8);
memcpy(uf_rev_buffer_temp, &f_rev_buffer_temp,8);
printf("%x ", uf_rev_buffer_temp[0]);
printf("%d\\r\\n", uf_rev_buffer_temp[0]);
//用指针操作类型,不会修改内存数据
f_rev_buffer_temp = *(float*)(&rev_buffer[0]);
memcpy(uf_rev_buffer_temp, &f_rev_buffer_temp, 8);
printf("%x ", uf_rev_buffer_temp[0]);
printf("%d\\r\\n", uf_rev_buffer_temp[0]);
//用类型强制转换,会修改内存数据
f_rev_buffer_temp = (float)(*(long long*)(&rev_buffer[0]));
memcpy(uf_rev_buffer_temp, &f_rev_buffer_temp, 8);
printf("%x ", uf_rev_buffer_temp[0]);
printf("%d\\r\\n", uf_rev_buffer_temp[0]);
getchar();
3、如果收发过程是从buffer里面memcpy拷贝数据的话(用memcpy而不是直接等于),并且后续使用也是按字节拷贝的话,那就无所谓容器的数据类型问题。因为按字节拷贝的话,容器只提供一个首地址,不会改变内存数据
总结规范:收发数据统一用unsigned char类型
全部0条评论
快来发表一下你的评论吧 !