一种通讯框架思路--心血来潮写一点想法
概述
写这个思路框架的目的,主要为了后期搭建通讯框架用,我们经常看到小白写单片机通讯逻辑,非常混乱,其主要原因:
<1>写逻辑并未考虑框架,对框架无概念。
<2>对C语言或者C++语言并不熟悉。
<3>项目赶进度,无法标准化。
<4>其他… …
关于物联网的项目,其中大头都是协议方面的逻辑,一个好的通讯框架,不仅仅对项目维护、扩展起着非常关键的作用,还对项目的迁移或移植是非常有益的。
注:
此协议一般用于单片机或者嵌入式linux系统,当然也可以用于上位机通讯。
通讯协议
一般情况下,如果想要有一个好的框架,通讯协议内容应该也是非常严谨,且符合框架化的需求的。
基本协议应该包含:
<1>协议基本帧(头、尾、长度、功能码、特殊字段、校验等)
<2>协议的加/解密方式
<3>协议的压缩/解压方式
<4>协议规则的制定(一问一答机制,超时方式,登陆或登出等)
<5>其他… …
逻辑示意框图
如展示框图:这里把封包、解包与用户“组包逻辑list”分离,组包list内包含了文件组。(分离文件组的主要要原因是后期其他产品好移植)
如展示框图:对于“封包/解包/压缩/解压”的前端补充。
关于收发逻辑流程图:
关于逻辑C语言伪代码
用于列表程序的结构体
typedef struct _ProtocolReceiveDataTree
{
u16 id;
int (*ProtocolReceiveDataProc)(u8* bufData, u8 serialNum);//返回值是数据的长度
}
ProtocolReceiveDataTree;
typedef struct _ProtocolSendDataTree
{
u16 id;
int (*ProtocolSendDataProc)(u8* bufData);//返回值是数据的长度
}
ProtocolSendDataTree;
#define PROTOCOL_RECEIVE_DATA_TREE_MAX 你的列表个数
const ProtocolReceiveDataTree protocolReceiveDataTree[PROTOCOL_RECEIVE_DATA_TREE_MAX]=
{
{0xXXXX,ProtocolReceiveDataXXXX},
......
};
#define PROTOCOL_SEND_DATA_TREE_MAX 你的列表个数
const ProtocolSendDataTree protocolSendDataTree[PROTOCOL_SEND_DATA_TREE_MAX]={
{0xXXXX,ProtocolSendDataXXXX},
......
};
//用于组包的list表处理
...
//填充数据单元
for(u8 i = 0; i < appProtocolTemp.funcodeTotal; i++)
{
funcodecmd = appProtocolTemp.funcode[i];
memcpy(&secretBeforeBuf[posLen], (u8*)&funcodecmd, 2);
posLen += 2; //数据长度增加2
for(int j=0; j<PROTOCOL_SEND_DATA_TREE_MAX; j++)
{
if(protocolSendDataTree[j].id == funcodecmd)
{
int err = protocolSendDataTree[j].ProtocolSendDataProc(&secretBeforeBuf[posLen]);
if(err<0)
{
//错误
}
else
posLen += err;
break;
}
if(j == PROTOCOL_SEND_DATA_TREE_MAX)
{
break;
}
}
}
...
//用于接受的list表处理
...
for(int j=0;j<PROTOCOL_RECEIVE_DATA_TREE_MAX;j++)
{
if(protocolReceiveDataTree[j].id == appProtocolTemp.funcodeResponse[i])
{
int err = protocolReceiveDataTree[j].ProtocolReceiveDataProc(&decodeLaterBuf[解码长度],i);
if(err < 0)
{
//解析有问题...
}
else
{
//解析正确...
}
}
}
...
后期会持续更新…(或许后续有机会会出个文件升级的库,用于上位机与下位机的通许,或者网络通讯,由于框架比较大,事情比较多,周期比较长;其次也要看大家的反馈,如果没人看,就放弃了,毕竟有需求才是主要动力)
结尾
如有问题,可以留言互相讨论。