金库门软件设计主要包括PC机端和下位机端两大部分。
3.1 下位机端程序设计
单片机程序采用C51 语言编写,开/ 关锁信号的采集用查询方式,与PC
机的通信采用中断方式。要保证通信的可靠性,通信指令的完整性与正确性判断是一个比较关键的问题。一般来说,上位机传送指令给下位机有两种方式:(1)直接发送指令字符的方式(如AT
指令);(2)发送预先定义的指令代码的方式,比如上述指令中getdata 定义为0x01h ,settime
定义为0x02h,gettime定义为0x03h,等等。但第2种方式在噪声比较严重的情况下可能会发生异常:例如,PC机要传送的指令是0x01h,但由于干扰的原因,下位机接收的可能是0x03h,这样PC
机原来想得到安全记录数据,但下位机却发送了时间参数。
经综合考虑后,金库门系统采用了第1 种方式。 由于PC 机与下位机的通信是通过串行中断方式进行的,PC
机传送的指令也只能被下位机一个字符一个字符地接收,判断所接收的字符何时构成一条指令以及指令正确性的判断是至关重要的。一般的方法是当接收的字符数达到最小指令长度时就开始与系统设置的最短指令进行比较,如果相等,则执行相应的指令,如果不相等,则等到接收到的字符与次短指令的长度相等时,再与次短指令进行比较,如此循环下去。这种算法有两个
不足。
(1) 容易造成多余的比较。以本系统为例,最短的指令是reset
指令,长度是5,次短的指令是getall指令,长度是6,其余指令长度是7。当PC机传送getdata 指令时,下位机先接收到‘g ’字符,接着接收到‘e
’字符,…,当接收到第一个‘a’后,达到了最短指令长度5,于是比较接收到的字符串‘getda’与指令‘reset
’是否相等,结果是不等,于是继续接收下一个字符‘t
’,然后比较接收到的字符串‘getdat’与指令‘getall’是否相等,结果还是不等,于是继续接收下一个字符‘a ’,然后再比较接收到的字符串‘getdata
’与指令‘getdata ’是否相等。由此可见,该算法多进行了 2 次字符串比较。而是否到达了应进行比较的长度需要在中断服务程序中进行判断,如:
{ … if ( 接收字符长度=L1) 置位可以进行指令比较的标志; … else if (接收字符长度=L2) 置位可以进行指令比较的标志; … }
由于比较次数的不确定性,因此中断服务程序执行时间是不确定的。 (2)
在双方通信过程中,由于干扰信号的原因,因此要传送的指令中某个字符会发生错误,而该算法是不能判断出来的,很有可能造成系统死机。例如,当PC
机要传送的指令是reset ,而下位机接收到的却是resat ,由于‘reset ’与‘resat ’比较结果不相等,因此下位机等待新字符的到来,而PC
机认为指令已经发送完毕,不会再发送任何字符给它,这会造成下位机无限等待,产生死机现象。
为了避免出现上述问题,首先引入状态的概念:给下位机设置一系列状态,每接收一个字符就改变一次它所处的状态;再在这个基础上设计一个确定的有限自动机(DFA
)[3] M=(S,∑, f, S0 ,Z),其中S 表示有限状态集{0,1,2, …,13,15} ,∑是可接收字符的集合{a,b,c, …,z},f
是一个从S×∑至S 的单值映射(如:f(0,g)=1;f(0,a)=15;f(3,d)=5 ),S0 表示初态0,Z是终态(集)15。DFA
也可用状态转换图书馆(图3)的形式来表示。系统初始化时将状态设置为0,当接收到字母‘g’或‘r ’或‘s ’时,进入状态1
,接收到其他任何字符都进入终态15;当系统处于状态 1 时,若接收到字母‘e ’,则进入状态2,否则进入终态 15;其余类推。当系统进入终态
15后,可设置一终态标志,主程序判断出该标志后,便可进行进一步的处理:若接收的字符的个数小于最小指令长度,或者接收到的字符串与所有等长的指令比较后不相符,则发送“指令错误包”给PC
机;否则,执行相应的指令。这样处理后,一方面可以识别出指令,另一方面也缩短了中断服务程序的执行时间,为系统的实时性提供了条件。
4 结束语
该金库门系统设计完成后,经过不断修改和现场长期运行测试,并与Windows98、Wiondows2000 、Windows
XP联机测试,表明该系统性能满足各项设计指标,且具有较高的可靠性,满足实用化的需要。 参考文献