陽世榮
(中國艦船研究與設(shè)計中心,武漢430064)
陽世榮(工程師),研究方向為電力系統(tǒng)自動化。
串行通信具有簡單可靠、使用方便、開發(fā)成本較低等特點,在智能儀表行業(yè)里得到了廣泛應(yīng)用[1];特別對于數(shù)據(jù)量不是很大、實時性要求較強的場合,串口通信仍然是最好的選擇,有著良好的應(yīng)用前景。隨著單片機在智能儀表 中 的 廣 泛 應(yīng) 用[2],其 串 口 (UART,Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)接口)編程成為單片機智能儀表系統(tǒng)開發(fā)的重要內(nèi)容。串口通信程序的傳統(tǒng)調(diào)試方式,往往需要利用專用的單片機硬件仿真器和調(diào)試計算機。在編寫好程序后,利用仿真器來設(shè)置斷點,觀察變量和程序的流程,由仿真器和上位機進行串口通信,逐步對程序進行調(diào)試及修正錯誤。
傳統(tǒng)調(diào)試方法對硬件仿真器依賴性較強,但是很多仿真器不能做到完全硬件仿真,因而可能造成仿真時正常,而實際運行時出現(xiàn)錯誤的情況,或者造成仿真不能通過,但是實際運行正常的情況;當單片機芯片型號發(fā)生較大變化時,需要配置新的仿真器,增加了資金投入。另外,傳統(tǒng)的調(diào)試方法要求調(diào)試計算機具備串行通信口,而現(xiàn)在很多新型計算機,尤其是筆記本電腦,并不提供串行通信接口,往往需要另外配置串口轉(zhuǎn)換模塊。因此,傳統(tǒng)的串口通信調(diào)試方式,對調(diào)試工具有較多的硬件方面要求,給串口編程的調(diào)試仿真以及現(xiàn)場維護帶來不便。
本文介紹了一種串口通信程序調(diào)試方法,能夠在單臺計算機上實現(xiàn)串口通信程序的純軟件仿真調(diào)試,既不需要硬件仿真器,又對計算機的串行通信接口無任何要求,給串口編程的調(diào)試仿真帶來極大方便。
本調(diào)試方法無需任何硬件仿真器以及用戶電路板,對調(diào)試計算機也無串行通信接口要求。在軟件方面,只需準備虛擬串口軟件VSPD、Keil以及串口通信客戶端軟件(如串口調(diào)試助手等)。
其中,Keil是眾多單片機應(yīng)用開發(fā)軟件中最優(yōu)秀的軟件之一,支持幾乎所有MCS51架構(gòu)的芯片,并且集編輯、編譯、仿真等多項功能于一體,同時支持匯編語言和C語言程序設(shè)計[3]。Keil的軟件界面十分友好,易學易用,因此廣泛應(yīng)用于單片機系統(tǒng)的程序調(diào)試和軟件仿真中。
虛擬串口驅(qū)動程序(Virtual Serial Ports Driver,VSPD)能夠創(chuàng)建數(shù)對“虛擬”的串行端口,每對串口虛擬互聯(lián)[4],在一般程序看來,這些“虛擬”的串行端口跟實體的串行端口完全一致,因此,在單臺計算機上運行VSPD即可達到串口擴展的目的。
本調(diào)試方法的基本流程如下:
① 運行VSPD實現(xiàn)計算機串口的擴展和互聯(lián);
② 在Keil中運行通信程序,對單片機的UART進行仿真,并將之與計算機的某一個虛擬串口綁定,即用計算機的串口來模擬單片機的UART;
③ 打開串口調(diào)試助手,選擇與②中互聯(lián)的虛擬串口,進行數(shù)據(jù)收發(fā)從而實現(xiàn)通信調(diào)試。
本文介紹的串口調(diào)試方法應(yīng)用了Keil的串口仿真功能,即在應(yīng)用Keil軟件進行通信程序調(diào)試時,可利用計算機的串口來模擬單片機的串口。進行仿真時,Keil需要使用的2個命令為:ASSⅠGN和MODE。
2.1.1ASSIGN命令
該命令的功能為將單片機的串口綁定到計算機的串口,其語法格式為:
其中,channel代表計算機的串口,可以是COM1、COM2、COM3或COM4等;而inreg和outreg代表單片機的串口。對于只有1個串口的普通單片機,即為SⅠN和SOUT;對于有2個或者多個串口的單片機,即為SnⅠN和SnOUT(其中,n=0,1,…,為單片機的串口號)。例如:
即為將計算機的串口1綁定到單片機的串口(針對只有1個串口的單片機)。
即為將計算機的串口2綁定到單片機的串口0(針對有多個串口的單片機,需要注意串口號的書寫位置)。需要注意的是,在命令行中,<inreg>參數(shù)的括號是不能省略的,而outreg則是沒有括號的。
2.1.2MODE命令
該命令的功能為設(shè)置被綁定計算機串口的通信參數(shù),其語法格式為:
其中,COMx(x=1,2,…)代表計算機的串口號;baudrate代表串口的波特率;parity代表校驗方式;databits代表數(shù)據(jù)位長度;stopbits代表停止位長度。例如:
MODE COM1 9600,n,8,1
即為設(shè)置串口1,波特率為9 600,無校驗位,8位數(shù)據(jù),1位停止位。
即為設(shè)置串口2,波特率為19 200,奇校驗,8位數(shù)據(jù),1位停止位。
在Keil的調(diào)試環(huán)境下運行以上2個命令,就能夠?qū)⒂嬎銠C的串口模擬成單片機的串口了。需要注意的是,這兩個命令必須一起使用。
輸入上述命令后,然后在Keil的調(diào)試環(huán)境下運行單片機通信程序,通信程序發(fā)送到單片機串口上的數(shù)據(jù)會通過被綁定的計算機串口發(fā)送出來,其他通信客戶端軟件(如串口調(diào)試助手)通過訪問計算機串口即可接收到數(shù)據(jù);另一方面,所有發(fā)送到被綁定的計算機串口上的數(shù)據(jù)都會轉(zhuǎn)發(fā)到Keil模擬的單片機串口上,由單片機通信程序接收。利用這個特點,就可以十分方便地仿真、調(diào)試單片機的串口通信程序。
首先,運行VSPD,其軟件界面如圖1所示。在圖1右邊Control Panel面板上,選擇2個串口號,然后點擊“Add pair”按鈕。此時,在圖1左邊的System Explorer顯示區(qū)的Virtual ports下即出現(xiàn)2個已經(jīng)互聯(lián)好的虛擬串口。例如,在圖1中設(shè)置的2個互聯(lián)虛擬串口為COM3和COM4。需要說明的是,圖1中Physical ports下的COM1為計算機實際的物理串行接口。
其次,在Keil中編寫單片機串口通信程序,并編譯通過,串口的設(shè)置參數(shù)示例:波特率9 600,無校驗位,8位數(shù)據(jù)位,1位停止位。接下來,需要設(shè)置Keil的Project項目的相關(guān)參數(shù)。為了正確地仿真串口通信情況,在Keil中必須設(shè)置實際使用的晶振頻率,這個參數(shù)十分重要,直接影響串口通信的波特率。點擊Keil工具欄的Project項,在下拉菜單中選擇Options for Target,打開的設(shè)置界面如圖2所示。在圖2上方的標題欄中選擇Target,在Xtal(MHZ)欄中填寫單片機實際使用的波特率。要注意,這個參數(shù)的單位是MHz。
第三步,輸入串口通信仿真調(diào)試命令。單擊Keil工具欄的Debug項,選擇Start Debug Session,進入仿真狀態(tài)。在Keil軟件左下方的調(diào)試窗口中選擇Command文檔框,輸入ASSⅠGN和MODE命令。例如,將圖1中的虛擬串口COM3綁定為單片機的串口,命令格式為:
圖2 Keil參數(shù)設(shè)置界面
為了避免每次進入調(diào)試仿真狀態(tài)都要手動輸入1次ASSⅠGN和 MODE命令,可以建立1個初始化文件,將ASSⅠGN和MODE命令保存在初始化文件中,由Keil進入調(diào)試狀態(tài)時自動調(diào)用。初始化文件的后綴名為.ini,可由普通的文本文件直接保存為此格式。例如,建立1個初始化文件debug.ini,填入 MODE和 ASSⅠGN命令行,然后在圖2的Keil參數(shù)設(shè)置界面中,選擇Debug參數(shù)設(shè)置界面,如圖3所示。在Ⅰnitialization中設(shè)置好debug.ini文件路徑,確定即可。
圖3 Debug參數(shù)設(shè)置
接下來可在通信程序中設(shè)置斷點,一般是在與串口相關(guān)聯(lián)的部分進行設(shè)置。單擊Keil工具欄的Debug項,選擇Go,開始運行通信程序。此時,打開串口調(diào)試助手,選擇與單片機串口相連的虛擬串口,例如COM4,并且配置好相應(yīng)的串口通信參數(shù),即可與單片機程序?qū)崿F(xiàn)通信,如圖4所示。
圖4 串口調(diào)試助手界面
利用串口調(diào)試助手發(fā)送命令幀,檢查單片機通信程序是否進入斷點,回復的數(shù)據(jù)幀是否正確。還可以有意發(fā)送帶有錯誤數(shù)據(jù)的數(shù)據(jù)包,以觀察單片機通信程序的通信異常處理部分是否正常。一旦發(fā)現(xiàn)程序中的錯誤,可以馬上停止仿真調(diào)試,立即修改程序代碼,然后重復上述步驟進行仿真。
需要注意的是,調(diào)試期間是利用Keil軟件模擬單片機的串口,因此仿真時串口通信的實際波特率僅僅取決于MODE命令。單片機通信程序中的TMOD、SCON等參數(shù)是不影響串口仿真狀態(tài)的(也就是說這些參數(shù)不影響仿真的波特率,即使它們是錯誤的),但是中斷的使能位(如ES、EA等)還是起作用的,如果ES或EA被禁止,那么就不會進入串口中斷。
由于VSPD可以在計算機上成對的擴展多個虛擬串口,因此本方法非常適合仿真多串口單片機。一般而言,使用本方法需要占用計算機的串口數(shù)量是單片機綁定串口的2倍。一個串口被Keil占用,用來模擬單片機的串口;另外一個串口被計算機占用,用來與單片機的串口進行通信。
由于調(diào)試期間不需要與硬件設(shè)備聯(lián)機,也不用下載代碼到硬件仿真電路板上,所以調(diào)試仿真的速度是比較高的。當然,這種方法是利用計算機的串口來綁定單片機的串口,數(shù)據(jù)是由Keil軟件仿真從單片機串口轉(zhuǎn)換到計算機串口的,因此在仿真時,處理速度會比實際單片機運行時稍微低一點,這與計算機本身的處理速度有關(guān),但是對仿真來說,沒有任何影響。
簡單、方便、容易使用、經(jīng)濟成本低是本調(diào)試方法的最大優(yōu)點。應(yīng)用本方法進行通信調(diào)試,不需要使用任何硬件電路,對計算機也沒有特殊的硬件接口要求,而且對程序編程語言也沒有任何特殊要求(C語言和匯編語言均可)。采用本方法可以在硬件電路板研制的同時,就將串口通信部分的程序編寫、調(diào)試完畢,大大縮短了開發(fā)周期。
對于MCS-51架構(gòu)的單片機,由于均可在Keil環(huán)境下進行開發(fā),可直接應(yīng)用本調(diào)試方法;對于其他架構(gòu)的單片機或者DSP以及ARM平臺,雖然無法直接將其串口與計算機串口綁定,但是可以采用變通的辦法,先用C語言在Keil中編寫通信程序,并采用本方法調(diào)試完成,然后將程序移植到相應(yīng)的單片機或DSP硬件平臺。因此,本方法可應(yīng)用各類單片機、DSP以及ARM的串口通信開發(fā)與調(diào)試當中,最大限度地降低研制成本,提高開發(fā)效率。
[1]徐勝,吳麗琴,施益峰.一種基于串行通信技術(shù)的遠程監(jiān)測系統(tǒng)[J].儀表技術(shù)與傳感器,2006(11):38-41.
[2]駱陽.具有抗干擾性能的單片機智能儀表的設(shè)計[J].電測與儀表,2002(3):24-26.
[3]馬忠梅.單片機的C語言應(yīng)用程序設(shè)計[M].北京航空航天大學出版社,2003.
[4]羅子明,王磊杰,劉或,等.基于AT89C51的數(shù)據(jù)采集系統(tǒng)設(shè)計新方法[J].電子元器件應(yīng)用,2007,9(8):37-40.