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