宋兵跃,吴军辉,黄斌
(1.同济大学 现代农业科学与工程研究院; 2.同济大学 教育部设施农业网上合作中心,上海200092)
宋兵跃(硕士研究生),研究方向为智能控制及嵌入式系统应用。
所谓串行通信,就是将数据分成一个个的二进制位(bit),然后通过一条线路或一个通信信道,按照规定的规程逐位依次进行传输,实现计算机与计算机或计算机与外部设备之间的通信(数据交换)。串行通信因其占用硬件资源少、可大幅度降低通信线路的成本、简化通信设备、应用灵活、易维护等诸多优点,在工业控制、电力通信、智能仪表等领域得到了广泛应用[1]。
目前 ,有 EIA-RS232 、EIA-RS485 、电流环 、CAN 等串行通信方式。EIA-RS232是全双工的通信模式,可以保证短距离点对点的高速传输;EIA-RS485可实现较长距离下的多点互联通信;CAN属于现场总线的范畴,采用多主机制,改善了在集散控制系统下的主从通信模式[2]。随着应用需求的复杂化,对串行通信的通信效率及性能的要求越来越高,所以如何制定一套切实可行、简单易用,又能大幅度提高串行通信效率的通信协议,如何在PC端、嵌入式系统端构建一个高效的串行数据处理的应用程序,是亟待解决的一大问题。
面向各个领域不同的应用需求,串行通信的网络拓扑结构也多种多样,如总线型、环型、星型等。本文以加油站信息管理系统为例,介绍串行通信协议的制定以及高效通信数据处理的实现。
加油站信息管理系统的结构如图1所示。本系统中,每台加油机为一个应用节点(即图中的控制点),通过半双工RS485总线连接至通信控制器。在该RS485网络中,通信控制器为主机(Master),各加油机为从机(Slave),构成一个主从通信的网络架构。在多种串行接口标准中,RS485接口以其结构简单、通信速率高、传输距离远、使用的传输线较少、在长距离通信时比较经济等诸多优点,在集散式控制装置中得到了广泛应用。RS485采用差分电平传输,只需两根信号线,可以方便地增加控制节点数目[3]。
图1 加油站信息管理系统结构图
通信控制器通过全双工RS232总线与管理PC机进行数据交互。RS232总线为全双工通信总线,为了保证实时性和高效性,管理PC机和通信控制器这个层面的数据交互采用互为主机的通信方式,以此构成一个集散控制系统[4]。
各个加油站信息管理系统中,控制点的数目可能较大,所以对数据通信的实时性提出了较高的要求。采用RS485总线作为底层通信接口。与点对点的通信方式相比,任何节点均能侦听到总线上传输的任何数据,这对串行通信数据接收处理也提出了很高的要求。每一个网络节点既要可靠、稳定地完成其自身的控制工作,又要准确、高效地在RS485总线上接收到发送至本节点的通信数据帧。
2.2.1 协议帧格式
(1)主机下发数据帧格式
起始标志数据(5AH+A5H)+长度(从命令字开始到校验和为止的字节数)+命令字HIGH+命令字LOW+机号+参数+1字节校验和(从命令字开始到校验码前一字节的逻辑异或和)
(2)从机上传数据帧格式
起始标志数据(9BH+B9H)+长度(从命令字开始到校验和为止的字节数)+命令字HIGH+命令字LOW+机号+参数+1字节校验和(从命令字开始到校验码前一字节的逻辑异或和)[5]
2.2.2 协议帧解释
起始标志数据:采用一字节或多字节作为帧起始标志(该部分的字节定义应尽量与帧数据的其他部分完全不同)。接收方在接收错误后,接收数据时总是先寻找帧头。帧头的排他性将有利于提高各通信节点的接收效率。
长度:应尽量采用短帧,以避免各种干扰因素对通信效率的影响。可根据实际应用情况,在“长度”后增加“长度反码”或“长度补码”等校验数据,对长度进行更为严格的校验[6]。
命令字:根据实际通信应用需求,可应用1~2字节的通信命令字。
机号:所需接收方的地址识别号。可根据实际应用需求进行修改,如增加源地址、目的地址等。
参数:应用数据。考虑到数据的安全性,可针对不同的应用对该部分的数据进行加密处理。
校验和:数据校验,可根据应用需求选择不同的校验方式[7]。
通信控制器的发送数据流程如图2所示。通信控制器首先判断最高优先级的命令字是否需要发送。如果需要,则进入该命令字的发送流程;如果没有,接着判断次高优先级的命令字是否需要发送。如果需要则进入发送流程,根据命令字的优先级由高到低的顺序依次判断要发送的命令字。当没有通信数据命令字发送时,通信控制器会发送轮询命令字。此外,在发送完一帧数据后,通信控制器会开启接收超时定时器T2,如果通信控制器在超时时间内收到应答命令数据帧,则进入相应数据处理流程,同时关闭T2。如果系统长时间未收到应答命令数据帧,则重新发送该命令字的数据,并记录发送该命令字的次数。当发送的命令字的帧超过10次仍未收到相应应答命令,则视为该命令字和PC机的通信失败,把通信流程重新调整到轮询命令字状态下。
图2 通信控制器数据发送流程
发送的代码程序放到单片机的串行中断服务程序中来处理[8],代码如下:
在通信控制器的接收端,应保持串行中断的优先级最高。这样才能保证系统时刻可以和PC处于通信的状态。具体的处理机制如下:
①找到帧头(本协议是2个字节)。找到第 1个帧头,就把接收步骤的全部标志S赋值1,把接收字节的内容放到接收数据缓冲区中。接着找第2个帧头,找到帧头后把内容顺序放到接收数据缓冲区中。继续判断命令字是不是协议中规定的合法命令字。如果是,再根据命令字所对应的长度来判断该帧数据的合法性。因为在制定通信协议时就规定了特定命令字所对应的数据长度,这两点约束条件就可以保证接收数据是合法的,从而提高了系统的稳定性[12]。如果命令字和其对应的长度值合法,则把S值赋值为3,进入下一步的数据处理步骤。
②在一帧数据接收开始时,开启接收超时定时器。如果在超时时间内未收到一帧完整的数据,则视为本次通信流程失败,重新初始化串行通信,等待下次通信。
③如果一帧数据完全接收正确并成功,则关闭接收定时器,停止响应串行中断,以防止处理的过程中有新的接收数据影响有效数据的处理。处理完毕,使能串行中断,打开接收定时器,清除接收步骤 S为0,根据处理过程中标志位的改变情况继续和PC进行相应的数据通信[9]。通信控制器数据接收流程如图3所示。
图3 通信控制器数据接收流程
编者注:具体实现代码略。
本文设计了一套完整的通信协议,通信控制器的发送端始终处于通信状态,能以很快的速度响应系统协议规定的命令字及其数据的发送。在通信控制器的接收端,采用逐字节处理的方式,通过设定全局变量来确定处理接收数据帧的步骤,细化了处理接收数据的过程,保证了数据高效、可靠的传输。本系统已经应用在上海宝钢集团加油站信息管理系统中。实验结果证明,按照此协议进行的通信数据准确,通信高效可靠,自适应能力强,具有在相关领域推广的价值。
编者注:本文为期刊缩略版,全文见本刊网站www.mesnet.com.cn。
[1]胡新华,邓元勇,王先平.多种通信网络及接口转换模块的研制[J].计算机工程,2009,35(6).
[2]徐勇,贺建民,王景玉.计算机硬件技术基础[M].北京:清华大学出版社北京交通大学出版社,2004:272.
[3]谢瑞和.串行技术大全[M].北京:清华大学出版社,2003:5-8.
[4]王常力,罗安.分布式控制系统(DCS)设计与应用实例[M].北京:电子工业出版,2005:22-24.
[5]Castro M,Sebastian R,Yeves F,et al.Well-known serial buses for distributed control of backup power plants——RS-485 versus controller area network(CAN)solutions[J].Industrial Electronics Society,2002,3(5-8):2381-2386.
[6]凌力.网络协议与网络安全[M].北京:清华大学出版社,2007:131-134.
[7]Hubaut F,Laforge B,Le Dortz O,et al.Implementation of a serial protocol for the liquid argon calorimeters of the ATLAS detector[C].Nuclear Science,Volume 48,Issue 4,Part 1,2001:1254-1258.
[8]田清.51单片机C语言程序设计快速入门[M].北京:人民邮电出版社,2007:80-85.
[9]南建辉.MCS-51单片机原理及应用实例[M].北京:清华大学出版社,2004:257-268.