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