摘? 要: 利用以太網(wǎng)的沖突檢測方式在RS485總線上連接的多個設(shè)備之間采用多主方式對等傳輸數(shù)據(jù),并給出了這種方法的硬件設(shè)計方案和軟件流程。
關(guān)鍵詞: RS485總線? 對等網(wǎng)? 沖突檢測
?
目前以RS485總線為基礎(chǔ)組建的各類網(wǎng)絡(luò)中,多采用主從式通信。但在一些組網(wǎng)中,采用對等式的通信方式更符合設(shè)計要求,效率更高。例如在一套由人機接口、紅外控制模塊(用于遙控家電)、三表集抄模塊、安防模塊和家居網(wǎng)關(guān)服務(wù)終端(與互聯(lián)網(wǎng)及電話相聯(lián))等組成的智能家居服務(wù)系統(tǒng)中,該家居系統(tǒng)內(nèi)部采用什么樣的數(shù)據(jù)傳輸方式,怎樣可靠和高效地傳輸數(shù)據(jù),對整個家居系統(tǒng)的正常運轉(zhuǎn)至關(guān)重要。因為總線上發(fā)起通信的數(shù)據(jù)有外界的遙控指令、人機接口處傳來的控制和查詢指令以及一些模塊主動上傳的指令(如報警),這些指令大多數(shù)是隨機的,若采用主從式難以符合要求,而采用多主方式的對等網(wǎng)可以符合數(shù)據(jù)傳輸?shù)囊?使數(shù)據(jù)及時發(fā)送。同時由于各個設(shè)備是對等的關(guān)系,實行分布式控制,所以一個模塊損壞,不會影響其他模塊工作,因此不存在主站損壞導(dǎo)致整個通信線路癱瘓的問題,從而使通信的可靠性大大增加。
1? 多主式對等網(wǎng)數(shù)據(jù)傳輸方案的選擇
在采用多主方式后,掛接在總線上的各設(shè)備之間是對等的關(guān)系,各節(jié)點在發(fā)送數(shù)據(jù)時存在總線競爭問題,需要考慮設(shè)備之間的優(yōu)先發(fā)送數(shù)據(jù)問題以及傳送效率問題。要解決總線競爭問題,可以考慮用以太網(wǎng)的沖突檢測方案或令牌總線方案。在以太網(wǎng)的沖突檢測方案中,當(dāng)總線上有不同節(jié)點同時發(fā)送數(shù)據(jù)時,會由于信號疊加而造成信號紊亂,即信號的沖突。要避免這種情況,節(jié)點在發(fā)送數(shù)據(jù)前要偵聽一下總線是否忙,不忙時才發(fā)送,以減少沖突。當(dāng)發(fā)生沖突時,可以用二進制指數(shù)退避算法來解決沖突。令牌總線方案是通過令牌的傳送來控制每個節(jié)點發(fā)送的時間,從而解決總線的競爭。它雖然不存在沖突問題,但要不斷地傳送令牌,某一節(jié)點要發(fā)送數(shù)據(jù),必須等到獲得令牌才能發(fā)送,這會延誤重要數(shù)據(jù)的發(fā)送,并加大數(shù)據(jù)量和等待時間。在輕載荷時效率低,而且其協(xié)議比沖突檢測方案復(fù)雜,初始化時間長。綜合考慮,以太網(wǎng)的沖突檢測方案在輕載荷時效率高,且協(xié)議較令牌總線方案簡單??紤]到智能家居項目中總線上負(fù)荷不大,沖突量少,因此采用以太網(wǎng)的沖突檢測方式來實現(xiàn)多主方式數(shù)據(jù)傳輸。
2? 多主式數(shù)據(jù)傳輸?shù)挠布O(shè)計
2.1 器件的選擇
系統(tǒng)的主控單片機采用AT89C52。AT89C52能夠與51系列單片機兼容,具有8KB Flash程序存儲器、256B數(shù)據(jù)存儲器,以及串口中斷和定時器。這些完全能夠滿足系統(tǒng)對中斷、數(shù)據(jù)存儲器和程序存儲器容量的需求。RS485收發(fā)器可考慮用SN75LBC184,該芯片具有很好的抗干擾性能,可靠性高。
2.2 設(shè)計原理
硬件原理圖如圖1所示。單片機AT89C52的串口數(shù)據(jù)線與SN75LBC184的收發(fā)端口相連。SN75LBC184的使能端由單片機I/O口控制,通過RS485收發(fā)器進行單片機信號與RS485信號的轉(zhuǎn)換。利用AT89C52有一個全雙工串口通信端口的特性,在發(fā)送1個字節(jié)后,緊接著從總線收一次數(shù)據(jù),并比較2個數(shù)據(jù)是否相同。若相同,則認(rèn)為沒有產(chǎn)生沖突;否則認(rèn)為產(chǎn)生了沖突,去執(zhí)行相應(yīng)的沖突處理。此時RS485收發(fā)器要收發(fā)同時使能,可讓收(/RE)一直使能,發(fā)使能(DE)用一個單片機I/O口(P11)控制。為了減小RS485總線上的盲區(qū)狀態(tài),加強通信的可靠性,在RS485總線的出口處加3個保護電阻,分別是上拉電阻750Ω、接地電阻750Ω和2條信號線之間的電阻130Ω。
3?多主式數(shù)據(jù)傳輸?shù)能浖O(shè)計
下面將介紹采用RS485總線組建對等網(wǎng),利用沖突檢測方式傳送數(shù)據(jù)的原理及軟件流程。該總線傳輸速率為38.4kbps,采用多主發(fā)送方式。
3.1 發(fā)送流程
由于采用類似以太網(wǎng)的沖突檢測方式來發(fā)送數(shù)據(jù),因此為了減少沖突,數(shù)據(jù)在發(fā)送之前應(yīng)先進行總線偵聽,即確定總線是否有數(shù)據(jù)正在發(fā)送。若有,則等待到線路空閑;否則可發(fā)送,這樣可以減少沖突發(fā)生的概率。按傳輸速率為38.4kbps計算,每位的發(fā)送時間為26μs,以每個字節(jié)為10位計(起始位和結(jié)束位各1位,數(shù)據(jù)位8位),則發(fā)送每個字節(jié)需260μs。發(fā)送1幀32字節(jié)數(shù)據(jù)最少需8320μs。在總線偵聽時,若500μs沒有接收中斷,則認(rèn)為總線空閑,可以發(fā)送數(shù)據(jù),等待時間很短,在數(shù)據(jù)量小時效率高。當(dāng)某些數(shù)據(jù)幀要求有回應(yīng)時,要發(fā)送回應(yīng)幀,若回應(yīng)幀滿足以下條件:
(1)發(fā)送1個字節(jié)要260μs,1幀最大32字節(jié)數(shù)據(jù)至少要8320μs,取10ms。
(2)對方接收到的時間取10ms。
(3)程序處理時間取10ms。
(4)對方發(fā)送時間按10次沖突算,則(210-1)×3×500=1534500,取1.54s。
(5)接收回應(yīng)幀時間10ms。
則等待時間T=10+10+1534+10=1564ms,可取1.6s。
若要求回應(yīng)幀的數(shù)據(jù)等待一段時間后還沒收到回應(yīng)幀,則重發(fā)數(shù)據(jù),這樣可減少誤碼率。若多次無法通信,則各裝置要置出錯信息,作相應(yīng)處理或向外界報警。具體發(fā)送流程如圖2所示。當(dāng)有數(shù)據(jù)要發(fā)送時,先判斷線路是否忙,若不忙,則可以發(fā)送數(shù)據(jù)。在發(fā)送途中檢測是否有沖突,若在發(fā)送中發(fā)現(xiàn)有數(shù)據(jù)沖突,則進行沖突處理,算出退避時間,等待退避時間后重傳數(shù)據(jù),最多10次;若無沖突,則發(fā)送完成,在設(shè)定的時間內(nèi)等待回應(yīng)幀,若在規(guī)定時間內(nèi)沒收到回應(yīng)幀,則置相應(yīng)標(biāo)志選擇重傳本幀數(shù)據(jù)或放棄;若收到回應(yīng)幀,則本次通信成功。
?
3.2 接收流程
串口通信采用異步傳送方式。字符是按幀格式進行傳送的,每幀數(shù)據(jù)中起始位和結(jié)束位各占1位(用于建立發(fā)送與接收之間的同步),數(shù)據(jù)位8位,無校驗位。接收流程圖如圖3所示。在串口收到數(shù)據(jù)后,按格式去判別所接收的數(shù)據(jù)是否正確,即先找到起始符,然后判斷是否為發(fā)給自己的數(shù)據(jù),并按自定義協(xié)議的數(shù)據(jù)要求和范圍逐個進行檢驗。若為有效數(shù)據(jù)則放入接收緩沖區(qū),置接收標(biāo)志,讓應(yīng)用層處理,有需要回應(yīng)的,應(yīng)用層處理完后發(fā)送相應(yīng)的回應(yīng)幀。對接收到的數(shù)據(jù)進行處理時,先看是否符合通信格式,CRC校驗是否通過,然后才譯碼。若其中一個數(shù)據(jù)不合要求,就清緩沖區(qū),認(rèn)為數(shù)據(jù)無效,有些數(shù)據(jù)需返回錯誤信息。在通信中可能有一些異常狀態(tài),如接收數(shù)據(jù)出錯或1幀數(shù)據(jù)沒有收完。在此情況下,若數(shù)據(jù)之間的間隔超過最大等待時間,則需把接收數(shù)據(jù)緩沖區(qū)清空,認(rèn)為數(shù)據(jù)無效。
?
3.3 沖突檢測流程
若2個設(shè)備同時在空閑的電纜上發(fā)送數(shù)據(jù),就會發(fā)生數(shù)據(jù)沖突,此時系統(tǒng)要能檢測出總線上的沖突。在發(fā)送時把數(shù)據(jù)賦給一個變量,進入發(fā)送中斷后等待接收中斷標(biāo)志(若超時也認(rèn)為發(fā)生了沖突),然后從串口取數(shù),與變量中的數(shù)比較即可判斷有無沖突。沖突檢測流程圖如圖4所示。進入串口中斷后,如果是發(fā)送中斷,則清TI(發(fā)送中斷)標(biāo)志,等待RI(接收中斷)標(biāo)志。若超過設(shè)定時間(500ms)沒收到RI標(biāo)志為1的信號,則認(rèn)為發(fā)生了沖突。在接收到RI標(biāo)志后,把串口緩沖區(qū)的數(shù)據(jù)與發(fā)送前存的數(shù)據(jù)比較,若二者相同,則不存在沖突;若不同,則認(rèn)為發(fā)生了沖突。
3.4 沖突處理流程
在發(fā)送數(shù)據(jù)中,若檢測到一次收發(fā)數(shù)據(jù)不同,就認(rèn)為總線上有數(shù)據(jù)沖突,要進行沖突處理。沖突處理流程圖如圖5所示。發(fā)送過程中,當(dāng)檢測到總線上有數(shù)據(jù)沖突,則所有設(shè)備停止發(fā)送,計算出等待的時間,退出串口中斷,在等待一段退避時間后,重新發(fā)送。等待時間的計算采用改進的二進制指數(shù)退避算法。
?
在二進制指數(shù)退避算法中退避時延T=(2i-1)×基本時間間隔×優(yōu)先系數(shù)。
其中i為沖突次數(shù),最大取10,基本時間間隔定為500μs。優(yōu)先系數(shù)是考慮讓一些重要數(shù)據(jù)在發(fā)生沖突后可以優(yōu)先發(fā)出,各站中越重要的數(shù)據(jù)優(yōu)先系數(shù)越低,這是對以太網(wǎng)二進制指數(shù)退避算法的改進。優(yōu)先系數(shù)根據(jù)系統(tǒng)需求確定。根據(jù)總線上各設(shè)備的情況,以智能家居系統(tǒng)為例,可考慮把通信信息優(yōu)先級分為3級。如安防報警信息優(yōu)先級別最高,優(yōu)先系數(shù)最小,可設(shè)為1,其他設(shè)備的優(yōu)先系數(shù)可根據(jù)情況設(shè)為2或3。當(dāng)發(fā)生一次沖突時,安防優(yōu)先系數(shù)為1,基本時間間隔取500μs。當(dāng)?shù)却?00μs后,若總線空閑,則可重新發(fā)送,即只等待1ms。計算后的計數(shù)值在單片機的定時器中計數(shù),計時時間到,則再次總線偵聽,發(fā)送數(shù)據(jù)。
4? 結(jié)束語
該方案已經(jīng)在一套智能家居系統(tǒng)中得到實現(xiàn),同時也可作為其他項目的通信參考方案。該方案不僅可在RS485總線上使用,經(jīng)一定的修改之后還可以用于電力載波等方式,因此具有很好的兼容性。
?
參考文獻
1? Forouzan B,Coombs C,Fegan S C著,潘仡,朱丹宇,周正康譯.數(shù)據(jù)通信與網(wǎng)絡(luò).北京:機械工業(yè)出版社,2000
2? FAILSAFE Biasing of Differential Buses.National?Semiconductor Corporation,1998