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类型
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
上位机
+关注
关注
26文章
861浏览量
54054 -
char
+关注
关注
0文章
11浏览量
3509 -
memcpy
+关注
关注
0文章
9浏览量
2791
发布评论请先 登录
相关推荐
想实现unsigned char和double的转换,为什么DSP仿真一直不对?
请教数据类型转换问题,处理器类型:ADSP21479,编译器visual DSP 5.0。
想实现unsigned char和double的转换(因为从外部接口接收到的是
发表于 01-11 08:29
unsigned char code seg[] 什么意思?
unsigned char code seg[]nusigned 是无字符char是数据类型seg 是变量名code 是什么意思??我不明白unsi
发表于 04-13 12:57
unsigned char型数据加上48却得到了42!
如题!今天做单片机串口传送,结果定义的一个unsigned char型数据加上48!然后从串口发到电脑就变成了42!这是为什么啊?
发表于 04-04 15:22
统一通信平台和传真的联合增值
时间、任何地点,都可以通过任何设备、任何网络,获得数据、图像和声音的自由通信。也就是说,统一通信系统将语音、传真、电子邮件、移动短消息、多媒体和数据等所有信息
发表于 01-13 13:09
将unsigned char类型的数据存入unsigned char code dis1[]中,求各位指点
# include # include typedef unsigned char BYTE;BYTE n=8;BYTE code dis1 []=n;想达到直接写BYTE code dis1
发表于 07-22 10:43
如何用串口传输float类型数据
提取时,要把数据从16进制转到10进制,float 转 unsigned char :在发送数据时,要把数据从10进制转到16进制,再通过u
发表于 01-19 06:12
单片机延时函数unsigned int为什么不能替换unsigned char?
上升沿延时约15~60us
想把两个延时Delayus(150);合并成一个Delayus(300);
因为unsigned char范围是0-255,所以想用unsigned in
发表于 10-17 06:21
char 与unsigned char在嵌入式开发中的区别
嵌入式中数据采集的最小单位为8bit或者8bit的倍数,在嵌入式中char buf[ ]指的就是字符串,也就是所谓的字符空间,转换成ascii码是有符号数unsigned char b
发表于 11-03 10:06
•9次下载
字符型char和整型int之间的关系
在C语言中并没有char类型的常量(但是在C++中却有,字符常量都是char类型),其实是用int表示char,字符型与整型相比只是更加节省
发表于 01-13 15:22
•1次下载
评论