湯 婕,陳文印,吳同德,陳亞平,胡 超,吳科甲
(福建信息職業技術學院,福建 福州 350000)
串口通信是芯片或者設備的重要通信方式之一,具有結構簡單并且能夠實現遠距離通信等優點,應用廣泛。常見的芯片都集成有串口外設,通信雙方的通信參數需完全匹配,才能正常交互數據。其中波特率、停止位、校驗位以及數據位是串口的幾個參數指標[1-3]。
國際上規定了一個標準波特率系列,常用的波特率有1 200、1 800、2 400、4 800、9 600、19 200 和 115 200 等。在工程實踐中,有些工控PLC、智能接口等會規律地向外發送一些固定的字符或數據,然后等待外部設備向它們輸入期待中的握手信號,大部分485控制采集設備只會被動應答。
無論采用哪種方式,由于設備的波特率是可配置的,在未告知設備實際工作的波特率情況下,如何快速獲取并修改設備波特率等通信參數,成為項目實施的一個重要問題。
針對上述問題,本文創新地提出一種只需普通調試工具也能在短時間內進行參數匹配的方法,該方法代碼門檻低、容易實現,對嵌入式芯片無特殊要求,本文還給出了主機側和從機側的實現工作流程。
目前有不少研究人員對波特率等通信參數的自動識別進行研究,可以歸為以下幾種方法[4-10]:
(1)標準波特率窮舉法。該方法要求從機側的波特率必須在有限的幾個固定數值之間變化,如300~115 200之間的標準值,且從機側的工作振蕩頻率穩定。主機啟動通信程序后,逐個嘗試以不同的波特率接收從機發出的特定字符,直到能正確接收為止。該方法操作簡單,但連接時間長,局限于只能在固定數值間變化。
(2)碼元寬度實時檢測法。該方法要求從機按照約定發送某一數據,主機通過嵌入式芯片定時器測量RXD引腳上輸入數據的碼元寬度,而后計算出待測系統通信的波特率。該方法目前應用比較廣泛,但對主機側性能要求較高,需要能夠測試出碼元寬度。例如,某GSM模塊在設計時為了適應各種通信波特率,要求其通信的系統首先發送AT指令,它就是依靠AT指令的碼元寬度計算出對方波特率的。
(3)固定波特率法。該方法在主機側默認一個波特率,收到不同波特率發出的特定指令并解析出來,以十六進制進行比較,分析出從機側發送的波特率,隨后即可進行通信。該方法理論上沒有可靠的保證,在實際應用中匹配不成功的概率較高。
從機設備在上電后,以特定波特率保持一小段時間,此時從機若接收到主機以相同波特率發送的特定指令,從機設備就維持該波特率。主機設備此時可以發送修改或者讀取串口通信參數的配置指令。修改后重啟從機設備,從機設備按照設置后的參數運行,從而達到串口通信匹配的過程,如圖1所示。

圖1 波特率匹配流程
具體流程可分為如下三個階段:
第一階段為握手階段,主機側設置為默認參數運行,例如“9600,8,N,1”,并按照一定周期發送保持波特率指令“#keepbaud”,此時命令發送周期應小于1 s,確保從機側能收到指令。重啟從機設備,從機設備在重啟后2 s內按照默認參數運行,能接收到主機側發送的指令;收到指令后,從機應及時返回應答指令“#ok”。主機收到應答指令,就可以判斷與從機握手成功。
第二階段為調試階段,從機收到主機發送的保持波特率指令后繼續保持默認參數運行,并且處理主機后續發送的其他指令。在這個階段,主機可以發送指令讀取或者修改串口運行配置參數,例如“#115200,8,N,1”,從機收到指令后返回應答指令。
第三階段為重啟運行階段。主機側此時不能發送保持波特率指令,若主機側發送了其他指令,例如ModBus指令,從機側應忽略這些指令。重啟2 s后,設備將以修改之后的波特率運行,處于正常的工作狀態。如果設備被設計為ModBus設備,可以使用該協議對設備進行調試。
主機側一般為個人電腦或者專用的配置設備,不論設備能否運行一些高級的語言,只需要有定時器和串口外設,就能實現主機側相關功能。參考工作流程如圖2所示。

圖2 工作流程
首先,主機側應不斷發送保持波特率指令“#keepbaud”,時間間隔可以取0.5 s左右,時間間隔要保證從機側在等待的過程中至少收到一條指令。發送的總時間長度可以取5 s,給操作人員足夠的操作時間。5 s后,發送握手指令“#echo”,查詢從機側是否處于配置模式,若未處于配置工作模式,則回到第一步。最后,發送串口參數配置指令,例如“#115200,8,N,1”,收到從機的應答則整個配置流程結束。
從機側一般為單片機等嵌入式系統。從最簡單的51系列到復雜的ARM系列,嵌入式系統功能差別巨大,性能參差不齊。但是不論功能如何,一般都有定時器外設和串口外設,只要有這兩種外設,就可以實現從機側工作流程。具體工作流程如圖3所示。

圖3 從機側工作流程
嵌入式系統上電后,首先打開串口功能,跟主機側一樣,以默認參數運行,保持接收狀態延時2 s。若此時主機側發送保持波特率指令“#keepbaud”,2 s后從機收到保持波特率指令,則進入到配置模式,反之則進入正常工作模式。進入配置工作模式時,串口仍然保持默認參數運行,保證收到后續的指令。進入正常工作模式,串口則根據配置參數運行,匹配現場實際工作環境。進入配置工作模式后,串口保持接收狀態。接收到數據后,首先判斷是否為“#echo”回顯指令,若為回顯指令,返回應答包?;仫@指令主要用于測試判斷從機側是否處于配置工作模式。若不是回顯指令,從機應繼續判斷指令是否為配置指令;若為配置指令,將收到的配置參數寫入FLASH或者E2PROM中并應答。掉電重啟后進入正常工作模式時,從存儲外設中讀取出相關配置參數。
采用本方法測試驗證時,使用樂鑫的ESP32開發板,并通過開源電子平臺Arduino軟件搭建ESP32開發環境。根據上述流程,采用C++語言對其進行測試驗證,Arduino部分參考代碼如下:

如圖4所示,采用樂鑫的ESP32開發板、溫濕度傳感器以及自主設計的拓展開發板來搭建硬件測試環境。將ESP32開發板插到拓展板上,然后通過杜邦線將拓展板和溫濕度傳感器連接,最后用USB數據線將ESP32連接到電腦。這樣就可以實現對設備的串口波特率的修改和匹配。

圖4 實物接線示意圖
采用串口調試助手進行聯調,從主機端向從機發送指令,從機設備接收到指令后進行應答。接收到應答信號后主機端向從機發送修改指令,從機設備接收到指令后保存并應答。實現效果如圖5所示。

圖5 波特率匹配示意圖
本文利用485通信協議的特點,提出了一種容易實現、對設備芯片無特殊要求、可以廣泛使用的匹配方法,可利用普通的串口調試助手在較短的時間內完成參數匹配過程。文中對主從機側軟件的流程進行了詳細說明,并給出了ESP32的參考代碼。該方法經過多種軟硬件聯合調試和驗證,方法簡單可靠,取得了很好的效果。該方法不僅能夠大大減少調試過程中的工作量,還能在短時間內快速識別設備的波特率。