刘 彪,张进智,张 巧,王睿乔,李明乐,乔邦江
(1.国营长虹机械厂 电子车间,广西 桂林 541000;2.中国兵器装备集团制导航空弹药研究开发中心 导航室,湖南 长沙 410100)
随着科学技术的发展,串口通讯广泛应用在制导控制[1]、导航[2-3]、工业自动化[4]等领域,当前大多数仪器设备在进行数据的传输时,都采RS-232或RS-422串口通讯方式[5-7]。为了保证数据传输的保密性和正确性,很多仪器设备采用增加帧头、帧ID、帧长度、校验和、帧尾对数据进行封装;校验和包括单字节累加求和,CRC校验等。目前还没有形成统一、规范的通讯接口数据协议[8],因此,对于接收数据的测试显控系统设计而言,不同的设备必须对应不同的软件系统,给程序设计带来麻烦,花费大量人力、物力研制的软件系统只能应用于特定的系统,若用于其它系统的接收测试,必须进行重新设计,或者对代码进行大量的修改。这不仅增加了单位的人力、时间成本,还影响了单位的整体测试效率。
基于上述问题,研究并开发了一种通用的串口协议数据解析与显控系统。该系统分为协议自动生成软件和数据解析及显示软件。该系统将串行接口中传输的数据流协议与接收软件分离,可以根据使用需要,制定不同的通讯协议,再通过数据解析软件将串行接口中的数据流与协议匹配,将数据解析、记录并显示。
现以惯性导航系统为例,介绍一种协议的基本格式,如图1所示。
图1 协议的基本格式
帧头通常包含两个字符[9],用来判断一个数据包的开始,该文给出的帧头式是7E7E。帧长度一般是指除去帧头、帧长度本身、校验和之外的其它数据字节数。帧ID通常是判断输出的是哪一类数据包,由于相同接口,有可能输出不同的数据。以惯性导航系统为例,同一接口有可能输出Inertial Measurement Unit (IMU)的数据,比如角速度信息、加速度信息、温度信息等;也有可能输出惯导解算的数据,例如惯导时标、经度、纬度、高度、速度(北向、东向、地向)、姿态(俯仰、横滚、偏航)等信息,帧ID用来区分同一接口输出的不同数据包。校验和一般情况下包括单字节累加求和、CRC校验[10-11]等,单字节累加求和、CRC校验都是指除去帧头、帧长度本身、校验和之外的其它数据字节数的累加和或CRC,帧尾代表了一帧数据的结束[12-13],通常帧尾用0xcc表示。表1给出一帧完整的IMU数据协议。
表1 IMU协议
数据解包是从接收的数据流中拿出正确的数据帧,其中拿出一帧正确的数据,关键的是帧头、帧长度、帧ID和校验和四个字段;准确无误地解析出具体的数值(如X轴加速度),则需知道具体数据项的字节数、数据类型和当量LSB[14]。
在此,给出一种通用的数据协议解析算法,如图2所示,解析过程如下:
图2 解析算法示意图
定义三个缓存存储数据流pRXStrm、RXBuf和RXBuff,将待解析字节流中指定起始位置及数量的字节拷贝至临时字节数组中,即将缓存pRXStrm复制到缓存RXBuf里,定义两个位置索引变量CBP(已被放入解析缓存的字节数)和CBL(未被放入解析缓存的字节数),初始值都为0;对RXBuf里的数据流进行遍历,判断帧头,如果帧头匹配,将帧头存入RXBuff中,CBP+1,如若不匹配,停止,继续寻找帧头,直到匹配到帧头,当判断完整个RXBuf里的数据,没有匹配到帧头,跳出遍历,错误帧计数+1;判断帧ID,如果帧ID匹配,将帧ID存入RXBuff中,CBP+1,如若不匹配,停止,继续寻帧ID,直到匹配到帧ID,当判断完整个RXBuf里的数据,没有匹配到ID,跳出遍历,错误帧计数+1;判断帧长度,如果帧长度匹配,将帧长度存入RXBuff中,CBP+1,CBL=帧长度-CBP,循环将剩余字节存入RXBuff中,存入一个字节,CBP+1,CBL-1,直到CBL减为1,0,判断校验和、帧尾;全部匹配后一帧数据解析成功,帧长度、校验和、帧尾有一项匹配不成功,跳出循环,CBP置0,错误帧计数+1;依次类推,解析缓存里的所有数据。
这里设置两个缓存,是为了防止数据量过大,还没有解析缓存区就被覆盖的问题。
通常情况下,大多数单位都是根据特定的产品,制定相应的通讯协议,不同的产品配备了不同的通讯测试软件,协议更改后,必须重新修改程序解析代码[15],同时部分解析系统的解析算法通用性不高,解析稍微有变,整个数据处理段要进行大量修改与调试[16-17],浪费了大量的时间与精力。
该系统与其它系统最大的不同在于即使一个不懂编程的人,也可以使用该系统采集与测试多种不同设备的数据,为日常的数据采集与测试工作带来了极大便利。
该系统分为协议自动生成软件和数据解析及显示软件。系统软件采用C#语言,开发工具为VS2010,系统的工作流程如图3所示。
图3 协议生成与解析流程
协议自动生成软件根据功能可以分为:协议的编辑功能(包括主协议的编辑和位协议的编辑)、协议的保存功能、快速辅助生成协议功能、协议的读取功能、协议的修改功能。
该软件的协议编辑、修改和读取显示功能是基于DataGridView控件实现的,该控件支持大量的自定义和细致格式设置,具有灵活的大小调整和选择功能,同时还具备更好的性能及更丰富的事件模型。
为了方便操作人员编辑,该软件具有快速辅助生成协议功能,根据不同的关键字和字段数生成所需的协议,然后进行编辑,可以提高效率,辅助协议生成功能界面如图4所示。
图4 辅助协议勾选界面
以上关键字,可以根据待测设备协议自由配置,没有的字段可以不用勾选。勾选相应的关键字并填写字段数,协议就会在主界面显示出来;
点击主界面菜单,可选择进入协议编辑界面,用户在此界面可以制定所需的数据协议。
其中,界面上部为主协议编辑区,用户根据自身需求和界面编辑提示制定主协议各数据字段的数据要求。
界面下部为位协议编辑区,如果主协议中有数据字段需要位解析,则可以在主协议区勾选“是否位解”,并在本区进行位协议制定。
当协议编辑完成,确认无误后,可以点击保存协议按钮,协议将会保存为.xml文件,如图5所示。XML称之为元语言,它能够方便地表示结构化数据,自身具有的树形结构和节点之间的父子层级关系,可以很好地支持协议的增减替换,并对设备本身的协议按照字段分块,规定最小解析单位,使得XML可以作为描述和传输数据的主要手段。
图5 XML协议描述文件
解析协议的数据结构用于映射当前XML文件中的标签和标签中的属性值,并且按照XML文件中的标签顺序对解析节点进行排列组合。
协议以.xml格式保存在本地硬盘后,当点击打开协议文件选择以保存好的协议文件,该协议就可以显示在协议的编辑区,同时可以对该协议进行修改并保存,变化不大的协议可以稍微进行修改,而不需要重新编辑,以减少工作量。
数据解析及显示软件主要实现了数据协议框架文件的载入、数据协议显控界面动态生成、数据匹配正则表达式的生成、串口数据流实时解析与屏显、数据流记录和数据帧记录等功能。软件需和协议自动生成软件配套使用,数据协议框架文件的有效性由协议自动生成软件保证。
软件主界面如图6所示。
图6 数据解析及显示软件主界面
其中,界面左上部为串口参数配置区,用于配置数据接收串口参数。可配置波特率范围:9 600~921 600;校验位:奇校验、偶校验、无校验;数据位:6,7,8;停止位:1,1.5,2。
界面左中部为接口数据统计区,可以显示当前数据接口接收到的数据帧数量、数据帧校验错误计数、接收数据的字节数和发送数据的字节数。
界面左下部为时间显示区,显示当前系统的日期与时间,精确到秒。
界面中间为主协议数据显示区,最多可显示10种不同的数据帧。根据用户定义的协议内容,可显示数据协议中每一个字段的名称、值和度量单位。
界面右上部为位协议数据显示区,最多可显示3种位协议字段。当主协议中有需要位解析的字段时,用鼠标选中即可在本区显示该字段的位协议数据解析信息。
使用时,用户首先点击系统菜单,载入所需协议框架文件,弹出协议选择界面,如图7所示。
图7 协议框架文件载入界面
协议框架选择确认后,在图7所示界面点击“确定”按钮,即可将协议框架设定的内容在主界面的主协议数据显示区动态生成。与此同时,软件也会将选中协议框架的内容转换为数据解析时所需的匹配正则表达式。
将接收的数据字节填充到待匹配字符缓存区,遍历主协议成员项列表的集合,获取当前主协议成员项列表,解析正则表达式规则,获取匹配结果和匹配长度,判定返回值,如果返回值>0 (获取成功),获取当前校验和状态信息及校验和成员项是否存在,若存在,计算所匹配字节流的校验和,判定函数返回值>0(成功),分组依次判定校验和计算返回值长度(返回长度依次定义为1,2,4,8)。如果长度为1,判断校验和计算是否正确;如果长度为2,将校验和字节数组转化为短整型校验和并判断;如果长度为4,将校验和字节数组转化为整型校验和并判断;如果长度为8,将校验和字节数组转化为长整型校验和并判断,校验和正确,根据主协议成员项列表对匹配到的字节流数据进行解析,将解析后的主协议成员项列表中的数据项发送记录仪,进行保存。
位协议成员项数据解析方法:判定当前位成员项列表的初始化状态,若已初始化,获取当前位成员项的值,声明关键值数组和实际物理意义数组,获取当前位段的位长度(位)并初始化关键值掩码,根据当前位段的位长度,设置对应的关键值掩码,计算当前位段的关键值,获取当前位段关键值字符串和实际物理意义字符串,实例化正则表达式匹配类并进行匹配,匹配成功,将匹配结果存入关键值列表,匹配失败,跳出循环,遍历关键值列表和实际物理意义列表,解析位成员项数据,计算位成员项列表数据,屏显数据转换成指定格式的字符串值并显示在对应的控件中。
只要数据接口中有对应协议格式的数据流传输,软件便会自动将数据内容匹配解析并显示在主界面中对应的数据显示区域内。同时,软件也会自动将接收到的数据保存为数据文件,包括数据流原始数据与解析后的数据帧。
该文对某型惯性导航系统进行验证,通过本系统作为数据采集向终端设备发送命令,接收、解析并保存终端设备上发出的数据。终端设备可成功接收到来自本系统的数据和指令,且本系统可以接收到终端设备传输的数据且解析成功,并将解析的数据通过客户端进行展示,如图8所示。
图8 某型组合导航系统验证展示
该文对通用的协议组包和解析原理进行了深入的分析与研究,设计了一种通用串口数据协议解析与显控系统,系统可以在较大程度上提高串行接口数据解析相关领域的工作效率,降低了其技术门槛,真正意义上实现了协议与软件的分离。对任意一种新数据协议,该通用数据解析平台实现了不修改源程序代码,可以接收到不同的系统的数据输出,并进行显示。程序与导航系统、测量设备进行了实际的测试,实践证明,正确配置协议文件之后,都能收到正确的数据结果。用户使用该系统时,按照协议正确填写配置信息后,便能够与系统进行通讯。在设备验收与测试中, 具有很强的通用性。