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

电子说

1.2w人已加入

描述

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类型

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分