APP下载

基于RS—485总线的多主机通信方法

2016-03-07马志强杨海明王苏毅

电子产品世界 2016年1期
关键词:发送器重传通信协议

马志强 杨海明 王苏毅

摘要:针对RS-485总线多个节点之间无法自由通信的问题,介绍一种多主机通信方法,以探讨总线接口电路和组网方式,并通过设计通信协议和规划通信过程,完成相关程序设计。此方法在某装备模拟项目中得到应用,取得了预期的效果。

关键词:RS-485;多主机;接口电路;通信协议

DOI:10.3969/j.issn.1005-5517.2016.1.012

引言

RS-485接口以其结构简单、通信速率高、传输距离远、成本低廉等优点在现场总线中得到广泛应用。传统的RS-485总线要求在同一时刻只能有一个节点进行数据发送,为此多采用一主多从方式或分时复用方式。一主多从方式,即网络中有一个主节点和若干个从节点,由主节点轮询各个从节点以实现数据通信。分时复用方式,即总线控制权分时交由各个节点使用,各节点按照预先分配的时间段发起通信。遇到节点主动发送实时要求高,节点数目不确定,且各个节点通信负荷不均衡等通信系统时,上述两种通信模式的总线利用率和实时性都相对较低。在模拟器材通信中,经常会遇到各节点不定期、多批次主动发起通信的情况,在应用RS-485网络时显得较为不便。为此,需要研究一种基于RS-485总线的多主机通信方法,并在模拟训练中得到应用,以取得良好效果。

1 接口电路

RS-485接口电路的主要功能是将来自微控制器(MCU)的发送信号TX通过“发送器”转换成通讯网络中的差分信号,将通讯网络中的差分信号通过“接收器”转换成MCU接收的RX信号。任一时刻、RS-485收发器只能够工作在“接收”或“发送”两种模式之一,因此,必须为RS-485接口电路增加一个收/发逻辑控制电路。另外,RS-485接口电路的附加保护措施也是必须考虑的环节。

如图1所示为我们设计的RS-485总线接口电路,核心芯片为SP3485,该芯片为+3.3V低功耗半双工收发器,满足RS-485和RS-422串行协议的要求,数据传输速率可高达10Mbps(带负载),与Sipex的SP481、SP483和SP485的管脚互相兼容,同时兼容工业标准规范。SP3485发送器的输出是差分输出,空载时输出电压的大小为OV—+3.3V,即使在差分输出连接了54Ω负载的条件下,发送器仍可保证输出电压大于1.5V。发送器输出最大250mAISC的限制使SP3485可以承受-7.OV~+1 2.OV共模范围内的任何短路情况,保护IC不受损坏。SP3485接收器的输入是差分输入,输入灵敏度可低至±200mV。接收器的输入电阻通常为15kΩ(最小为12kΩ)。一7V-+12V的宽共模电压范围允许系统之间存在大的零电位偏差。SP3485接收器还具有故障自动保护(fail-safe)特性,可在输入悬空时使输出保持在高电平状态。

控制该电路工作的MCU采用STM32F103VET6,该芯片为100引脚LQFP封装、采用Cortex-M3内核、处理速度可达72MHz,具有64K RAM和512K Flash,支持CAN、12C、SPI、USART、USB等接口。其串行口通过RXD(即485一RX引脚)连接SP3485芯片的RO引脚,通过TXD(即485一TX引脚)连接芯片的DI引脚。MCU输出的485_DIR信号控制芯片的发送器/接收器使能,亦即控制通信方向。当485一DIR1言号为“1”时,发送器工作,接收器失效,此时MCU可向RS-485总线发送数据;485一DIR信号为“0”时,发送器失效,接收器工作,此时MCU可以接收来自RS-485总线的数据。

为保证电路工作稳定可靠,电路中B引脚连接上拉电阻R2,A引脚连接下拉电阻R3,这样在上电或不传输数据时能保证RS485总线处于确定状态,为总线提供网络失效保护,以提高RS-485节点与网络的可靠性。

电阻R5为备用设计、如果将SP3485连接至80C51或STM32F103VET6等MCU芯片的UART串口,则SP3485芯片的RO引脚不需要上拉(R5为0Ω);否则,需考虑将R5更换为约10K的上拉电阻。

考虑到485总线在组网时,位于网络两端的节点需要增加120Ω终端电阻,我们在485_B和485_A之间放置了终端电阻R4,为便于使用者灵活调整节点在网络中的位置,我们还为终端电阻设计了选择跳线JP1。

2 组网方式

RS-485总线组网方式如图2所示、所有RS-485节点全部挂在一对RS-485总线上。注意RS-485总线不能够开叉、但是可以转弯。RS-485网络采用直线拓朴结构,需要安装2个终端匹配电阻。终端匹配电阻安装在RS-485传输网络的两个端点,并联连接在A-B引脚之间,其阻值要求等于传输电缆的特性阻抗(一般取值为120Ω)。终端匹配电阻主要作用是使总线的阻抗连续,以减少信号的反射,从而提高信号的传输质量。在矩距离(300米以下)、低波特率(19200bps)数据传输时可不需终端匹配电阻。

3 多主机通信协议

稳定可靠的通信不仅依赖硬件环境,对通信协议也有很高的要求。为了解决RS-485总线多主机通信的问题,需要对RS-485通信协议进行研究。

3.1帧结构

起始符-目的节点-源节点-帧长度-命令/数据-帧校验-结束符

设定起始符为字符$。考虑到便于报文接收、起始符应与设备地址不同。目的节点、源节点均为网内设备节点地址,取值为1-32。帧长度是从起始符到结束符的字符长度,取值为7-255。结束符为字符@。

帧校验(FCS)通常可采用奇偶校验、和校验、CRC校验等方法,前两者处理相对简单,节省运算时间,但存在漏检的可能,后者处理相对复杂,需要一定的运算时间,但可靠性优于前面两种方法。在具体应用时,可根据需要自行选择。本文帧校验方法为从目的地址开始,到数据的最后一个字节为止,各字节依次异或,最后得到的数值即为帧校验值,如果接收方发现校验错误则应要求发送方重发。

值得注意的是,对于起始符、结束符与数据帧内容重叠时的处理,采用数据字节前插入OxFF的办法加以识别。例如,要发送的数据为OX24,与结束符重叠,则在报文中应写为OxFFOx24。

3.2通信过程

3.2.1发送方工作流程

RS-485总线采用半双工工作方式,全网在同一时刻只能有一个设备在发送报文(扮演主机),此时其它设备处在接收状态(扮演从机)。基于对可靠性的考虑,采取如图3所示通信流程。

具体解释如下:F_BUSY为总线忙标志,取值为“1”时表示“总线忙”,N为发送报文后对方无应答时报文的重传次数,M为接收到的报文出现FCS错误时的重传次数。当系统初始化时,每个节点的F_BUSY均为0,即总线空闲,N、M均为0。

发送方的工作流程如下:

总线的申请和释放均由通信的发起方完成。

步骤一:申请总线。发送报文前先进行“忙”检测,当F—BUSY为“O”时发送“申请总线”报文,通知全网节点即将占用总线,并开启计时器,无关节点收到该报文后将F_BUSY置为1,并禁止本地发送报文,目的节点收到后发送“确认可用”报文。当F—BUSY为“1”或计时已到却未收到“确认可用”报文,则随机延时后重新申请总线。

步骤二:发送报文。

步骤三:等待应答。发送报文后,启动计时器,等待对方的接收应答,如在规定时间内未收到对方应答,则进行报文重传,并将重传次数N加1。如果重传已达三次,则认为网络断开,释放总线,结束通信。

步骤四:出错重传。如果对方应答帧内容为“FCS错误”报文,则进行报文重传,并把M加1。如果重传已达三次,则认为网络不稳定,释放总线,结束通信。

步骤五:释放总线。报文发送流程结束后,该节点发出“释放总线”报文,各节点将F_BUSY置为O,总线恢复空闲状态。

发送方的处理中,在申请总线阶段没有考虑消息碰撞问题,这主要是基于网络节点数量有限,碰撞几率较低的考虑。为增强报文的可靠性,须进行帧校验处理。在等待应答阶段,采取ARQ技术,对出错报文进行请求重传。为避免程序陷入死循环,针对对方无应答或报文帧校验错误的情况采用了有限次重传的机制。

3.2.2接收方工作流程

处理一:报文过滤。通过报文头部,判断收到的报文是否为其它节点发给本节点,如果不是则不予处理。

步骤二:报文校验。对发给本节点的报文进行帧校验,如果有错误,则发“FCS错误”报文,并将已收到报文丢弃,如果校验正确则发“确认接收”报文。

步骤三:报文处理。对正确接收的报文进行分析处理。

4程序设计

程序设计中主要对初始化程序、中断接收程序、报文发送程序、报文处理程序等程序分别进行设计。

4.1初始化程序

初始化程序主要完成MCU和RS-485收发器管脚的初始化,并开启串口接收中断。

void InitDev(void)

{

RCC_Configuration();//配置系统时钟,使能各外设时钟

Init_485();//配置485管脚,并预置为接收使能

SysTick_lnit(1000);//初始化系统滴答

G LCD_init();//初始化TFT屏

UART3lnit();//对USART3进行串口参数设置、中断配置,开启接收中断

4.2.中断接收程序

中断接收程序主要对符合数据帧格式的报文进行接收,根据报文中的目的节点过滤掉发给其它节点的报文,并对报文进行帧校验,最后设置相应的标识位,供接收数据处理程序使用。

void USART3_IRQHandler(void)

{

if( USART_GetITStatus(USART3,USART_IT_RXNE)==SET)

{

u8 temp;

USART_ClearITPendingBit(USART3,USART_IT_RXN E);

temp=USART3->DR;

//以下对收到的字符进行处理

为避免对方快速发送多组报文,使接收方来不及处理而导致丢失报文,我们采取双缓存的方式,即设置两个接收缓存区,轮流存储接收到的报文,对缓存区的占用情况设置标志位。

char F_REC;//缓存区存储标志

char buf_index;//当前待处理的缓存区号

u8*buf_revl;//接收缓存区1

u8*buf_rev2;//接收缓存区2

u8 Dataln[128];//临时存储区

u8 dataNums;//已收到的数据长度

if((F_REC==O)|| (F_REC==Oxl0))

{

//缓存区为空,或只有缓存区2被占用

buf_revl =(u8*)malloc(dataNums);

memcpy(buf_revl,&Dataln;,dataNums);

if(buf_index==0) buf_index=l;

F_RECl=Ox01;11缓存区1已占用

}

else if(F_REC==Ox01)

{

//只有缓存区1被占用

}

else if(F_REC==Oxll)

{

//缓存区已满

4.3报文发送程序

报文发送程序主要是将任意长度的报文发送到总线上。由于485总线通信始终在接收/发送之间切换,为保证总线可靠工作,状态切换时应做适当延时,等总线状态稳定后,再进行数据的收发。具体方法是在数据发送状态下,先将485一DIR置“1”,延时2ms,再发送数据,数据发送完成后,延时2ms,直接将485_DIR置“O”。这种处理可有效提高总线的稳定性,增强数据传输的可靠性。延时时间的取值与波特率有关,波特率越小,延时应越大。

RS_485_TX_EN;//485发送使能

RS485_Delay(2);//延时2ms

for (i=0; i

{

USART_SendData(USART3, data[i]);

while(USART_GetFlagStatus(USART3, USART_FLAG_TC)== RESET);

}

/*RS485_Delay(2);*/

RS_485_RX_EN;//485接收使能

4.4报文处理程序

为了保证中断接收程序始终能快速响应对方发来的数据,我们把报文处理程序放在中断之外,以免程序处理当前报文用时过长,影响下一组报文的接收。在主程序中通过对接收标志位的判断来调用报文处理程序,根据接收报文内容的不同给出相应的响应。

int main(void)

{

while(l)

{

if(F_REC>O)

{

if(buf_index==1)DeaIData(buf_rev1,buf_lenl);

if(buf_index==2)DeaIData(buf_rev2,buf_len2);

5 结语

本文中介绍了一种多主机通信的485总线通信实现方法,该方法适用于工作环境相对恶劣、多主机随机通信需求较高的场合,目前已应用到某模拟训练系统,经两年多的使用,系统运行稳定可靠。在具体实践中,对于工作条件较好时,为提高效率可对通信协议进行精简设计,如缩短帧结构、简化通信过程等,藉此可减少总线占用时间,缩短节点响应时间,达到更为理想的通信效果。

参考文献:

[1]陈铁军,谢春萍.PC机与RS 485总线多机串行通信的软硬件设计[J]现代电子技术,2007(5):103-105

[2]昊桂林,郑建勇.RS485上下位机多机通信网络系统设计[J]微计算机信息,2008,24(12-3):112-113

[3]潘群,向军,王琳.RS-485串行通信接口电路的设计与应用[J]常州工学院学报,2009,22(3):38-42

[4]魏全文,马维华,昊侨RS-485的多机通信方案探究[J]单片机与嵌入式系统应用,2012.10:76-78

[5]郝涛,陆宣博基于RS485主从串口通讯协议的设计[J]装备制遣技术,2013,3:38-40

[6]胡文涛一种基于协议的提高RS-485实时性的方法[J]现代电子技术,2013,36(18):10-12

[7]周建章,赵颖基于RS- 485主从通信协议的改进[J]电子质量,2011,1:23-25

猜你喜欢

发送器重传通信协议
移频发送器冗余切换设计研究
面向异构网络的多路径数据重传研究∗
基于Z-Stack通信协议栈的红外地温采集电路设计
用于获取车辆中的旋转构件的旋转角度的传感器组件
基于DMX512通信协议的多路转发器设计与研究
基于NS-3的PLC多频通信协议仿真平台设计与实现
数据链路层的选择重传协议的优化改进
从两起故障谈ZPW-2000发送盒报警检测的改进
客运专线ZPW2000A轨道电路发送器冗余电路改进方案探讨
RSSP-I、RSSP-Ⅱ及SAHARA三种安全通信协议实现技术简介