澳门赌场欠钱能回来吗登入: 雕虫小技 --- 结构体的一个简单应用

永利游戏开户直营
354|4
楼主
假如我们需要使用单片机的串口与外设模块通讯,串口的通讯协议如下图所示,我们可以怎么设计这个数据结构以方便单片机操作从串口接收或者发送的数据呢。


这里,我介绍两种方法,一种是使用数组来构建满足协议的数据结构,另一种是使用结构体来构建满足协议的数据结构,我们看看哪种方法更适合处理上述问题。

首先看看使用数组来构建数据结构的方法,如下代码所示。

  1. //用于存放6个字节的协议数据
  2. unsigned char arr[6];
  3. unsigned char len;

  4. len = sizeof(arr);
  5. //当串口缓冲区(假设是一个名为ser的数组)来了数据后,我们需要把串口数据复制到arr数组中
  6. memcpy(arr, ser, len);

  7. //拷贝完成后,我们需要校验、检查这些数据
  8. unsigned char sum = 0;
  9. unsigned char *p;

  10. p = arr;
  11. while(--len> 0)
  12. {
  13.   sum += *p++;
  14. }

  15. //校验
  16. if(sum == arr[5])
  17. {
  18.   //检查收到的数据ID是否是我的目的ID
  19.   if(arr[0] == 0x01 && arr[1] == 0x02 && a[2] == 0x03)
  20.   {
  21.      //检查类型,确认是否是我的目标类型
  22.      if(arr[3] == 0x05)
  23.      {
  24.        //检查事件并做相应的动作.....  
  25.      }
  26.   }   
  27. }
复制代码

从上述代码可以看出,对于接收到数据保存在arr后,需要指定索引才能准确的引用你需要的字节数据,这样做除了不方便以外,还容易出错。假如此时串口协议变更,比如我们需在ID3与类型之间扩充一个字节,此时你的代码肯定要改动,因为arr数组中arr[3]对于的位置已经不是类型了,arr[5]对应的也不是校验和了。显然,这种方法虽然可以用来处理串口数据,但是扩展性不好,程序引用相应的数据也不方便。那怎么办呢,用结构体就可以很好的解决这些问题,我们先来看代码。

  1. typedef struct
  2. {
  3.   unsigned char id[3];
  4.   unsigned char type;
  5.   unsigned char event;
  6.   unsigned char sum;   
  7. }pro_t;

  8. pro_t pro;
  9. unsigned char len;

  10. len = sizeof(pro_t);
  11. //当串口缓冲区(假设是一个名为ser的数组)来了数据后,我们需要把串口数据复制到pro结构体中
  12. memcpy((unsigned char *)&pro, ser, len);

  13. //拷贝完成后,我们需要校验、检查这些数据
  14. unsigned char sum = 0;
  15. unsigned char *p;

  16. p = (unsigned char *)&pro;
  17. while(--len > 0)
  18. {
  19.   sum += *p++;
  20. }

  21. //校验
  22. if(sum == pro.sum)
  23. {
  24.   //检查收到的数据ID是否是我的目标ID
  25.   if(pro.id[0] == 0x01 && pro.id[1] == 0x02 && pro.id[2] == 0x03)
  26.   {
  27.      //检查类型,确认是否是我的目标类型
  28.      if(pro.type == 0x05)
  29.      {
  30.        //检查事件并做相应的动作.....  
  31.      }
  32.   }   
  33. }
复制代码

从上述代码可以看出,程序引用协议数据相比数组结构更为方便而且清晰不易出错,当需要在ID3以及类型之间插入一个字节时,我们只需要更改pro_t类型的数据结构,而不需要变更我们已经写好的程序,如下图所示。

  1. typedef struct
  2. {
  3.   unsigned char id[3];
  4.   unsigned char extend;
  5.   unsigned char type;
  6.   unsigned char event;
  7.   unsigned char sum;   
  8. }pro_t;
复制代码

综合来看,为了更好的让单片机的程序组织或者引用协议数据,使用结构体要比使用数组更好,不论从清晰,方便以及可扩展上都更具优势。





沙发
 楼主 | 2020-3-22 16:36 | 只看该作者
板凳
| 2020-3-23 13:04 | 只看该作者
记得以前看到 过程编程的概念       软件=数据+算法
从很多编程语言来看,偏向数据的语言,面向对象搞起,组件编程搞起。
偏向算法的语言,来自学院派的函数式编程,居然抵触变量数据。适合并发。

从c语言的角度,写软件库,都是围绕一个结构来了。
typedef struct
{
} pro_t;
然后:
init(pro_t *p)
do_something(pro_t *p,....)
地板
| 2020-3-23 13:44 | 只看该作者
通信中本来就大量使用结构体去组包呀,还是各种,union里面包结构体,
5
| 2020-3-24 17:20 | 只看该作者
又学了一招。
扫描二维码,澳门赌场欠钱能回来吗登入:随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

澳门赌场欠钱能回来吗登入: 热门推荐

永利游戏开户直营 快速回复 返回顶部 返回列表
博彩娱乐城棋牌下载 菲律宾申博太阳城手机APP游戏下载 澳门太阳城福彩3D时时彩平台怎么样 禁赌吧 澳门威尼斯人度假村酒店要门票吗网上娱乐场
鸿运国际类似登入 澳门百老汇怎么去网上娱乐场 www vinbet com网登入 申博开户优惠现金网网上娱乐场 武汉乐百家有限公司
申博游戏手机版手机APP下载 天空赌场 太阳城现金直营网现金网 大发在线扑克是亚洲最好的网登入 去菲律宾开赌场
pt50线对J高手登入 太阳城 狗粮登入 老虎机支付宝充值 菲律宾新濠赌场 博彩公司网址大全登入