本帖最后由 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单片机,这里的链表结构就可以改成数组
比如对于数据格式比较复杂的 可以采取职责链的方式。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
请教一下楼主,楼主主要参考了哪些书籍和资料?
一周热门 更多>