在嵌入式系統(tǒng)中,多個(gè)孤立節(jié)點(diǎn)之間的通信越來(lái)越重要,尤其是物聯(lián)網(wǎng)時(shí)代的到來(lái),多節(jié)點(diǎn)間通信已經(jīng)成為必不可少的功能。由此出現(xiàn)了許多通信手段,如RS-232、RS-485、CAN總線、ZigBee等,綜合考慮性能和成本,RS-485通信無(wú)疑是性價(jià)比最高的通信方式。因此探究高效、實(shí)用的多機(jī)通信方案具有重大的意義。
1 系統(tǒng)框圖
RS-485多機(jī)通信結(jié)構(gòu)圖如圖1所示。若干個(gè)RS-485節(jié)點(diǎn)通過(guò)總線連接,由網(wǎng)關(guān)節(jié)點(diǎn)輪詢?cè)L問(wèn)索要數(shù)據(jù),每個(gè)網(wǎng)關(guān)節(jié)點(diǎn)可以動(dòng)態(tài)地配置IP地址,以便上位機(jī)可以通過(guò)以太網(wǎng)控制網(wǎng)關(guān)節(jié)點(diǎn),從而獲得每個(gè)RS-485終端節(jié)點(diǎn)的數(shù)據(jù)。圖1中C節(jié)點(diǎn)為控制節(jié)點(diǎn),具有RS-485通信功能,T節(jié)點(diǎn)為網(wǎng)關(guān)節(jié)點(diǎn),除了RS-485功能外,還具有以太網(wǎng)功能,其作用就是將C節(jié)點(diǎn)的數(shù)據(jù)通過(guò)以太網(wǎng)功能傳送給上位機(jī)。
2 硬件設(shè)計(jì)
本文采用新唐科技公司的Cortex-M054探究RS-485多機(jī)通信協(xié)議。Cortex-M054有兩個(gè)UART,均可以配置成RS-485模式,此時(shí)Cortex-M054通過(guò)RTSX引腳自動(dòng)控制RS-485通信方向。
RS-485通過(guò)差分傳輸,A和B兩根信號(hào)線鉸鏈在一起來(lái)抵消各自的干擾。當(dāng)A、B信號(hào)的電壓差大于200mV時(shí),視為邏輯1;當(dāng)B、A信號(hào)的電壓差大于200 mV時(shí),視為邏輯0。
RS-485硬件原理圖如圖2所示。整套R(shí)S-485電路獨(dú)立供電,通過(guò)光電耦合器TLP781B+,與系統(tǒng)其他部件分開(kāi),以此來(lái)隔離干擾。和CAN總線相同,在機(jī)群的兩端(第一個(gè)節(jié)點(diǎn)和最后一個(gè)節(jié)點(diǎn)),必須加上匹配電阻,吸收反射信號(hào),大小為75 Ω左右。中間節(jié)點(diǎn)則不需要如此,因此留出了R1的位置,當(dāng)節(jié)點(diǎn)位于機(jī)群兩端的時(shí)候,則焊接上R1,這種方式大大地增強(qiáng)了電路的靈活性。
考慮電路的安全性,添加了TVS管,從而達(dá)到抗雷擊的效果。熱敏電阻相當(dāng)于自恢復(fù)的保險(xiǎn)絲,當(dāng)電流過(guò)大時(shí),它的阻值會(huì)變大,起到保護(hù)電路的作用。
3 軟件協(xié)議
3.1 協(xié)議格式
Modbus協(xié)議按功能可以劃分為:地址碼、功能碼、數(shù)據(jù)碼、CRC校驗(yàn)碼。而在RTU方式下,采用CRC循環(huán)冗余校驗(yàn),具體格式如圖3所示。
Modbus協(xié)議長(zhǎng)度根據(jù)用戶需求自己設(shè)定,地址碼標(biāo)識(shí)終端地址,即和網(wǎng)關(guān)節(jié)點(diǎn)通信的從機(jī)地址。功能碼則是主機(jī)告訴從機(jī)要執(zhí)行什么功能。數(shù)據(jù)碼長(zhǎng)度由用戶自己確定,最后根據(jù)前3個(gè)功能字段,生成兩個(gè)字節(jié)的CRC校驗(yàn)碼,用來(lái)驗(yàn)證前面的字段是否存在傳輸錯(cuò)誤。
3.2 CRC生成算法
CRC算法分為靜態(tài)和動(dòng)態(tài)兩種,靜態(tài)的適合片內(nèi)RAM非常有限的MCU,而動(dòng)態(tài)的適合RAM空間相對(duì)比較寬裕的MCU。CRC校驗(yàn)碼生成步驟如下:
①初始化寄存器內(nèi)容為0xffff。
②提取第一個(gè)字節(jié)數(shù)據(jù)和寄存器內(nèi)容相異或。
③檢測(cè)最低有效位(LSB),如果LSB為1,寄存器單獨(dú)和預(yù)置值異或;如果LSB為0,則不進(jìn)行任何操作,然后將結(jié)果向LSB方向移動(dòng),最高有效位以0填充。
④重復(fù)第③步8次,直到最后一位(第8位)完成。
⑤提取下一個(gè)8位字節(jié),重復(fù)步驟③、④的操作,等待所有字段都執(zhí)行完,最終寄存器中的值就是所求的CRC校驗(yàn)碼。
上述步驟中,如果預(yù)置值在整個(gè)過(guò)程中不變,則為靜態(tài)的CRC校驗(yàn);在動(dòng)態(tài)的CRC校驗(yàn)中,存在一個(gè)動(dòng)態(tài)表,預(yù)置值每次都根據(jù)動(dòng)態(tài)表變化,所以準(zhǔn)確性更高,而動(dòng)態(tài)表要開(kāi)辟一個(gè)較大的空間來(lái)存儲(chǔ)。所以,根據(jù)MCU的RAM大小決定使用動(dòng)態(tài)校驗(yàn)還是靜態(tài)校驗(yàn)。算法結(jié)束后,寄存器中存人的就是前N個(gè)字節(jié)的CRC校驗(yàn)碼,運(yùn)用該算法,不需要事先知道協(xié)議的整體長(zhǎng)度,最后都同樣生成兩個(gè)字節(jié)長(zhǎng)度的校驗(yàn)碼,故可移植性好、通用性強(qiáng)。
3.3 自動(dòng)地址識(shí)別模式通信
自動(dòng)地址識(shí)別模式是RS-485經(jīng)典模式,通過(guò)設(shè)置Cortex-M054的狀態(tài)寄存器,可使UART工作在此模式下。節(jié)點(diǎn)在接收到地址字節(jié)時(shí),判斷地址字節(jié)數(shù)據(jù)是否與UA_ALT_CSR[ADDR_MATCH]值相匹配,如果匹配,表示網(wǎng)關(guān)節(jié)點(diǎn)要與此終端通信,故接收下面網(wǎng)關(guān)節(jié)點(diǎn)發(fā)送的所有數(shù)據(jù)字節(jié)。同時(shí),地址字節(jié)和數(shù)據(jù)字節(jié)都會(huì)被存入U(xiǎn)ART的FIFO中,否則忽略所有字節(jié),既不產(chǎn)生中斷,也不存入FIFO,直到匹配。
串口通信中由起始位、數(shù)據(jù)位、奇偶校驗(yàn)位、停止位4部分組成。當(dāng)奇偶校驗(yàn)位為0時(shí),表示傳輸?shù)氖菙?shù)據(jù)字節(jié);當(dāng)它為1時(shí),表示傳輸?shù)氖堑刂纷止?jié)。Cortex—M054的UA_ALT_CSR是一個(gè)32位的寄存器,其ADDR_MATCH用8位來(lái)表示,故自動(dòng)地址識(shí)別模式最大從機(jī)數(shù)只支持256個(gè)節(jié)點(diǎn)。它的優(yōu)點(diǎn)是:由于RS-485所有從機(jī)掛載在一根總線上,故網(wǎng)關(guān)節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí),只有地址與自己匹配的節(jié)點(diǎn)才會(huì)響應(yīng),其他節(jié)點(diǎn)可以正常執(zhí)行自己原先的任務(wù)而不被打擾,系統(tǒng)整體效率高。缺點(diǎn)是從機(jī)只能被主機(jī)輪詢時(shí)才能發(fā)送信息,不能主動(dòng)和主機(jī)通信;一個(gè)總線上只能掛載256個(gè)節(jié)點(diǎn)。
3.4 普通模式通信
普通模式可以配置為接收所有數(shù)據(jù),也可以選擇性地忽略數(shù)據(jù),直到接收到地址字節(jié)。為了更加靈活地利用協(xié)議通信,將其設(shè)置為接收所有數(shù)據(jù),即只要網(wǎng)關(guān)節(jié)點(diǎn)向總線發(fā)送數(shù)據(jù),那么總線上的所有節(jié)點(diǎn)都會(huì)收到數(shù)據(jù),再根據(jù)協(xié)議解析內(nèi)容執(zhí)行相應(yīng)的動(dòng)作,接地流程圖如圖4所示。
Cortex—M054內(nèi)部有4 KB的Data Flash給用戶存儲(chǔ)數(shù)據(jù),故將節(jié)點(diǎn)的地址存入Flash中。當(dāng)系統(tǒng)上電復(fù)位后,先從Flash中讀出節(jié)點(diǎn)的地址,存入全局變量address中。當(dāng)收到數(shù)據(jù)包之后,進(jìn)行CRC校驗(yàn),如果正確就接收,再根據(jù)協(xié)議解析地址地段,其值與address比較,以此判定此包是否屬于自己。
自動(dòng)地址識(shí)別模式是由芯片自動(dòng)篩選地址,而此處需要軟件判斷。因此,地址長(zhǎng)度可以由用戶自己設(shè)定。
3.4.1 數(shù)據(jù)混亂
上述方法存在數(shù)據(jù)混亂的隱患。如果網(wǎng)關(guān)節(jié)點(diǎn)與終端節(jié)點(diǎn)通信過(guò)程都是用N個(gè)字節(jié)進(jìn)行,那么不會(huì)出現(xiàn)數(shù)據(jù)紊亂問(wèn)題。但若假設(shè)網(wǎng)關(guān)節(jié)點(diǎn)發(fā)送命令用N個(gè)字節(jié),而終端節(jié)點(diǎn)向網(wǎng)關(guān)節(jié)點(diǎn)回復(fù)數(shù)據(jù)時(shí),用M(M>N)個(gè)字節(jié),此時(shí)總線上的其他終端節(jié)點(diǎn)都會(huì)收到這M個(gè)字節(jié)。此時(shí),會(huì)認(rèn)為是網(wǎng)關(guān)節(jié)點(diǎn)發(fā)出的,所以只解析前N個(gè)字節(jié)的數(shù)據(jù),那么在FIFO中就剩下了(M—N)個(gè)字節(jié),即此時(shí)FIFO中并不為空。若網(wǎng)關(guān)節(jié)點(diǎn)此時(shí)再與其他任意一個(gè)終端節(jié)點(diǎn)通信時(shí),程序會(huì)默認(rèn)先讀出殘留的(M—N)個(gè)字節(jié)數(shù)據(jù),就會(huì)造成數(shù)據(jù)紊亂,網(wǎng)關(guān)節(jié)點(diǎn)再難與其他節(jié)點(diǎn)正常通信。
解決方法是在每次有數(shù)據(jù)進(jìn)入FIFO中后,觸發(fā)中斷,將所有的數(shù)據(jù)都讀出,而只解析前N個(gè)字節(jié)。因?yàn)樵谡麄€(gè)RS-485系統(tǒng)中,只有網(wǎng)關(guān)節(jié)點(diǎn)才能與終端節(jié)點(diǎn)通信,各個(gè)終端節(jié)點(diǎn)之間不可以通信,而網(wǎng)關(guān)節(jié)點(diǎn)與終端節(jié)點(diǎn)通信是N個(gè)字節(jié)。一次讀空FIFO的目的就是清空FIFO中的無(wú)效數(shù)據(jù)。
3.4.2 改進(jìn)型RS-485協(xié)議
RS-485通信的最大缺點(diǎn)就是主從式的通信方式,從機(jī)只有在收到主機(jī)的命令后才可以與之通信。而CAN總線的每個(gè)節(jié)點(diǎn)可以在任意時(shí)刻接收和發(fā)送數(shù)據(jù),通過(guò)其仲裁體制,避免數(shù)據(jù)沖突,但是CAN總線的成本相對(duì)較高,對(duì)于實(shí)時(shí)性和安全性要求不高的場(chǎng)合,不適宜用CAN總線通信。
借鑒CSMA/CD協(xié)議,本文提出改進(jìn)型的通信方式。設(shè)置全局變量nesting,如果進(jìn)入一次RS-485中斷,則nesting加1。在終端需要向網(wǎng)關(guān)節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí),置nesting為0,延遲(address×10)ms;如果總線上沒(méi)有數(shù)據(jù)通信,nesting為0,此時(shí)節(jié)點(diǎn)可以主動(dòng)向網(wǎng)關(guān)節(jié)點(diǎn)發(fā)送數(shù)據(jù);否則,表示總線上繁忙,則繼續(xù)延遲(address)ms。
嘗試K次,K的大小根據(jù)用戶需求設(shè)定。若此終端節(jié)點(diǎn)已經(jīng)在網(wǎng)關(guān)節(jié)點(diǎn)的輪詢范圍之內(nèi),終端向網(wǎng)關(guān)發(fā)送的數(shù)據(jù)為緊急事件包,則K的值應(yīng)該盡量小;若主動(dòng)發(fā)送失敗,可以等待節(jié)點(diǎn)被輪詢之時(shí),再將此數(shù)據(jù)發(fā)送出去。若此終端節(jié)點(diǎn)不在網(wǎng)關(guān)節(jié)點(diǎn)的輪詢范圍之內(nèi),是新加入的節(jié)點(diǎn),則主動(dòng)發(fā)送信息的目的是告訴網(wǎng)關(guān),自己是新節(jié)點(diǎn),需要加入總線系統(tǒng)中,此時(shí)K值應(yīng)該盡量大,以保證新節(jié)點(diǎn)能夠不在上位機(jī)的協(xié)助下,自動(dòng)地加入總線系統(tǒng)中,提高系統(tǒng)的靈活性。終端發(fā)送流程圖如5所示。
網(wǎng)關(guān)節(jié)點(diǎn)不能輪循完一遍之后,又立即進(jìn)行下一次輪詢。這樣,總線上一直都會(huì)是忙碌狀態(tài)。網(wǎng)關(guān)節(jié)點(diǎn)必須在輪詢完一次之后,暫停L秒,這個(gè)空隙時(shí)間就是留給終端主動(dòng)向網(wǎng)關(guān)發(fā)送數(shù)據(jù)。L不宜過(guò)大,否則會(huì)大大降低系統(tǒng)整體效率,L的選取與系統(tǒng)共有多少終端節(jié)點(diǎn)且每個(gè)終端節(jié)點(diǎn)與網(wǎng)關(guān)節(jié)點(diǎn)通信時(shí)間有關(guān)。
使用普通模式進(jìn)行通信,優(yōu)點(diǎn)是RS-485通信應(yīng)用靈活,可以支持更多的節(jié)點(diǎn)掛載在總線上;可以改進(jìn)RS-485通信方式,自動(dòng)地址識(shí)別模式無(wú)法監(jiān)聽(tīng)總線是否繁忙。缺點(diǎn)是各個(gè)節(jié)點(diǎn)的工作量增大,將頻繁解析指令,系統(tǒng)整體效率降低。
結(jié)語(yǔ)
在使用RS-485方式通信時(shí),選取哪種方式進(jìn)行通信,需要根據(jù)不同場(chǎng)合而定。傳統(tǒng)的自動(dòng)地址識(shí)別模式,適用于嚴(yán)格的主從通信系統(tǒng),可靠性高,系統(tǒng)整體效率高;而普通模式靈活性較好,但是系統(tǒng)整體效率會(huì)降低。所以,要因地制宜,選擇當(dāng)前場(chǎng)合最適合的方式。
評(píng)論