本發(fā)明屬于通訊領(lǐng)域,尤其涉及一種基于UART的主從多機(jī)通訊系統(tǒng)及方法。
背景技術(shù):
在物聯(lián)網(wǎng)的潮流下,設(shè)備與設(shè)備之間的信息交互必不可少。設(shè)備間數(shù)據(jù)的實(shí)時(shí)交互能提高用戶的體驗(yàn)感,更有利于產(chǎn)品的安全可靠性。目前行業(yè)內(nèi)短距離點(diǎn)對(duì)點(diǎn)通信普遍使用UART(Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)傳輸器),主流的MCU((Microcontroller Unit,微控制單元)一般自帶一個(gè)UART口,可與RS232線連接。標(biāo)準(zhǔn)UART采用簡單的一對(duì)一通訊方式,無法滿足目前家電控制行業(yè)、自動(dòng)化設(shè)備控制領(lǐng)域一對(duì)多的通訊需求。其他的通信方式,如RS485、CAN總線雖然可以實(shí)現(xiàn)一對(duì)多的通訊方式,但是主流的MCU甚少自帶RS485或CAN通信功能,用戶需要外接相應(yīng)的通信IC或通信轉(zhuǎn)換IC,成本相對(duì)較高。此外,RS485或CAN都是三線以上通信,接口多、連線復(fù)雜。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種基于UART的主從多機(jī)通訊系統(tǒng)及方法,旨在解決現(xiàn)有技術(shù)中標(biāo)準(zhǔn)UART通訊不能支持主從多機(jī)通訊,而采用其他通信方式實(shí)現(xiàn)主從多機(jī)通訊存在成本高、連線復(fù)雜、信號(hào)容易相互干擾的問題。
本發(fā)明實(shí)施例是這樣實(shí)現(xiàn)的,一種基于UART的主從多級(jí)通訊系統(tǒng),包括:一主機(jī)、n個(gè)從機(jī)和一通信總線,n為大于等于1的正整數(shù),所述主機(jī)的TX口、RX口和一IO口分別通過電路連接到所述通信總線上,各從機(jī)的TX口、RX口和一IO口也分別通過電路連接到所述通信總線上
本發(fā)明實(shí)施例還提供一種基于UART的主從多級(jí)通訊方法,主機(jī)的TX口、RX口和一IO口分別通過電路連接到一通信總線,各從機(jī)的TX口、RX口和一IO口也分別通過電路連接到所述通信總線,方法包括:
從機(jī)連接到通信總線后,通過自身的TX口發(fā)送握手信號(hào)到通信總線,所述握手信號(hào)包括所述從機(jī)的設(shè)備ID;
主機(jī)的RX口通過通信總線接收到所述握手信號(hào)后,對(duì)所述握手信號(hào)進(jìn)行解析,并通過自身的TX口發(fā)送握手成功信號(hào)到通信總線,所述握手成功信號(hào)包括解析出的從機(jī)設(shè)備ID;
所述從機(jī)的RX口通過通信總線接收到所述握手成功信號(hào)后,對(duì)所述握手成功信號(hào)進(jìn)行解析,若解析出的從機(jī)設(shè)備ID與自身設(shè)備ID相同,則等待主機(jī)發(fā)送命令數(shù)據(jù);
主機(jī)通過自身的TX口發(fā)送命令數(shù)據(jù)到通信總線,所述命令數(shù)據(jù)中包括主機(jī)欲呼叫的從機(jī)設(shè)備ID;
所述從機(jī)的RX口通過通信總線接收到所述命令數(shù)據(jù)后,對(duì)所述命令數(shù)據(jù)進(jìn)行解析,若解析出的從機(jī)設(shè)備ID與自身設(shè)備ID相同,則根據(jù)解析出的命令數(shù)據(jù)進(jìn)行處理,并通過自身的TX口發(fā)送回碼到通信總線,所述回碼包括所述從機(jī)的設(shè)備ID。
本發(fā)明的有益效果是:通過將主機(jī)的RX口、TX口和從機(jī)的RX口、TX口連接到同一通信總線,減少了設(shè)備與設(shè)備之間的連線以及信號(hào)的相互干擾。為了保證不會(huì)出現(xiàn)兩個(gè)設(shè)備同時(shí)發(fā)送數(shù)據(jù)的情況,每個(gè)設(shè)備增設(shè)一個(gè)IO口對(duì)通信總線進(jìn)行檢測,只有當(dāng)通信總線空閑時(shí)才能發(fā)送數(shù)據(jù)。此外,本發(fā)明不需要增加額外的器件,成本低廉,設(shè)計(jì)周期短,可以廣泛應(yīng)用于短距離多個(gè)設(shè)備之間的通信。
附圖說明
圖1是本發(fā)明實(shí)施例一提供的一種基于UART主從多機(jī)的通訊系統(tǒng)的原理框圖;
圖2是本發(fā)明實(shí)施例二提供的一種基于UART主從多機(jī)的通訊系統(tǒng)的電路示意圖;
圖3是本發(fā)明實(shí)施例三提供的一種基于UART主從多機(jī)的通訊方法的流程圖;
圖4是本發(fā)明實(shí)施例提供一種通信幀格式示意圖;
圖5是本發(fā)明實(shí)施例四提供的一種基于UART主從多機(jī)通訊的時(shí)序圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
實(shí)施例一
UART通信正常為三根線,分別為RX、TX、GND,屬于全雙工的通信,所以收發(fā)數(shù)據(jù)是分開的。為了使設(shè)備間的連線減少,同時(shí)不影響相互之間的通信,本發(fā)明將RX和TX通過電路合并連接到一根通信總線上。如圖1所示為本發(fā)明實(shí)施例一提供的一種基于UART主從多機(jī)的通訊系統(tǒng)的原理框圖。該基于UART主從多機(jī)的通訊系統(tǒng)包括一主機(jī)、n個(gè)從機(jī)和一通信總線,n為大于等于1的正整數(shù)。其中,主機(jī)和從機(jī)通過該條通信總線相互連通,具體的,主機(jī)的TX口、RX口和一IO口分別通過電路連接到該通信總線上,各從機(jī)的TX口、RX口和一IO口也分別通過電路連接到該通信總線上。
本發(fā)明實(shí)施例通過將主機(jī)的RX口、TX口和從機(jī)的RX口、TX口連接到同一通信總線,減少了設(shè)備與設(shè)備之間的連線以及信號(hào)的相互干擾。此外,本發(fā)明不需要增加額外的器件,成本低廉,設(shè)計(jì)周期短,可以廣泛應(yīng)用于短距離多個(gè)設(shè)備之間的通信。
實(shí)施例二
如圖2是本發(fā)明實(shí)施例二提供的一種基于UART主從多機(jī)的通訊系統(tǒng)的電路示意圖。該通信系統(tǒng)包括主機(jī)U1、從機(jī)U2、從機(jī)U3……從機(jī)Un,主機(jī)U1主機(jī)的TX口(8號(hào)腳)外接第一電阻R1連接到通信總線上,主機(jī)U1的RX口(7號(hào)腳)外接第二電阻R2連接到通信總線上,主機(jī)的IO口(9號(hào)腳)外接第三電阻R3連接到通信總線上。從機(jī)U2主機(jī)的TX口(8號(hào)腳)外接第四電阻R4連接到通信總線上,從機(jī)U1的RX口(7號(hào)腳)外接第五電阻R5連接到通信總線上,從機(jī)的IO口(9號(hào)腳)外接第六電阻R6連接到通信總線上。此外,為了讓通信總線在沒有通信數(shù)據(jù)時(shí)一直處于高電平,一電源通過串聯(lián)第七電阻R7連接到通信總線,給通信總線一個(gè)上拉。
需要說明的是,本發(fā)明中電阻是用來隔離電信號(hào)和分壓,可以根據(jù)實(shí)際需要進(jìn)行設(shè)置,并非必要設(shè)置項(xiàng)。MCU的TX口、RX口通過外接一個(gè)電阻然后連接到通信總線上,實(shí)現(xiàn)單總線收發(fā)功能。為了保證不會(huì)出現(xiàn)兩個(gè)設(shè)備同時(shí)發(fā)送數(shù)據(jù)的情況,每個(gè)設(shè)備增設(shè)一個(gè)IO口對(duì)通信總線進(jìn)行檢測,只有當(dāng)通信總線空閑時(shí)才能發(fā)送數(shù)據(jù)。本發(fā)明實(shí)施例中采用9號(hào)IO口來檢測通信總線,實(shí)際應(yīng)用中,也可以采用其他IO口對(duì)通信總線進(jìn)行檢測。本發(fā)明實(shí)施例中各MCU的6號(hào)腳用來接地,實(shí)際應(yīng)用中,可以根據(jù)MCU的對(duì)接地引腳的設(shè)置來接地。
本發(fā)明實(shí)施例通過將主機(jī)的RX口、TX口和從機(jī)的RX口、TX口連接到同一通信總線,減少了設(shè)備與設(shè)備之間的連線以及信號(hào)的相互干擾。此外,本發(fā)明不需要增加額外的器件,成本低廉,設(shè)計(jì)周期短,可以廣泛應(yīng)用于短距離多個(gè)設(shè)備之間的通信。
實(shí)施例三
如圖3所示為本發(fā)明實(shí)施例三提供的一種基于UART主從多機(jī)的通訊方法的流程圖,包括如下步驟:
S301,從機(jī)連接到通信總線后,通過自身的TX口發(fā)送握手信號(hào)到通信總線,所述握手信號(hào)包括該從機(jī)的設(shè)備ID。
當(dāng)一臺(tái)從機(jī)掛接到通信總線上后,需要與主機(jī)進(jìn)行握手后方可正常使用。由于設(shè)備的TX口、RX口合并連接到同一通信總線上,為了保證不會(huì)出現(xiàn)兩個(gè)設(shè)備同時(shí)發(fā)送數(shù)據(jù)的情況,每個(gè)設(shè)備增設(shè)一個(gè)IO口對(duì)通信總線進(jìn)行檢測,只有當(dāng)通信總線空閑時(shí)才能發(fā)送數(shù)據(jù)。因此,從機(jī)在發(fā)送握手信號(hào)之前,需要通過自身的IO口檢測通信總線是否空閑,如果空閑,則發(fā)送握手信號(hào)至主機(jī)。具體的,當(dāng)IO口檢測到持續(xù)高電平時(shí),表示通信總線為空閑,檢測到電平變化時(shí),表示通信總線為非空閑。
進(jìn)一步地,在從機(jī)連接到通信總線后,通過自身的TX口發(fā)送握手信號(hào)到通信總線后還包括:啟動(dòng)一定時(shí)器,若在預(yù)設(shè)的時(shí)間內(nèi)未接收到主機(jī)返回的握手成功信號(hào),則從機(jī)將再次發(fā)送握手信號(hào)至主機(jī)。
S302,主機(jī)的RX口通過通信總線接收到握手信號(hào)后,對(duì)握手信號(hào)進(jìn)行解析,并通過自身的TX口發(fā)送握手成功信號(hào)到通信總線,握手成功信號(hào)包括解析出的從機(jī)設(shè)備ID。
由于所有從機(jī)和主機(jī)都掛接在一條通信總線上,則當(dāng)其中一臺(tái)設(shè)備發(fā)送數(shù)據(jù)到通信總線時(shí),掛接在通信總線上的其他所有設(shè)備都能接收到該數(shù)據(jù)。對(duì)于從機(jī)來說,接收到數(shù)據(jù)后,對(duì)數(shù)據(jù)進(jìn)行解析,如果解析出的設(shè)備ID不是自身的設(shè)備ID,則丟棄。
此步驟中,主機(jī)接收到握手信號(hào)之后,對(duì)握手信號(hào)進(jìn)行解析,可以獲知是哪個(gè)從機(jī)設(shè)備掛接到通信總線上了,從而使得主機(jī)可以發(fā)送相應(yīng)的握手成功信號(hào)到該從機(jī)。
S303,從機(jī)的RX口通過通信總線接收到握手成功信號(hào)后,對(duì)握手成功信號(hào)進(jìn)行解析,若解析出的從機(jī)設(shè)備ID與自身設(shè)備ID相同,則等待主機(jī)發(fā)送命令數(shù)據(jù)。
掛接在該通信總線上的所有從機(jī)都能接收到主機(jī)發(fā)送的握手成功信號(hào),經(jīng)過解析,發(fā)現(xiàn)解析出從機(jī)設(shè)備ID與自身設(shè)備ID不同,則認(rèn)為此幀數(shù)據(jù)不是發(fā)給自己的,就丟棄;若相同,則人為此幀數(shù)據(jù)是發(fā)給自己的,表示握手成功,等待主機(jī)發(fā)送命令數(shù)據(jù)即可。
S304,主機(jī)通過自身的TX口發(fā)送命令數(shù)據(jù)到通信總線,命令數(shù)據(jù)中包括待接收命令的從機(jī)設(shè)備ID。
進(jìn)一步地,主機(jī)發(fā)送完命令數(shù)據(jù)后,啟動(dòng)一定時(shí)器,若在預(yù)設(shè)的時(shí)間內(nèi)未收到該從機(jī)的回碼,則會(huì)重新發(fā)送,發(fā)送三次或預(yù)設(shè)次數(shù)仍未收到回碼,則認(rèn)為該從機(jī)設(shè)備離線或異常,進(jìn)行報(bào)錯(cuò)處理。
S305,從機(jī)的RX口通過通信總線接收到命令數(shù)據(jù)后,對(duì)命令數(shù)據(jù)進(jìn)行解析,若解析出的從機(jī)設(shè)備ID與自身設(shè)備ID相同,則根據(jù)解析出的命令數(shù)據(jù)進(jìn)行處理,并通過自身的TX口發(fā)送回碼到通信總線,所述回碼包括該從機(jī)的設(shè)備ID。
主機(jī)接收到該從機(jī)的回碼后,根據(jù)回碼發(fā)送下一幀數(shù)據(jù)。
為了保障數(shù)據(jù)的正確傳輸,本發(fā)明實(shí)施例還定義了一個(gè)專門的通信數(shù)據(jù)格式,如圖4所示。通信幀格式包括頭命令、從機(jī)設(shè)備ID、幀長度、數(shù)據(jù)、校驗(yàn)碼和結(jié)束碼,其中,通信幀格式至少包括從機(jī)設(shè)備ID、數(shù)據(jù)和校驗(yàn)碼。通信幀中的頭命令用來識(shí)別通信總線上的數(shù)據(jù)是主機(jī)發(fā)出還是從機(jī)發(fā)出,可以僅設(shè)置1個(gè)byte,如,主機(jī)發(fā)出設(shè)置為A0,從機(jī)發(fā)出設(shè)置為A1。這樣,對(duì)于某一從機(jī)發(fā)出的數(shù)據(jù),其他從機(jī)僅需解析頭命令即可分辨,而不需要進(jìn)行設(shè)備ID的比對(duì),簡化了程序,提高了效率。
各設(shè)備的TX口、RX口合并連接到同一通信總線后,基于UART的通信就由原來的雙工通信變?yōu)榘腚p工通信了,所以在軟件設(shè)計(jì)上需要對(duì)各MCU重新配置定義數(shù)據(jù)的收發(fā)時(shí)序,防止收發(fā)沖突。當(dāng)MCU處于接收數(shù)據(jù)狀態(tài)時(shí),需要將MCU自帶的接收寄存器設(shè)置為接收使能,同時(shí)將TX口設(shè)置為輸入口,即TX口為高阻狀態(tài),不會(huì)影響到RX口的接收;當(dāng)接收數(shù)據(jù)完成后進(jìn)入發(fā)送數(shù)據(jù)狀態(tài)時(shí),啟動(dòng)發(fā)送寄存器的發(fā)送使能,并將TX口設(shè)置為輸出,并輸出高低電平,同時(shí)禁止RX口的接收使能,防止RX口接收到自己發(fā)送出去的數(shù)據(jù)。當(dāng)數(shù)據(jù)發(fā)送完成后,再打開RX口的接收使能以及關(guān)閉寄存器的發(fā)送使能。
本發(fā)明實(shí)施例通過將主機(jī)的RX口、TX口和從機(jī)的RX口、TX口連接到同一通信總線,減少了設(shè)備與設(shè)備之間的連線以及信號(hào)的相互干擾。此外,本發(fā)明不需要增加額外的器件,成本低廉,設(shè)計(jì)周期短,可以廣泛應(yīng)用于短距離多個(gè)設(shè)備之間的通信。
實(shí)施例四
如圖5所示為本發(fā)明實(shí)施例四提供的一種基于UART主從多機(jī)通訊的時(shí)序圖,包括一個(gè)主機(jī)和兩個(gè)從機(jī)。假設(shè),從機(jī)001已與主機(jī)完成握手,可以與主機(jī)正常通信,從機(jī)002為剛掛載到通信總線上的設(shè)備。
需要說明的是,本實(shí)施例中握手信號(hào)、握手成功信號(hào)、命令數(shù)據(jù)以及回碼均采用如圖4所示的通信幀格式。不論是主機(jī)還是從機(jī),在發(fā)送通信幀之前,均需要檢測通信總線是否空閑,如果空閑,則發(fā)送,如果非空閑,表示有其他從機(jī)或主機(jī)在傳輸數(shù)據(jù),則等待一段時(shí)間后繼續(xù)檢測;在發(fā)送通信幀之后,會(huì)啟動(dòng)一定時(shí)器,若在預(yù)設(shè)的時(shí)間內(nèi)未收到對(duì)方的回應(yīng),則會(huì)再次發(fā)送;在接收通信幀之后,會(huì)根據(jù)通信幀中攜帶的校驗(yàn)碼對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),如果數(shù)據(jù)校驗(yàn)出錯(cuò),則丟棄此幀數(shù)據(jù)并發(fā)送回碼要求重新發(fā)送。連續(xù)5次校驗(yàn)碼出錯(cuò),則停止預(yù)期通信,并報(bào)錯(cuò)。從機(jī)除了發(fā)送握手信號(hào),不會(huì)主動(dòng)給主機(jī)發(fā)送數(shù)據(jù),主機(jī)給從機(jī)發(fā)送數(shù)據(jù)后,必須要接到正確回碼才會(huì)給另一個(gè)從機(jī)發(fā)送數(shù)據(jù)。
以下介紹從機(jī)002掛載到通信總線上后,該主從多機(jī)通信系統(tǒng)的大致工作流程:
步驟S502,從機(jī)002發(fā)送握手信號(hào)到主機(jī)。
該握手信號(hào)通過從機(jī)002的TX口發(fā)送到通信總線,其頭命令為1(表示該信號(hào)由從機(jī)發(fā)出),從機(jī)設(shè)備ID為002。
從機(jī)001通過其的RX口接收到握手信號(hào),通過對(duì)握手信號(hào)頭命令解析可知該信號(hào)由從機(jī)發(fā)出,直接丟棄該通信幀。
主機(jī)通過其RX口接收到握手信號(hào),對(duì)握手信號(hào)進(jìn)行解析,解析出等待握手的從機(jī)設(shè)備ID為002。
步驟S504,主機(jī)返回握手成功信號(hào)。
該握手成功信號(hào)的頭命令為0(表示該信號(hào)由主機(jī)發(fā)出),從機(jī)設(shè)備ID為002。
從機(jī)002通過自身的RX口接收到主機(jī)發(fā)來的握手成功信號(hào),對(duì)握手成功信號(hào)進(jìn)行解析,先解析出頭命令為0,則繼續(xù)解析出從機(jī)設(shè)備ID為002,經(jīng)過匹配,該從機(jī)設(shè)備ID與自身設(shè)備ID相同,則確認(rèn)這是主機(jī)發(fā)送給自己的信號(hào)。進(jìn)一步,根據(jù)幀長度對(duì)數(shù)據(jù)進(jìn)行解析,確認(rèn)主機(jī)已成功接收到自己發(fā)送的握手信號(hào),與主機(jī)握手成功。隨后從機(jī)002進(jìn)入等待狀態(tài),等待主機(jī)發(fā)送命令數(shù)據(jù)。
從機(jī)001接收到握手成功信號(hào)后,通過對(duì)頭命令的解析可知,該信號(hào)由從機(jī)發(fā)出,直接丟棄該通信幀。
步驟S506,主機(jī)發(fā)送命令數(shù)據(jù)到從機(jī)002。該命令數(shù)據(jù)的頭命令為0,從機(jī)設(shè)備ID為002。
從機(jī)001接收到命令數(shù)據(jù)經(jīng)解析發(fā)現(xiàn)不是發(fā)給自己的,將通信幀丟棄。
步驟S508,從機(jī)002對(duì)命令數(shù)據(jù)進(jìn)行解析,確認(rèn)是主機(jī)發(fā)送給自己的命令數(shù)據(jù),根據(jù)解析出的命令執(zhí)行處理。
步驟S510,從機(jī)002發(fā)送回碼給主機(jī)。
從機(jī)002執(zhí)行完命令后,根據(jù)執(zhí)行的結(jié)果發(fā)送回碼給主機(jī)?;卮a的頭命令為1,從機(jī)設(shè)備ID為002。
步驟S512,主機(jī)發(fā)送下一條命令數(shù)據(jù)給從機(jī)001。
主機(jī)接收到從機(jī)002返回的回碼,確認(rèn)回碼正確后,發(fā)送下一條命令數(shù)據(jù)給從機(jī)001。需要說明的是,如果主機(jī)在預(yù)定時(shí)間內(nèi)未收到相應(yīng)的回碼,則會(huì)再次發(fā)送上一條命令數(shù)據(jù)至相應(yīng)從機(jī),直到主機(jī)收到相應(yīng)從機(jī)的正確回碼才會(huì)發(fā)送下一條命令數(shù)據(jù)。
步驟S514,從機(jī)001對(duì)命令數(shù)據(jù)進(jìn)行解析,確認(rèn)是主機(jī)發(fā)送給自己的命令數(shù)據(jù),根據(jù)解析出的命令執(zhí)行處理。
從機(jī)002接收到命令數(shù)據(jù)經(jīng)解析發(fā)現(xiàn)不是發(fā)給自己的,將通信幀丟棄。
步驟S516,從機(jī)001發(fā)送回碼給主機(jī)。
本發(fā)明實(shí)施例通過將主機(jī)的RX口、TX口和從機(jī)的RX口、TX口連接到同一通信總線,減少了設(shè)備與設(shè)備之間的連線以及信號(hào)的相互干擾。此外,本發(fā)明不需要增加額外的器件,成本低廉,設(shè)計(jì)周期短,可以廣泛應(yīng)用于短距離多個(gè)設(shè)備之間的通信。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。