一种通讯框架思路

一种通讯框架思路--心血来潮写一点想法

概述

写这个思路框架的目的,主要为了后期搭建通讯框架用,我们经常看到小白写单片机通讯逻辑,非常混乱,其主要原因:
<1>写逻辑并未考虑框架,对框架无概念。
<2>对C语言或者C++语言并不熟悉。
<3>项目赶进度,无法标准化。
<4>其他… …

关于物联网的项目,其中大头都是协议方面的逻辑,一个好的通讯框架,不仅仅对项目维护、扩展起着非常关键的作用,还对项目的迁移或移植是非常有益的。

注:
此协议一般用于单片机或者嵌入式linux系统,当然也可以用于上位机通讯。

通讯协议

一般情况下,如果想要有一个好的框架,通讯协议内容应该也是非常严谨,且符合框架化的需求的。

基本协议应该包含:
<1>协议基本帧(头、尾、长度、功能码、特殊字段、校验等)
<2>协议的加/解密方式
<3>协议的压缩/解压方式
<4>协议规则的制定(一问一答机制,超时方式,登陆或登出等)
<5>其他… …

逻辑示意框图

如展示框图:这里把封包、解包与用户“组包逻辑list”分离,组包list内包含了文件组。(分离文件组的主要要原因是后期其他产品好移植)

封包/解包/压缩/解压
组包逻辑list
文件组
登陆数据逻辑
故障数据逻辑
实时数据逻辑
查找或设置数据逻辑
这块内容较多 可以分离更多的逻辑文件
补传数据逻辑
升级或文件传输逻辑
与FLASH存储逻辑相关API
与FLASH存储逻辑相关API
与其他应用程序逻辑的API

如展示框图:对于“封包/解包/压缩/解压”的前端补充。

数据物理层
队列
分离合法数据
封包/解包/压缩/解压
不合法进入报错回调函数
协议公共逻辑库<与协议文档有关>

关于收发逻辑流程图:
在这里插入图片描述

关于逻辑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
			{
              	//解析正确...
			}
		}
	}
...

后期会持续更新…(或许后续有机会会出个文件升级的库,用于上位机与下位机的通许,或者网络通讯,由于框架比较大,事情比较多,周期比较长;其次也要看大家的反馈,如果没人看,就放弃了,毕竟有需求才是主要动力)

结尾

如有问题,可以留言互相讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值