基于RS-485总线的多主机通信方法
同。目的节点、源节点均为网内设备节点地址,取值为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
RS-485 多主机 接口电路 通信协议 201601 相关文章:
- 工程师难题:如何为RS-485应用设计半双工中继器?(11-26)
- 正确认识RS-485布线过程中的错误观念(03-06)
- 如何选择RS-232/RS-485/RS-422转换器(12-19)
- CAN通信协议在矿井安全生产监控系统中的应用(09-27)
- 基于C8051的多路高精度数据采集系统设计(05-23)
- EMC COMPLIANT RS-485收发器保护电路解析(06-05)