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

2019-07-21 01:31发布

本帖最后由 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 ",ST);
  if(ST == 3)
    return TRUE;
  else
    return FLASE;
}
void NWK_CMD1_HandleFun(u8 *pBuf)                                       //具体的处理函数
{
   printf("接收到CMD1,开始处理 ");
}
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单片机,这里的链表结构就可以改成数组
比如对于数据格式比较复杂的 可以采取职责链的方式。。。





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
lf19880813
1楼-- · 2019-07-21 07:07
顶楼主 学习了
safu枫
2楼-- · 2019-07-21 10:01
 精彩回答 2  元偷偷看……
lf19880813
3楼-- · 2019-07-21 12:50
safu枫 发表于 2018-5-28 18:38
忘记上传工程了,你可以下载看一下

好的 谢谢 我会一直关注你的新作
gotofly21
4楼-- · 2019-07-21 17:18
mark,有时间慢慢看
bootblack
5楼-- · 2019-07-21 19:34
很欣赏楼主的代码以及钻研精神 ,至少看上去很简洁明了(还没时间细看,想有时间好好研究下楼主的代码)。
请教一下楼主,楼主主要参考了哪些书籍和资料?
safu枫
6楼-- · 2019-07-22 00:25
 精彩回答 2  元偷偷看……

一周热门 更多>