- 12
- 0
- 约 6页
- 2017-08-13 发布于安徽
- 举报
通信协议的面向对象实现方法
孙彩荚 王珏
中国电子科技集团公司第54研究所
摘要该文介绍了一种用状态图实现通信数据解包的方法,着重描述了对状态图及相关类的
分析设计过程.
关键词状态图 ooP 虚函数通信协议
c+0
1问题的提出
数据通信是测控工程中的重要组成部分。将数据流根据通信协议分解为数据帧是一
项基本的技术。虽然该技术实现原理简单,但因各项目的通信协议不同,该部分的实现代
码因项目不同而异,代码无法复用:另外,如果通信协议因某种原因作了改动,相应代码
的改动不仅烦琐,而且容易出错。因此有必要用~种通用的方法实现不同项目的数据流分
解功能。
将数据流截为数据帧的基本的方法为:
(1)取数据流中的一字节,判断其是否为协议规定的帧头标识符,若是,则保留该
字节并标记已收到帧头,否则丢弃该字节。
(2)接着取下一字节,根据协议及当前标记的状态,决定该字节保留还是丢弃,并
设置接收新字节后所处的状态。
(3)藿复第2步,直到接收的数据与通信协议完全符合,表示从数据流中截出了一
帧数据。
(4)重复以上步骤,直到数据流处理完毕。
由上面的处理过程看出,某一字节的意义不仅与字节本身的值有关,而且还决定于它
在通信协议中的位置(在处理过程中,表现为当前所处的状态)。如,从数据流中取得一
字节,值为0x01,若当前处于等待帧头状态(设帧头为0xeb),则需丢弃该字节;但,若
当前处于接收数据值状态,则该字节有效,需保留。在当前状态,根据不同的输入进入不
同的新状态,正是状态图表示的内容,因此上述处理过程适合用状态图来表示。设某通信
协议如下:
0xEB 0x90 时间 数据
I 1 l I I I
f字节数f i f l f 3 l X f
根据该协议,从数据流中检出数据帧的过程可由图】所示的状态图表示。
状态转换图的初始态为空闲态~一IDLE,接收到字符后转入下一状态。图1中,
在状态0(IDLE态)收到字符0xEB后,转入状态1,否则仍保持在状态O;在状态2,
收到任一字符均转入状态3;在状态3连续接收(3+x)字节后,根据再接收的字符值,
转入状态0或状态l。在该状态图中,每次从状态3跳出时(用粗线条表示),即表示检
出一帧与上述协议相符的数据。
非
田l秋态转换田
2用面向对象的方法分析状态图
面向对象技术是一种模拟真实世界的方法,采取一致且自然的模型化方式所塑造的
模型与真实世界直接对应,容易让管理者和用户了解,并可随真实世界环境的变动增减系
统中的对象或屑性,适应复杂多变的各类型信息系统。面向对象技术的可重用特性,使软
件开发相对简单灵活,不但可节省时间、提高效率,而且可以提高软件的质量。
面向对象程序设计的本质是把数据和处理数据的过程当成一个整体一一对象。面向对
象程序设计有三大特性:(1)数据封装(data
其中,继承性和多态性的组合,可以生成一系列虽类似但独一无二的对象。
状态图由各状态节点和节点之间的转换关系组成。根据以上OOP精神,把状态节点
作为对象,节点之间的转换即是对象的方法;把状态图作为对象,其方法包括接收数据流
进行处理和输出数据帧。要用状态图完各地描述数据流分解过程,显然。必须有三类节点:
(1)空闲态:表示初始状态及收到非所期字符时所处的状态:(2)特定字节态:表示当
前收到指定字符;(3)字节数累计态:连续接收N个字节,字节数值任意。图1中,节
点0为空闲态,节点1和节点2为特定字节态,节点3为字节数累计态。它们的共同特点
是都表示某种状态,在特定的输入条件下,都能在本状态节点和其它状态节点之间转换。
据此,我们可以抽象出5个类:(1)状态图类,(2)状态节点类。(3)空闲状态节点
类,(4)特定字节状态节点类,(5)字节数累计状态节点类。他们之间的关系为:后3个
类为从状态节点类派生出的子类;状态图对象包括若干状态节点对象,如图2所示。
原创力文档

文档评论(0)