新聞中心

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

        基于RS-485總線的多主機通信方法

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

        3.2.2 接收方工作流程

        本文引用地址:http://www.104case.com/article/284991.htm

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

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

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

        4 程序設(shè)計

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

        4.1 初始化程序

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

          void InitDev(void)

          {

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

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

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

          GLCD_init();//初始化TFT屏

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

          }

        4.2 中斷接收程序

          中斷接收程序主要對符合數(shù)據(jù)幀格式的報文進(jìn)行接收,根據(jù)報文中的目的節(jié)點過濾掉發(fā)給其它節(jié)點的報文,并對報文進(jìn)行幀校驗,最后設(shè)置相應(yīng)的標(biāo)識位,供接收數(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;

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

          ……

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

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

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

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

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

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

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

          ……

          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 報文發(fā)送程序

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

          ……

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

          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 報文處理程序

          為了保證中斷接收程序始終能快速響應(yīng)對方發(fā)來的數(shù)據(jù),我們把報文處理程序放在中斷之外,以免程序處理當(dāng)前報文用時過長,影響下一組報文的接收。在主程序中通過對接收標(biāo)志位的判斷來調(diào)用報文處理程序,根據(jù)接收報文內(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é)語

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

        參考文獻(xiàn):

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

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

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

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

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

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

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


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


        上一頁 1 2 下一頁

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 惠来县| 肥城市| 泰来县| 云林县| 马山县| 汶川县| 邢台市| 高邮市| 凤冈县| 红桥区| 平原县| 景泰县| 东山县| 石台县| 南城县| 巢湖市| 得荣县| 万年县| 赤峰市| 安平县| 绵竹市| 原阳县| 阳高县| 陕西省| 瑞金市| 杨浦区| 双柏县| 蒙城县| 会理县| 淅川县| 商南县| 固始县| 修文县| 南昌市| 琼海市| 通渭县| 彰化市| 林口县| 西丰县| 咸宁市| 金溪县|