2008-09-24
2、串行通讯难点及协议
串行通讯是半双工形式,通过串口发送数据相对简单,在时间上可以随意控制,如果使用微软提供的通讯控件MsComm32.OCX,只要直接给Output属性赋值即可;使用Turbo C 2.0语言或汇编语言,也只要在一个循环之内向串口的数据端口写数据即可。但是,接收数据则比较麻烦,因为中断接收时,数据常常不均匀流畅,其中存在空白间隔,给数据处理带来困难。大部分监控模块都有串口初始化函数、数据发送和接收函数,如果直接使用数据接收函数来接收数据,则由于以上问题,常常接收到残缺的数据,使工作无法完成,尽管逻辑上没有任何错误。在具体实现上,应该在接收到第一批数据时,开始等待T时间片,将第一批数据与随后的第二批数据相加,如此继续循环,直到新的T时间片结束而无数据到达,再跳出循环。至于T时间片大小的选取,应该根据具体的模块或设备来调整,直到性能可靠为止,此时的时间片即为所需要的T。数据接收算法见图1所示。
图1 数据收算法
为方便行文,将与计算机(主控机)串口相连的模块或系统统称为智能设备(有时包括工控机本身)。串行通讯的协议一般可分为两类,即读和写。读协议为读取智能设备的数据,写协议为设置智能设备参数或发送控制命令,读协议要求有响应,写协议可以没有响应。读写协议描述见图2所示(关于响应协议略)。常见的校验码有异或、累加和、CRC等。
图2 通讯协议示例
3、 通用软件设计
目标为设计一个通用串行通讯软件,使运行该软件的计算机(在图示中用带阴影的文本框表示)作为主控机可以自动地测试智能设备,也可作为智能设备用来自动地测试主控机上的监控软件,至于临时发送数据以代替主控机或智能设备,则是其基本功能。为了提高通用性,软件主界面尽量简洁,用两个单行文本框显示当前接收或发送的数据,其一为16进制形式(如“41”),其二为字符形式(如“A”),用一个多行文本框显示历史数据,包括接收和发送的数据、串口信号线的变化以及发生的时间(精确到毫秒),其它按钮用来打开和关闭串口、发送数据、设置串口参数及系统参数等。用Access 2000数据库记录数据,其中包括智能设备表、协议标志表、历史通讯数据记录表等,与协议表相关的表必须包含主控机协议及智能设备协议两个字段。采用VB6.0环境来完成此软件,所用的主要控件包括数据控件、MsComm32.OCX、Timer等。为了灵活工作,模拟各种智能设备,需要设计一“协议生成器”,对于图2所示的“读协议”,协议生成器的功能为:首先选择智能设备(由此确定协议标志),设置地址范围(即动态数据),则软件在此范围内自动生成地址,然后计算校验码,有的智能设备还需要追加协议结束标志,如调制解调器的AT命令就需要以回车符结束方才有效。协议生成器构造如图3所示。
图3 协议生成器
主控机与智能设备方式。充当主控机时,可以定时向智能设备发送读协议。充当智能设备时,用来响应主控机,其响应协议有两种生成方式,静态和动态。静态方式时,接收到主控机的协议,查找协议表,如果能匹配主控机协议,则将该条记录的智能设备协议发出(先让该软件以主控机方式工作,与实际的智能设备相连,从而记录下智能设备的响应协议,可参考下文的“截取通讯协议”部分);在动态方式下,找到匹配的主控机协议时,响应协议利用协议生成器动态生成。
自动与手动是针对主控机而言。自动方式需要设置定时器,定时向智能设备发送读协议;对于手动方式,则是通过发送按钮来发送数据,从而等待智能设备的响应并显示之。
软件的总流程为:设置串口参数,选择智能设备,设置协议生成方式及动态数据范围,设置主控机或智能设备工作方式,如果是主控机,还需要设置定时器,以及是否记录智能设备响应的协议;如果是智能设备,应选择静态响应或动态响应方式。主程序流程图见图4所示。
图4 主程序流程图
评论1
楼主 2008/9/24 17:26:50