新聞中心

EEPW首頁(yè) > 手機(jī)與無(wú)線通信 > 設(shè)計(jì)應(yīng)用 > 基于RS-485總線的多主機(jī)通信方法

基于RS-485總線的多主機(jī)通信方法

作者:馬志強(qiáng) 楊海明 王蘇毅 時(shí)間:2015-12-28 來(lái)源:電子產(chǎn)品世界 收藏
編者按:針對(duì)RS-485總線多個(gè)節(jié)點(diǎn)之間無(wú)法自由通信的問(wèn)題,介紹一種多主機(jī)通信方法,以探討總線接口電路和組網(wǎng)方式,并通過(guò)設(shè)計(jì)通信協(xié)議和規(guī)劃通信過(guò)程,完成相關(guān)程序設(shè)計(jì)。此方法在某裝備模擬項(xiàng)目中得到應(yīng)用,取得了預(yù)期的效果。

3.2.2 接收方工作流程

本文引用地址:http://m.butianyuan.cn/article/284991.htm

  處理一:報(bào)文過(guò)濾。通過(guò)報(bào)文頭部,判斷收到的報(bào)文是否為其它節(jié)點(diǎn)發(fā)給本節(jié)點(diǎn),如果不是則不予處理。

  步驟二:報(bào)文校驗(yàn)。對(duì)發(fā)給本節(jié)點(diǎn)的報(bào)文進(jìn)行幀校驗(yàn),如果有錯(cuò)誤,則發(fā)“FCS錯(cuò)誤”報(bào)文,并將已收到報(bào)文丟棄,如果校驗(yàn)正確則發(fā)“確認(rèn)接收”報(bào)文。

  步驟三:報(bào)文處理。對(duì)正確接收的報(bào)文進(jìn)行分析處理。

4 程序設(shè)計(jì)

  程序設(shè)計(jì)中主要對(duì)初始化程序、中斷接收程序、報(bào)文發(fā)送程序、報(bào)文處理程序等程序分別進(jìn)行設(shè)計(jì)。

4.1 初始化程序

  初始化程序主要完成MCU和收發(fā)器管腳的初始化,并開(kāi)啟串口接收中斷。

  void InitDev(void)

  {

  RCC_Configuration();//配置系統(tǒng)時(shí)鐘,使能各外設(shè)時(shí)鐘

  Init_485();//配置485管腳,并預(yù)置為接收使能

  SysTick_Init(1000);//初始化系統(tǒng)滴答

  GLCD_init();//初始化TFT屏

  UART3Init();//對(duì)USART3進(jìn)行串口參數(shù)設(shè)置、中斷配置,開(kāi)啟接收中斷

  }

4.2 中斷接收程序

  中斷接收程序主要對(duì)符合數(shù)據(jù)幀格式的報(bào)文進(jìn)行接收,根據(jù)報(bào)文中的目的節(jié)點(diǎn)過(guò)濾掉發(fā)給其它節(jié)點(diǎn)的報(bào)文,并對(duì)報(bào)文進(jìn)行幀校驗(yàn),最后設(shè)置相應(yīng)的標(biāo)識(shí)位,供接收數(shù)據(jù)處理程序使用。

  void USART3_IRQHandler(void)

  {

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

  {

  u8 temp;

  USART_ClearITPendingBit(USART3,USART_IT_RXNE);

  temp=USART3->DR;

  //以下對(duì)收到的字符進(jìn)行處理

  ……

  為避免對(duì)方快速發(fā)送多組報(bào)文,使接收方來(lái)不及處理而導(dǎo)致丟失報(bào)文,我們采取雙緩存的方式,即設(shè)置兩個(gè)接收緩存區(qū),輪流存儲(chǔ)接收到的報(bào)文,對(duì)緩存區(qū)的占用情況設(shè)置標(biāo)志位。

  char F_REC;//緩存區(qū)存儲(chǔ)標(biāo)志

  char buf_index;//當(dāng)前待處理的緩存區(qū)號(hào)

  u8 *buf_rev1;//接收緩存區(qū)1

  u8 *buf_rev2;//接收緩存區(qū)2

  u8 DataIn[128];//臨時(shí)存儲(chǔ)區(qū)

  u8 dataNums;//已收到的數(shù)據(jù)長(zhǎng)度

  ……

  if((F_REC==0) || (F_REC==0x10))

  {

  //緩存區(qū)為空,或只有緩存區(qū)2被占用

  buf_rev1=(u8 *)malloc(dataNums);

  memcpy(buf_rev1,&DataIn,dataNums);

  if(buf_index==0) buf_index=1;

  F_REC|=0x01; //緩存區(qū)1已占用

  }

  else if(F_REC==0x01)

  {

  //只有緩存區(qū)1被占用

  ……

  }

  else if(F_REC==0x11)

  {

  //緩存區(qū)已滿

  ……

4.3 報(bào)文發(fā)送程序

  報(bào)文發(fā)送程序主要是將任意長(zhǎng)度的報(bào)文發(fā)送到總線上。由于485總線通信始終在接收/發(fā)送之間切換,為保證總線可靠工作,狀態(tài)切換時(shí)應(yīng)做適當(dāng)延時(shí),等總線狀態(tài)穩(wěn)定后,再進(jìn)行數(shù)據(jù)的收發(fā)。具體方法是在數(shù)據(jù)發(fā)送狀態(tài)下,先將485_DIR置“1”,延時(shí)2ms,再發(fā)送數(shù)據(jù),數(shù)據(jù)發(fā)送完成后,延時(shí)2ms,直接將485_DIR置“0”。這種處理可有效提高總線的穩(wěn)定性,增強(qiáng)數(shù)據(jù)傳輸?shù)目煽啃?。延時(shí)時(shí)間的取值與波特率有關(guān),波特率越小,延時(shí)應(yīng)越大。

  ……

  RS_485_TX_EN;//485發(fā)送使能

  RS485_Delay(2);//延時(shí)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 報(bào)文處理程序

  為了保證中斷接收程序始終能快速響應(yīng)對(duì)方發(fā)來(lái)的數(shù)據(jù),我們把報(bào)文處理程序放在中斷之外,以免程序處理當(dāng)前報(bào)文用時(shí)過(guò)長(zhǎng),影響下一組報(bào)文的接收。在主程序中通過(guò)對(duì)接收標(biāo)志位的判斷來(lái)調(diào)用報(bào)文處理程序,根據(jù)接收?qǐng)?bào)文內(nèi)容的不同給出相應(yīng)的響應(yīng)。

  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 結(jié)語(yǔ)

  本文中介紹了一種通信的485總線通信實(shí)現(xiàn)方法,該方法適用于工作環(huán)境相對(duì)惡劣、隨機(jī)通信需求較高的場(chǎng)合,目前已應(yīng)用到某模擬訓(xùn)練系統(tǒng),經(jīng)兩年多的使用,系統(tǒng)運(yùn)行穩(wěn)定可靠。在具體實(shí)踐中,對(duì)于工作條件較好時(shí),為提高效率可對(duì)進(jìn)行精簡(jiǎn)設(shè)計(jì),如縮短幀結(jié)構(gòu)、簡(jiǎn)化通信過(guò)程等,藉此可減少總線占用時(shí)間,縮短節(jié)點(diǎn)響應(yīng)時(shí)間,達(dá)到更為理想的通信效果。

參考文獻(xiàn):

  [1]陳鐵軍,謝春萍. PC機(jī)與RS 485總線多機(jī)串行通信的軟硬件設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2007(5):103-105

  [2]吳桂林 鄭建勇. RS485上下位機(jī)多機(jī)通信網(wǎng)絡(luò)系統(tǒng)設(shè)計(jì)[J].微計(jì)算機(jī)信息,2008,24(12-3):112-113

  [3]潘群,向軍,王琳.串行通信的設(shè)計(jì)與應(yīng)用[J].常州工學(xué)院學(xué)報(bào),2009,22(3):38-42

  [4]魏金文,馬維華,吳僑. 的多機(jī)通信方案探究[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2012,10:76-78

  [5]郝濤,陸宣博.基于RS485主從串口通訊協(xié)議的設(shè)計(jì)[J].裝備制造技術(shù),2013,3:38-40

  [6]胡文濤.一種基于協(xié)議的提高RS-485實(shí)時(shí)性的方法[J]. 現(xiàn)代電子技術(shù), 2013,36(18):10-12

  [7]周建章,趙穎.基于RS- 485主從的改進(jìn)[J].電子質(zhì)量,2011,1:23-25


本文來(lái)源于中國(guó)科技期刊《電子產(chǎn)品世界》2016年第1期第45頁(yè),歡迎您寫(xiě)論文時(shí)引用,并注明出處。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉