新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 基于RS-485总线的多主机通信方法

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

作者:马志强 杨海明 王苏毅 时间:2015-12-28来源:电子产品世界收藏
编者按:针对RS-485总线多个节点之间无法自由通信的问题,介绍一种多主机通信方法,以探讨总线接口电路和组网方式,并通过设计通信协议和规划通信过程,完成相关程序设计。此方法在某装备模拟项目中得到应用,取得了预期的效果。

3.2.2 接收方工作流程

本文引用地址:http://www.eepw.com.cn/article/284991.htm

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

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

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

4 程序设计

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

4.1 初始化程序

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

  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_REC==0) || (F_REC==0x10))

  {

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

  buf_rev1=(u8 *)malloc(dataNums);

  memcpy(buf_rev1,&DataIn,dataNums);

  if(buf_index==0) buf_index=1;

  F_REC|=0x01; //缓存区1已占用

  }

  else if(F_REC==0x01)

  {

  //只有缓存区1被占用

  ……

  }

  else if(F_REC==0x11)

  {

  //缓存区已满

  ……

4.3 报文发送程序

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

  ……

  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(1)

  {

  ……

  if(F_REC>0)

  {

  if(buf_index==1) DealData(buf_rev1,buf_len1);

  if(buf_index==2) DealData(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]潘群,向军,王琳.串行通信的设计与应用[J].常州工学院学报,2009,22(3):38-42

  [4]魏金文,马维华,吴侨. 的多机通信方案探究[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


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


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭