0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

收发通信数据时应统一用unsigned char类型

冬至子 来源:吾爱单片机 作者:echigh 2023-05-25 11:39 次阅读

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

    char是什么数据类型

    数据代码char
    油泼辣子
    发布于 :2023年11月16日 16:58:00

    统一用户管理在校务管理系统中的实施

    和安全性。_ll为此中山大学在建设新代校务管理系统的过程中。提出了“五个统一”:统一数据库。统一标准、统一开发平台、
    发表于 10-10 15:22

    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

    charunsigned char在嵌入式开发中的区别

    嵌入式中数据采集的最小单位为8bit或者8bit的倍数,在嵌入式中char buf[ ]指的就是字符串,也就是所谓的字符空间,转换成ascii码是有符号数unsigned char b
    发表于 11-03 10:06 9次下载
    <b class='flag-5'>char</b> 与<b class='flag-5'>unsigned</b> <b class='flag-5'>char</b>在嵌入式开发中的区别

    字符型char和整型int之间的关系

    在C语言中并没有char类型的常量(但是在C++中却有,字符常量都是char类型),其实是用int表示char,字符型与整型相比只是更加节省
    发表于 01-13 15:22 1次下载
    字符型<b class='flag-5'>char</b>和整型int之间的关系

    C51各种类型的大小

    目录各种类型所占空间(字节为单位)各类型大小各种类型所占空间(字节为单位)unsigned char is 1signed
    发表于 01-13 15:27 0次下载
    C51各种<b class='flag-5'>类型</b>的大小

    Char数组与String是如何从统一走向分离的?

    在很多编程语言中,经常用 String 类型来表示字符串,用 Char 来表示字符类型
    发表于 05-19 09:49 111次阅读
    <b class='flag-5'>Char</b>数组与String是如何从<b class='flag-5'>统一</b>走向分离的?

    SystemC中的数据类型概念

    语言的扩展,SystemC支持所有C++的数据类型,包括long、int、short、charunsigned long、unsigned int、
    的头像 发表于 11-02 15:44 423次阅读
    SystemC中的<b class='flag-5'>数据类型</b>概念

    char是有符号类型还是无符号类型

    看一个C语言的笔试题,题目很简单,问char是有符号类型还是无符号类型
    的头像 发表于 03-17 10:15 345次阅读