通信协议编程思路,状态机理解及应用


【通信协议编程思路,状态机使用】

1. 拿到一个协议,首先对协议进行通读,熟悉以下几点:
1)明确协议数据传输结构:由那些数据内容组成;
2)消息传输模式:大小端,以及字节序列;
3)消息头及主要数据元素的定义;

2. 从数据层面来说,一个协议由元素、消息、服务组成一个数据帧,然后将数据帧进行发送;

3. 从功能层面来说,按照模块功能,将模块功能划分为不同的状态,每个状态负责某1个服务或者几个状态共同完成1个服务。
一般模块功能包括:初始态、登入态、数据上传、登出、休眠等状态组成;不同的状态里面处理不同的功能;
在嵌入式系统中,因实时性要求,各个状态里,又可划分为不同的子状态,即为保证程序能快速执行完成,将执行时间较长的任务划分为多个子任务,每轮只运行1个状态,避免耗时任务执行时占用CPU。

    举例如下:比如“吃饭”看作一个模块:

a. 初始态:准备原材料,面粉、蔬菜;
b. 制作:需要做菜和做饭,若灶具多的话,可同时炒菜和下面;若不足,则只能吵完菜后,再下面,也可调换顺序;
做菜:可分如下状态:摘菜、洗菜、切菜、炒菜、盛菜、洗锅;
做面:烧水、下面、捞面;
c. 吃饭:加入调味和蔬菜、吃饭

d. 洗锅:洗碗、清洗灶具;

    如上所示,将吃饭这个模块,划分为准备材料、制作、吃饭、洗锅等4个状态;而制作里又划分了做菜和做面的子状态;吃饭分成了加入调味和吃饭两个动作,所以系统运行时,每次只执行其中1个状态里的1个动作,系统需多次调用吃饭模块,直到洗碗状态执行结束,吃饭模块才算真正的执行完成。   

     (比如:若吃饭模块,只分初始、制作、吃饭、洗锅这4个状态,每个状态里面再无其他自状态,则系统需调用4次吃饭模块任务,才能完成吃饭模块执行完成;但这样做会产生某个状态执行时间较长,对导致系统中实时性高的模块不能即时调用,影响系统稳定性和可靠性。)

    总之,将耗时大的任务,尽可能的划分为多个子任务进行处理,避免长时间占用CPU资源;可配合时间片机制进行处理。

4. 从数据收发角度来说:数据有发送和接收;

发送数据:

            上行-将数据按照协议规定的格式打包 <== 单个帧插入队列进行发送 <== 帧组包:帧头+签名+消息(消息头+元素)+帧尾     <== 帧组包:按照服务协议拼接不同消息头和元素

注意:每个服务调用1个单独的函数,若有多个服务功能一致,则将共用的部分公用1个函数。

接收数据:

            即解析数据,(帧头、帧尾、校验、解密) ==> 获取接收的真实数据,然后判断跳转到需处理的模块单元进行处理。

5. 接收有主动接收和被动接收:
主动接收:发送查询请求命令,进行数据接收;
被动接收:由服务器随时的,直接下发数据进行接收。

你可能感兴趣的:(_13_通信协议)