OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5770|回复: 12

在51和STM32单片机上使用面向对象的编程,第四篇:数据流处理

[复制链接]

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
发表于 2018-5-26 11:47:16 | 显示全部楼层 |阅读模式
本帖最后由 safu枫 于 2018-5-28 15:19 编辑

我曾经看过ZIGBEE的代码,里面的网络层的数据处理看起来,那叫一个爽!
[mw_shl_code=c,true]swtich(x)
{
   case:.....brealk;
   ..
   swtich(x)
  {
  swtich(X)....;
  }
}[/mw_shl_code]
反正就是各种SWITHC嵌套,这样的结果就是 导致代码的维护和扩展贼头疼,因为你需要一层一层的嵌套进去看,而且这种结构耦合性强,
比如你前面改一点 就可能导致后面的程序完全乱了,那我们该如何写出一种逻辑清楚,拓展维护方便的 数据处理 软件结构呢?
其实我也是做尝试咯,所以大家有什么建议欢迎交流;
我的思路是这样的,首先是创造各种各样的数据帧类,其中包括该数据帧的初始化,关键字,和该数据帧的处理函数;
然后收到数据就对这些数据帧对象一一调用判断,关键字对比,如果对比结果为真,则调用该数据帧的处理函数进行处理;
[mw_shl_code=c,true]typedef struct CLASS_NWK_DataFrame //数据帧类
{
  void (*Greate_DataFrame)(struct CLASS_NWK_DataFrame * p);//创建初始化函数
  void (* NWK_HandleFun)(u8 *pBuf);                                       //数据处理函数
  u8 (*const ContrastData)(struct CLASS_NWK_DataFrame * p, u8 * DataBuf);      //关键字对比函数
  u8 _FrameDataBuf[30];
}typ_CLASS_NWK_DataFrame;

typedef struct ReceiveFram
{
  u8 DataHead;
  u8 LEN;
  u8 DateLen;
  u8 CommandID;
  u8 FCS;
  u8 DataTail;
}typ_ReceiveFram;[/mw_shl_code]


[mw_shl_code=c,true]void NWK_CMD1_GreateDataFrame(struct CLASS_NWK_DataFrame * p)
{
  typ_ReceiveFram * pFrame = (typ_ReceiveFram *)p->_FrameDataBuf;
  pFrame->LEN = 6;                 //填写一些关键词作为校验对比
  pFrame->CommandID = NWKCMD_1;
  pFrame->DataTail = 0xEF;
  p->NWK_HandleFun = NWK_CMD1_HandleFun; //把该数据帧对应的处理函数添加
  list.AddList(&NWKFarme_ListHead,p);  //需要添加链表结构
}u8  NWK_GeneralContrast(struct CLASS_NWK_DataFrame * p, u8 * pDataBuf)      
{
  u8 ST = 0;
  typ_ReceiveFram * pFrame = (typ_ReceiveFram *)pDataBuf;
  static u8 DataHead = 0;
  static u8 LEN = 1;
  static u8 CommandID = 3;
  if(pFrame->DataHead == pDataBuf[DataHead])   //对比数据
  {
    ST = 1;
  }

  if(ST == 1)
  {
    if(pFrame->LEN == pDataBuf[LEN])
      ST = 2;
  }

  if(ST == 2)
  {
    if(pFrame->CommandID == pDataBuf[CommandID])
    {
      ST = 3;
    }
  }
//  printf("ST:%d\r\n",ST);
  if(ST == 3)
    return TRUE;
  else
    return FLASE;
}
void NWK_CMD1_HandleFun(u8 *pBuf)                                       //具体的处理函数
{
   printf("接收到CMD1,开始处理\r\n");
}
void NWK_ProcessIncoming(u8 *pBuf)
{
  typ_ListNode * p_temp= &NWKFarme_ListHead;
  typ_CLASS_NWK_DataFrame * pFarme;
  while(p_temp != NULL) //±éàúá′±í
  {
    pFarme = (typ_CLASS_NWK_DataFrame *)p_temp->pNode;
    if(pFarme->ContrastData(pFarme,NWK_Buf) == TRUE)//调用对比函数
    {
      pFarme->NWK_HandleFun(NWK_Buf);//调用处理函数
      return ;
    }
    else
      p_temp = p_temp->Next;
  }
}[/mw_shl_code]


写到这里就差不多了,如果需要增加或者修改数据帧 非常方便,只要按照这个模板添加函数就好了,
这里 根据不同的项目 可以进行增减代码,这里只是说明了一下大致框架和思路,比如对于51单片机,这里的链表结构就可以改成数组
比如对于数据格式比较复杂的 可以采取职责链的方式。。。





改良版职责链.rar

6.9 MB, 下载次数: 871

网络层数据处理.rar

5.91 MB, 下载次数: 815

职责链.rar

5.79 MB, 下载次数: 210

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

58

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2387
金钱
2387
注册时间
2017-1-15
在线时间
318 小时
发表于 2018-5-28 15:07:58 | 显示全部楼层
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-28 18:38:55 | 显示全部楼层

忘记上传工程了,你可以下载看一下
回复 支持 反对

使用道具 举报

0

主题

58

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2387
金钱
2387
注册时间
2017-1-15
在线时间
318 小时
发表于 2018-5-31 09:03:42 | 显示全部楼层
safu枫 发表于 2018-5-28 18:38
忘记上传工程了,你可以下载看一下

好的 谢谢 我会一直关注你的新作
回复 支持 反对

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2018-5-31 11:01:29 | 显示全部楼层
mark,有时间慢慢看
回复 支持 反对

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2036
金钱
2036
注册时间
2017-12-11
在线时间
454 小时
发表于 2018-5-31 15:15:10 | 显示全部楼层
很欣赏楼主的代码以及钻研精神 ,至少看上去很简洁明了(还没时间细看,想有时间好好研究下楼主的代码)。
请教一下楼主,楼主主要参考了哪些书籍和资料?
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-31 16:01:21 | 显示全部楼层
bootblack 发表于 2018-5-31 15:15
很欣赏楼主的代码以及钻研精神 ,至少看上去很简洁明了(还没时间细看,想有时间好好研究下楼主的代码)。
...

参考了《C现代编程》《大话设计模式》,还有自己的胡思乱想 拉拉
回复 支持 反对

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2018-12-24 01:56:28 | 显示全部楼层
非常巧妙,用C来实现类似C++的代码。
我最近在MDK里面用C++来写STM32的代码,LZ有试过的话,麻烦提点一下有什么坑需要注意的?
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-12-24 16:48:13 | 显示全部楼层
brucewoo 发表于 2018-12-24 01:56
非常巧妙,用C来实现类似C++的代码。
我最近在MDK里面用C++来写STM32的代码,LZ有试过的话,麻烦提点一下 ...

C++不太熟悉,但是使用这种方式 内存开销可能要大一点, 另外就是不要为了设计模式而设计模式,还是要根据项目具体情况选择合适方式
回复 支持 反对

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-12-24 19:27:14 | 显示全部楼层
safu枫 发表于 2018-5-31 16:01
参考了《C现代编程》《大话设计模式》,还有自己的胡思乱想 拉拉

大话设计模式很赞啊。
回复 支持 反对

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2018-12-25 03:36:20 | 显示全部楼层
safu枫 发表于 2018-12-24 16:48
C++不太熟悉,但是使用这种方式 内存开销可能要大一点, 另外就是不要为了设计模式而设计模式,还是要根 ...

因为需要写一个简单的GUI,所以用C++的类在进行组织会简练很多。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-4-21
在线时间
14 小时
发表于 2019-5-13 21:45:48 | 显示全部楼层
说实话,你这程序看起来高大上,但是项目大起来的话,追求的是速度实时性,你这样面向对象绕来绕去开销特别大,我一个简单的按键程序一下子就扫描完了,像你这样半天都响应不了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-4-21
在线时间
14 小时
发表于 2019-5-13 21:47:08 | 显示全部楼层
如果面向对象编程好用的话ST官方早就请工程师写面向对象的例程库了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 22:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表