基于Moxa动态库的同步卡调试器设计
扫描二维码
随时随地手机看文章
项目中多套测量设备相距较远,通讯时外接同步调制解调器。在仿真执行时往往条件不具备,联试时较困难。监控软件本文不予讨论,为了在联试中能快速分离出通讯双方的对错,作者设计了这款调试器,另一个目的就是在无调制解调器时辅助开发人员快速开发出监控软件,该调试器可以仿真通信任意一方。设计目标为:调试器可以灵活定制通讯规程,设备端口一旦初始化完成。可以自动接收对方信息,允许十六进制显示原码,可以显示接收次数、长度。己方发送时可以依字节形式或字符形式发送。如果是字节形式,允许定制任一字节内容,允许定时发送,可以设定发送长度等。
2 具体实现
根据这一需求,作者使用Delphi 7.0开发这款软件。首先定制界面,该部分较简单,略之。关键部分如下:设备初始化及I/O,十六进制显示,十六进制输入。为了做到通用性,作者重新改写了Moxa的库函数,精简为如下几条函数:
设备打开函数;设备读函数;设备写函数;设备刷新函数;设备关闭函数。
设备打开是关键,该函数综合了Moxa库中的几个函数,规格定制以参数形式提供。主要代码如下(注意Uses部分应包含Moxa的Syncapi.bas库):
HDLC通信是同步通信方式,CRC校验是必须的,另一方面,在实际应用中,通信双方都要使用外时钟,而开发阶段一般使用内时钟,所以本初始化函数将时钟方向作为参数设置。
十六进制显示Delphi提供了BinToHex函数,但这只显示单个数值成十六进制形式。作者另编了一函数,可以显示一缓冲区内容,并且以规范的形式显示。例如:73 AB4D 5F。
十六进制输入较麻烦,制作如下:在界面上定制一StringCrid组件,定制格子为2行1 024列,每个格子可以输入2个字母大小,上一行在FormCreat()消息中填充为序号数,下一行用于定制十六进翻显示输入。
(1) 定制该格子的KeyPress消息,用集合类检查输入该格子的是否是十六进制字符,如果不是,给出提示。
(2) 定制该格子的StringGridlSetEditText消息,判断输入字符串是否大于2,如果是,不予理睬。该方法保证输入字符串是规范的十六进制形式,例1A 5F 4D 3401 7E。
3 发送机制设计
发送设计为线程,该线程等待发送事件,该事件由用户按钮或定时消息触发,线程流程为:
Do While True Begin
判断线程是否退出,如退出结束该线程;
如不退出,永远等待发送事件,该事件设计为无名手工复位的简单事件,事件置位由界面发送按钮或定时期器触发;
如等到该事件,复位该事件,填写发送缓冲内容,调发送函数,完成发送,发用户消息告知前台发送完成;
End;
4 接收机制设计
接收亦设计为线程,该线程睡眠10 ms读端口,如果读不到或者读错误,调陷阱代码处理,如读到发用户消息给前台,读入缓冲传给前台缓冲供前台显示,显示形式由界面决定(十六进制或字符)。
5 用户消息处理
前台用户消息为读完成和写完成消息,前台用户消息完成显示或者存储操作,根据界面选择框确定显示形式(char or byte),读人次数,读入长度,是否要求永远显示(可以常时间监视),是否要求存储文件。
6 其他设计部分
(1) 设计一编辑控件,可以输入发送长度。
(2) 设计一无线电按钮组,用于判断是字符形式或字节形式输入。
(3) 定制收、发字节长度,次数显示,定制状态条各种提示符等。
(4) 设计一发送按钮,完成发送缓冲区填充,并调发送函数发送之。
(5) 设计一Timer组件,间隔可以定制,调发送按钮完成定时发送。
(6) 设计该调试器的陷阱处理部分,处理可能的异常。如突发硬件异常事件、显示、异常大数据处理等。
(7) 设计该调试器的接收信息存储部分,允许将接收信息自动存储为文件。
7 结 语
作者开发的这个同步卡调试器在航天工程现场已多次使用,快速帮助通信双方分离问题。文中给出了同步卡调试器的关键部分,由于他支持位级的输入编辑,发送时序也可以选择,所有的这一类项目都可以调试,在现场或任务阶段为项目相关人员提供了有力支持。通信双方均可受益。