湯 婕,陳文印,吳同德,陳亞平,胡 超,吳科甲
(福建信息職業(yè)技術(shù)學(xué)院,福建 福州 350000)
串口通信是芯片或者設(shè)備的重要通信方式之一,具有結(jié)構(gòu)簡(jiǎn)單并且能夠?qū)崿F(xiàn)遠(yuǎn)距離通信等優(yōu)點(diǎn),應(yīng)用廣泛。常見(jiàn)的芯片都集成有串口外設(shè),通信雙方的通信參數(shù)需完全匹配,才能正常交互數(shù)據(jù)。其中波特率、停止位、校驗(yàn)位以及數(shù)據(jù)位是串口的幾個(gè)參數(shù)指標(biāo)[1-3]。
國(guó)際上規(guī)定了一個(gè)標(biāo)準(zhǔn)波特率系列,常用的波特率有1 200、1 800、2 400、4 800、9 600、19 200 和 115 200 等。在工程實(shí)踐中,有些工控PLC、智能接口等會(huì)規(guī)律地向外發(fā)送一些固定的字符或數(shù)據(jù),然后等待外部設(shè)備向它們輸入期待中的握手信號(hào),大部分485控制采集設(shè)備只會(huì)被動(dòng)應(yīng)答。
無(wú)論采用哪種方式,由于設(shè)備的波特率是可配置的,在未告知設(shè)備實(shí)際工作的波特率情況下,如何快速獲取并修改設(shè)備波特率等通信參數(shù),成為項(xiàng)目實(shí)施的一個(gè)重要問(wèn)題。
針對(duì)上述問(wèn)題,本文創(chuàng)新地提出一種只需普通調(diào)試工具也能在短時(shí)間內(nèi)進(jìn)行參數(shù)匹配的方法,該方法代碼門檻低、容易實(shí)現(xiàn),對(duì)嵌入式芯片無(wú)特殊要求,本文還給出了主機(jī)側(cè)和從機(jī)側(cè)的實(shí)現(xiàn)工作流程。
目前有不少研究人員對(duì)波特率等通信參數(shù)的自動(dòng)識(shí)別進(jìn)行研究,可以歸為以下幾種方法[4-10]:
(1)標(biāo)準(zhǔn)波特率窮舉法。該方法要求從機(jī)側(cè)的波特率必須在有限的幾個(gè)固定數(shù)值之間變化,如300~115 200之間的標(biāo)準(zhǔn)值,且從機(jī)側(cè)的工作振蕩頻率穩(wěn)定。主機(jī)啟動(dòng)通信程序后,逐個(gè)嘗試以不同的波特率接收從機(jī)發(fā)出的特定字符,直到能正確接收為止。該方法操作簡(jiǎn)單,但連接時(shí)間長(zhǎng),局限于只能在固定數(shù)值間變化。
(2)碼元寬度實(shí)時(shí)檢測(cè)法。該方法要求從機(jī)按照約定發(fā)送某一數(shù)據(jù),主機(jī)通過(guò)嵌入式芯片定時(shí)器測(cè)量RXD引腳上輸入數(shù)據(jù)的碼元寬度,而后計(jì)算出待測(cè)系統(tǒng)通信的波特率。該方法目前應(yīng)用比較廣泛,但對(duì)主機(jī)側(cè)性能要求較高,需要能夠測(cè)試出碼元寬度。例如,某GSM模塊在設(shè)計(jì)時(shí)為了適應(yīng)各種通信波特率,要求其通信的系統(tǒng)首先發(fā)送AT指令,它就是依靠AT指令的碼元寬度計(jì)算出對(duì)方波特率的。
(3)固定波特率法。該方法在主機(jī)側(cè)默認(rèn)一個(gè)波特率,收到不同波特率發(fā)出的特定指令并解析出來(lái),以十六進(jìn)制進(jìn)行比較,分析出從機(jī)側(cè)發(fā)送的波特率,隨后即可進(jìn)行通信。該方法理論上沒(méi)有可靠的保證,在實(shí)際應(yīng)用中匹配不成功的概率較高。
從機(jī)設(shè)備在上電后,以特定波特率保持一小段時(shí)間,此時(shí)從機(jī)若接收到主機(jī)以相同波特率發(fā)送的特定指令,從機(jī)設(shè)備就維持該波特率。主機(jī)設(shè)備此時(shí)可以發(fā)送修改或者讀取串口通信參數(shù)的配置指令。修改后重啟從機(jī)設(shè)備,從機(jī)設(shè)備按照設(shè)置后的參數(shù)運(yùn)行,從而達(dá)到串口通信匹配的過(guò)程,如圖1所示。
圖1 波特率匹配流程
具體流程可分為如下三個(gè)階段:
第一階段為握手階段,主機(jī)側(cè)設(shè)置為默認(rèn)參數(shù)運(yùn)行,例如“9600,8,N,1”,并按照一定周期發(fā)送保持波特率指令“#keepbaud”,此時(shí)命令發(fā)送周期應(yīng)小于1 s,確保從機(jī)側(cè)能收到指令。重啟從機(jī)設(shè)備,從機(jī)設(shè)備在重啟后2 s內(nèi)按照默認(rèn)參數(shù)運(yùn)行,能接收到主機(jī)側(cè)發(fā)送的指令;收到指令后,從機(jī)應(yīng)及時(shí)返回應(yīng)答指令“#ok”。主機(jī)收到應(yīng)答指令,就可以判斷與從機(jī)握手成功。
第二階段為調(diào)試階段,從機(jī)收到主機(jī)發(fā)送的保持波特率指令后繼續(xù)保持默認(rèn)參數(shù)運(yùn)行,并且處理主機(jī)后續(xù)發(fā)送的其他指令。在這個(gè)階段,主機(jī)可以發(fā)送指令讀取或者修改串口運(yùn)行配置參數(shù),例如“#115200,8,N,1”,從機(jī)收到指令后返回應(yīng)答指令。
第三階段為重啟運(yùn)行階段。主機(jī)側(cè)此時(shí)不能發(fā)送保持波特率指令,若主機(jī)側(cè)發(fā)送了其他指令,例如ModBus指令,從機(jī)側(cè)應(yīng)忽略這些指令。重啟2 s后,設(shè)備將以修改之后的波特率運(yùn)行,處于正常的工作狀態(tài)。如果設(shè)備被設(shè)計(jì)為ModBus設(shè)備,可以使用該協(xié)議對(duì)設(shè)備進(jìn)行調(diào)試。
主機(jī)側(cè)一般為個(gè)人電腦或者專用的配置設(shè)備,不論設(shè)備能否運(yùn)行一些高級(jí)的語(yǔ)言,只需要有定時(shí)器和串口外設(shè),就能實(shí)現(xiàn)主機(jī)側(cè)相關(guān)功能。參考工作流程如圖2所示。
圖2 工作流程
首先,主機(jī)側(cè)應(yīng)不斷發(fā)送保持波特率指令“#keepbaud”,時(shí)間間隔可以取0.5 s左右,時(shí)間間隔要保證從機(jī)側(cè)在等待的過(guò)程中至少收到一條指令。發(fā)送的總時(shí)間長(zhǎng)度可以取5 s,給操作人員足夠的操作時(shí)間。5 s后,發(fā)送握手指令“#echo”,查詢從機(jī)側(cè)是否處于配置模式,若未處于配置工作模式,則回到第一步。最后,發(fā)送串口參數(shù)配置指令,例如“#115200,8,N,1”,收到從機(jī)的應(yīng)答則整個(gè)配置流程結(jié)束。
從機(jī)側(cè)一般為單片機(jī)等嵌入式系統(tǒng)。從最簡(jiǎn)單的51系列到復(fù)雜的ARM系列,嵌入式系統(tǒng)功能差別巨大,性能參差不齊。但是不論功能如何,一般都有定時(shí)器外設(shè)和串口外設(shè),只要有這兩種外設(shè),就可以實(shí)現(xiàn)從機(jī)側(cè)工作流程。具體工作流程如圖3所示。
圖3 從機(jī)側(cè)工作流程
嵌入式系統(tǒng)上電后,首先打開(kāi)串口功能,跟主機(jī)側(cè)一樣,以默認(rèn)參數(shù)運(yùn)行,保持接收狀態(tài)延時(shí)2 s。若此時(shí)主機(jī)側(cè)發(fā)送保持波特率指令“#keepbaud”,2 s后從機(jī)收到保持波特率指令,則進(jìn)入到配置模式,反之則進(jìn)入正常工作模式。進(jìn)入配置工作模式時(shí),串口仍然保持默認(rèn)參數(shù)運(yùn)行,保證收到后續(xù)的指令。進(jìn)入正常工作模式,串口則根據(jù)配置參數(shù)運(yùn)行,匹配現(xiàn)場(chǎng)實(shí)際工作環(huán)境。進(jìn)入配置工作模式后,串口保持接收狀態(tài)。接收到數(shù)據(jù)后,首先判斷是否為“#echo”回顯指令,若為回顯指令,返回應(yīng)答包?;仫@指令主要用于測(cè)試判斷從機(jī)側(cè)是否處于配置工作模式。若不是回顯指令,從機(jī)應(yīng)繼續(xù)判斷指令是否為配置指令;若為配置指令,將收到的配置參數(shù)寫入FLASH或者E2PROM中并應(yīng)答。掉電重啟后進(jìn)入正常工作模式時(shí),從存儲(chǔ)外設(shè)中讀取出相關(guān)配置參數(shù)。
采用本方法測(cè)試驗(yàn)證時(shí),使用樂(lè)鑫的ESP32開(kāi)發(fā)板,并通過(guò)開(kāi)源電子平臺(tái)Arduino軟件搭建ESP32開(kāi)發(fā)環(huán)境。根據(jù)上述流程,采用C++語(yǔ)言對(duì)其進(jìn)行測(cè)試驗(yàn)證,Arduino部分參考代碼如下:
如圖4所示,采用樂(lè)鑫的ESP32開(kāi)發(fā)板、溫濕度傳感器以及自主設(shè)計(jì)的拓展開(kāi)發(fā)板來(lái)搭建硬件測(cè)試環(huán)境。將ESP32開(kāi)發(fā)板插到拓展板上,然后通過(guò)杜邦線將拓展板和溫濕度傳感器連接,最后用USB數(shù)據(jù)線將ESP32連接到電腦。這樣就可以實(shí)現(xiàn)對(duì)設(shè)備的串口波特率的修改和匹配。
圖4 實(shí)物接線示意圖
采用串口調(diào)試助手進(jìn)行聯(lián)調(diào),從主機(jī)端向從機(jī)發(fā)送指令,從機(jī)設(shè)備接收到指令后進(jìn)行應(yīng)答。接收到應(yīng)答信號(hào)后主機(jī)端向從機(jī)發(fā)送修改指令,從機(jī)設(shè)備接收到指令后保存并應(yīng)答。實(shí)現(xiàn)效果如圖5所示。
圖5 波特率匹配示意圖
本文利用485通信協(xié)議的特點(diǎn),提出了一種容易實(shí)現(xiàn)、對(duì)設(shè)備芯片無(wú)特殊要求、可以廣泛使用的匹配方法,可利用普通的串口調(diào)試助手在較短的時(shí)間內(nèi)完成參數(shù)匹配過(guò)程。文中對(duì)主從機(jī)側(cè)軟件的流程進(jìn)行了詳細(xì)說(shuō)明,并給出了ESP32的參考代碼。該方法經(jīng)過(guò)多種軟硬件聯(lián)合調(diào)試和驗(yàn)證,方法簡(jiǎn)單可靠,取得了很好的效果。該方法不僅能夠大大減少調(diào)試過(guò)程中的工作量,還能在短時(shí)間內(nèi)快速識(shí)別設(shè)備的波特率。