微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > 基于RS-485总线的多主机通信方法

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

时间:12-28 来源:电子产品世界 点击:

同。目的节点、源节点均为网内设备节点地址,取值为1~32。帧长度是从起始符到结束符的字符长度,取值为7~255。结束符为字符’@’。

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

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

3.2 通信过程

3.2.1 发送方工作流程

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

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

发送方的工作流程如下:

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

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

步骤二:发送报文。

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

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

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

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

本文来源于中国科技核心期刊《电子产品世界》2016年第1期第45页,欢迎您写论文时引用,并注明出处。


3.2.2 接收方工作流程

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

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

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

4 程序设计

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

4.1 初始化程序

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

void InitDev(void)

{

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

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

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

GLCD_init();//初始化TFT屏

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

}

4.2 中断接收程序

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

void USART3_IRQHandler(void)

{

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

{

u8 temp;

USART_ClearITPendingBit(USART3,USART_IT_RXNE);

temp=USART3->DR;

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

……

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

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

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

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

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

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

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

……

if((F

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top