基于RS485的多主机通信协议的设计

2015-01-27 03:02胡明飞漆静群可迪群
自动化与仪表 2015年7期
关键词:发送数据空闲中断

胡明飞,杨 艳,漆静群 ,可迪群

(1.武汉大学 物理科学与技术学院,武汉 430072;2.华中科技大学 光学与电子信息学院,武汉 430074;3.华中科技大学 自动化学院,武汉 430074)

智能仪表和现场总线的出现标志着工业控制领域网络时代的到来,而以单片机多机通信实现分布式处理系统也逐渐成为主流。其中RS485总线因其结构简单、通信速率高、传输距离远等诸多优点,得以广泛应用。RS485总线常采用主从式协议进行通信,但当终端用户数目增加到一定程度后,主机的任务会过于繁重,系统性能大幅度下降[1]。因此,本文提出了一种基于RS485总线的多主机通信协议SBUS(simple BUS)的设计,各主机均拥有独立的处理能力,在需要发送数据时采用CSMA/CD(carrier sense multiple access/collision detect)协议进行信道争用,这样就分担了主控机的风险,并且提高了通信效率。

1 SBUS协议概述

SBUS协议是在通过研究CSMA/CD协议之后而设计的一个网络中各主机可以主动发起连接的通信协议,其结构框图如图1所示。

当总线上有数据帧到来时,协议会先对数据包行地址识别,若是发往本机的数据则继续接收剩余的数据,并存放到接收缓冲区;并且当检测到数据帧结束标志时则停止接收,然后通知应用层来取走数据;反之若发现数据包的地址非本机则拒绝接收余下的数据。数据从缓冲区取出之前会进行一些处理,比如差错处理、进程解析等;若校验错误根据需要确定是否重发。

图1 SBUS协议架构图Fig.1 SBUS protocol architecture diagram

当应用层需要发送一个数据包时,会先添加一些头部信息,然后写入发送缓冲区,等待链路层发送处理函数发送;发送时,会先监听信道,当检测到信道空闲则占用信道,然后将当前待发送的数据帧发送出去,并同时进行冲突检测,若有冲突则进行冲突处理。

这样就保证了网络中可以存在多个主机,它们之间是通过信道争用机制来与主控机进行通信的,各机处于平等的地位,相对于主从式通信而言,多主式通信在一定程度上可以提高通信效率[1]。

2 硬件设计

这里主要介绍测试时与SBUS协议相关的一些硬件电路设计。

2.1 RS485收发器电路设计

利用SBUS多主式协议,完成了多路温度采集系统的设计。常见的串口RS-232标准因为通信距离短、速率低,所以不适于该通信系统,而RS-485标准则很好地弥补了这方面的缺陷。所以物理层的收发器设计采用了Maxim公司的MAX485芯片,具体电路如图2所示。

图2 RS485通信电路原理图Fig.2 RS485 communication circuit diagram

采用RS485标准,其传输速率可最高达到10 Mb/s,传输距离延长到1219.2 m(速率低于100 kb/s时)。它的数据信号采用差分传输方式,使用一对双绞线,见图2中的A和B[2-3]。

RS485收发器有2个使能端,将接收使能端(/RE)接地,发送使能端由51单片机控制,所以主机空闲时一直处于接收状态,而当需要发送数据的时候使能发送端即可。另外,为了实现总线的监听,将串口接收端通过施密特触发器接至单片机的外部中断INT0,这样可通过中断来判断总线是否忙。

2.2 总线拓扑接口的设计

RS-485是一种半双工结构通信总线,大多用于一对多点的通信系统,故采用T头的星状型网络拓扑,如图3所示。在多路温度采集系统中通信媒介采用RJ45接口的网线,且各机共地连接[1,3]。

图3 星型网络拓扑接口原理图Fig.3 Star network topology interface principle diagram

3 SBUS协议设计

通信协议的主要部分由数据发送和数据接收2个模块构成。流程如图4所示。

图4 收发函数模块的流程图Fig.4 Flow chart of sending and receiving function module

3.1 地址的匹配和数据包起始帧的结束标志

51单片机的串口通信中SM2位称之为多机通信控制位,其作用是当串口工作在方式2或方式3下时,若SM2=1,仅当接收到第9位(RB8)为1时,才将前8位数据送入SBUF,并置位RI,产生中断;若接收到的RB8=0,则丢弃前8位数据。当SM2=0时,无论RB8=0或1都将前8位数据送入SBUF,置位RI,产生中断。

利用该功能,可将传输的第9位设置为数据/地址标志位,即RB8=1时,为地址帧,反之为数据帧。初始化后将SM2=1,此时主机一直处于接收地址帧的状态,当到来一地址帧后即可接收。若前8位数据所代表的地址为本机地址,则将SM2置为0,此时主机就可以接收余下若干字节的数据帧了,其他主机因为地址不匹配SM2仍为1,不能接收余下的数据帧,原理如图5所示,这样就达到了数据包的正确接收了。

图5 地址识别流程Fig.5 Address recognition process

图5所示的地址匹配过程可视为帧的起始标志,同样的原理可以实现数据包结束帧的标定。假设主机A正在向主机B传输数据,当A想结束一帧数据的传输,只需将RB8=1即可,而B在接收数据帧的时候不断查询RB8(数据帧的第9位一直为0),若发现RB8=1则说明该字节为结束标志符(该字节内容无任何实际意义),一帧数据已接收完成,需停止接收。此时,SM2又要设为1,为接收下一帧做准备。

3.2 CSMA/CD的实现

CSMA/CD即载波监听多路访问/冲突检测,实现过程:在51单片机的RXD端通过一个反向器与外部中断0连接,如图6所示,同时初始化一个定时器,时长为T,外部中断0的中断服务函数对定时器初值进行重装[2,4]。当RS-485总线上有数据传输时,中断会被反复触发,定时器初值也一直重装。这样如果定时器溢出(即T时间内总线上仍没有数据传输),则可认为总线是空闲的,就可以占用信道发送数据了[5]。

图6 利用中断监听总线Fig.6 Using interrupt monitor bus

其中总线监听函数代码如下:

可以看到,函数中使用 while(!send_flag);语句来等待总线空闲,即当总线有数据传输时,检测总线的中断则持续触发,对send_flag进行置位的定时器也不断重装,这样send_flag就一直是0,进程阻塞在这里,等到总线空闲后,定时器会溢出,然后send_flag就置位,数据发送进程继续往下执行,即该主机检测到了总线空闲,并占用信道。

若同时有多个主机检测到总线空闲,发送数据时就会产生冲突,所以在发送数据帧之前,需发送若干字节的测试码(比如0xaa),并接收回来,若有冲突则接收回来的测试码发生变化,这样就检测到了冲突。RS485收发控制器的接收使能一直接地,即一直处于使能状态,这样在发送数据的时候,接收和发送使能是同时打开的,所以既能发又能收;虽然51的串行接收和发送缓冲SBUF是共用的,但二者并不冲突,因为在串行接收的时候内部有个移位寄存器,当接收到完整的字节后它才将整个字节送到SBUF,又由于程序是顺序执行的,而非同时进行,所以这里可以自发自收[3,5]。

以上为冲突检测的具体实现,当函数返回FALSE后,要对数据进行冲突处理,在多路温度采集系统设计时,采取的冲突处理策略是:延时一段时间,继续新一轮的总线竞争,代码如下:

4 协议的应用——多路温度采集系统

4.1 多路温度采集系统构成

整个系统由一个主控机和若干温度采集器构成,主控机主要负责将多个采集器传送过来的温度数据进行实时的显示和存储,并且提供人机交互,便于查询和控制。

4.2 采集器和主控器的主流程

如图7所示,采集器主要功能就是周期地进行温度采集、转化,然后将无差错的数据通过SBUS协议发送到总线上,根据地址匹配主控机会接收到该帧数据。

图7 采集器和主控器的主流程图Fig.7 Main flow chart of the collector and the main controller

5 结语

本系统进一步完善的话,通过RS485组网,可实现各种现场数据的采集,尤其是点对多点的通信,在从机数量多的时候,采取主从式通信必然会导致通信效率降低,而本文提出了多主机进行信道争用机制,可在一定程度上解决此问题,但是要很好地解决它,还需要对协议做进一步的完善,比如实现主从式和多主机通信之间的智能切换,在网络负荷量较大时可切换到主从式通信,这样就避免了网络中某个主机一直争用不到总线;而当负荷减轻时又切换到CSMA/CD协议下。

[1]陈汝全.单片机实用技术:整机设计、多机通信、实用技术[M].北京:电子工业出版社,1992.

[2]谢筑森.单片机开发与典型应用设计[M].合肥:中国科学技术大学出版社,1997.

[3]夏继强.单片机实验与实践教程[M].北京:北京航空航天大学出版社,2001.

[4]余孟尝.数字电子技术基础简明教程[M].北京:高等教育出版社,1999.

[5]马忠梅.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,1999.

猜你喜欢
发送数据空闲中断
“单片机中断概述”微课教学设计
一种考虑GPS信号中断的导航滤波算法
“鸟”字谜
西湾村采风
一种车载自组织网络的媒体接入控制协议
Linux中断线程化分析及中断延时测试
彪悍的“宠”生,不需要解释
跟踪导练(二)(5)
多优先级无时隙CSMA/ CA算法研究
测试软件简介