RS485总线多主方式对等传输数据
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RS485总线多主方式对等传输数据
摘要:利用以太网的冲突检测方式在RS485总线上连接的多个设备之间采用多主方式对
等传输数据,并给出了这种方法的硬件设计方案和软件流程。
关键词:RS485总线对等网冲突检测
目前以RS485总线为基础组建的各类网络中,多采用主从式通信。但在一些组网中,采用对等式的通信方式更符合设计要求,效率更高。例如在一套由人机接口、红外控制模块(用于遥控家电)、三表集抄模块、安防模块和家居网关服务终端(与互联网及电话相联)等组成的智能家居服务系统中,该家居系统内部采用什么样的数据传输方式,怎样可靠和高效地传输数据,对整个家居系统的正常运转至关重要。因为总线上发起通信的数据有外界的遥控指令、人机接口处传来的控制和查询指令以及一些模块主动上传的指令(如报警),这些指令大多数是随机的,若采用主从式难以符合要求,而采用多主方式的对等网可以符合数据传输的要求,使数据及时发送。同时由于各个设备是对等的关系,实行分布式控制,所以一个模块损坏,不会影响其他模块工作,因此不存在主站损坏导致整个通信线路瘫痪的问题,从而使通信的可靠性大大增加。
1多主式对等网数据传输方案的选择
在采用多主方式后,挂接在总线上的各设备之间是对等的关系,各节点在发送数据时存在总线竞争问题,需要考虑设备之间的优先发送数据问题以及传送效率问题。要解决总线竞争问题,可以考虑用以太网的冲突检测方案或令牌总线方案。在以太网的冲突检测方案中,当总线上有不同节点同时发送数据时,会由于信号叠加而造成信号紊乱,即信号的冲突。要避免这种情况,节点在发送数据前要侦听一下总线是否忙,不忙时才发送,以减少冲突。当发生冲突时,可以用二进制指数退避算法来解决冲突。令牌总线方案是通过令牌的传送来控制每个节点发送的时间,从而解决总线的竞争。它虽然不存在冲突问题,但要不断地传送令牌,某一节点要发送数据,必须等到获得令牌才能发送,这会延误重要数据的发送,并加大数据量和等待时间。在轻载荷时效率低,而且其协议比冲突检测方案复杂,初始化时间长。综合考虑,以太网的冲突检测方案在轻载荷时效率高,且协议较令牌总线方案简单。考虑到智能家居项目中总线上负荷不大,冲突量少,因此采用以太网的冲突检测方式来实现多主方式数据传输。
2多主式数据传输的硬件设计
2.1器件的选择
系统的主控单片机采用AT89C52。AT89C52能够与51系列单片机兼容,具有8KB Flash程序存储器、256B数据存储器,以及串口中断和定时器。这些完全能够满足系统对中断、数据存储器和程序存储器容量的需求。RS485收发器可考虑用SN75LBC184,该芯片具有很好的抗干扰性能,可靠性高。
2.2设计原理
硬件原理图如图1所示。单片机AT89C52的串口数据线与SN75LBC184的收发端口相连。SN75LBC184的使能端由单片机I/O口控制,通过RS485收发器进行单片机信号与RS485信号的转换。利用AT89C52有一个全双工串口通信端口的特性,在发送1个字节后,紧接着从总线收一次数据,并比较2个数据是否相同。若相同,则认为没有产生冲突;否则认为产生了冲突,去执行相应的冲突处理。此时RS485收发器要收发同时使能,可让收(/RE)一直使能,发使能(DE)用一个单片机I/O口(P11)控制。为了减小RS485总线上的盲区状态,加强通信的可靠性,在RS485总线的出口处加3个保护电阻,分别是上拉电阻750Ω、接地电阻750Ω和2条信号线之间的电阻130Ω。
3多主式数据传输的软件设计
下面将介绍采用RS485总线组建对等网,利用冲突检测方式传送数据的原理及软件流程。该总线传输速率为38.4kbps,采用多主发送方式。
3.1发送流程
由于采用类似以太网的冲突检测方式来发送数据,因此为了减少冲突,数据在发送之前应先进行总线侦听,即确定总线是否有数据正在发送。若有,则等待到线路空闲;否则可发送,这样可以减少冲突发生的概率。按传输速率为38.4kbps计算,每位的发送时间为26μs,以每个字节为10位计(起始位和结束位各1位,数据位8位),则发送每个字节需260μs。发送1帧32字节数据最少需8320μs。在总线侦听时,若500μs没有接收中断,则认为总线空闲,可以发送数据,等待时间很短,在数据量小时效率高。当某些数据帧要求有回应时,要发送回应帧,若回应帧满足以下条件:
(1)发送1个字节要260μs,1帧最大32字节数据至少要8320μs,取10ms。
(2)对方接收到的时间取10ms。
(3)程序处理时间取10ms。
(4)对方发送时间按10次冲突算,则(210-1)×3×500=1534500,取1.54s。
(5)接收回应帧时间10ms。
则等待时间T=10+10+1534+10=1564ms,可取1.6s。
若要求回应帧的数据等待一段时间后还没收到回应帧,则重发数据,这样可减少误码率。若多次无法通信,则各装置要置出错信息,作相应处理或向外界报警。具体发送流程如图2所示。当有数据要发送时,先判断线路是否忙,若不忙,则可以发送数据。在发送途中检测是否有冲突,若在发送中发现有数据冲突,则进行冲突处理,算出退避时间,等待退避时间后重传数据,最多10次;若无冲突,则发送完成,在设定的时间内等待回应帧,若在规定时间内没收到回应帧,则置相应标志选择重传本帧数据或放弃;若收到回应帧,则本次通信成功。
3.2接收流程
串口通信采用异步传送方式。字符是按帧格式进行传送的,每帧数据中起始位和结束位各占1位(用于建立发送与接收之间的同步),数据位8位,无校验位。接收流程图如图3所示。在串口收到数据后,按格式去判别所接收的数据是否正确,即先找到起始符,然后判断是否为发给自己的数据,并按自定义协议的数据要求和范围逐个进行检验。若为有效数据则放入接
收缓冲区,置接收标志,让应用层处理,有需要回应的,应用层处理完后发送相应的回应帧。对接收到的数据进行处理时,先看是否符合通信格式,CRC校验是否通过,然后才译码。若其中一个数据不合要求,就清缓冲区,认为数据无效,有些数据需返回错误信息。在通信中可能有一些异常状态,如接收数据出错或1帧数据没有收完。在此情况下,若数据之间的间隔超过最大等待时间,则需把接收数据缓冲区清空,认为数据无效。
3.3冲突检测流程
若2个设备同时在空闲的电缆上发送数据,就会发生数据冲突,此时系统要能检测出总线上的冲突。在发送时把数据赋给一个变量,进入发送中断后等待接收中断标志(若超时也认为发生了冲突),然后从串口取数,与变量中的数比较即可判断有无冲突。冲突检测流程图如图4所示。进入串口中断后,如果是发送中断,则清TI(发送中断)标志,等待RI(接收中断)标志。若超过设定时间(500ms)没收到RI标志为1的信号,则认为发生了冲突。在接收到RI标志后,把串口缓冲区的数据与发送前存的数据比较,若二者相同,则不存在冲突;若不同,则认为发生了冲突。