田社平, 方向忠, 張 峰
(上海交通大學 電子信息與電氣工程學院,上海 200240)
串口是目前工業(yè)通信中較為普遍的一種通信方式,同時在單片機教學中占據(jù)重要地位[1-4]。傳統(tǒng)的串口通信實驗往往需要一根串口線連接兩個終端(兩臺PC機,或者一臺PC一個單片機系統(tǒng),或者兩個單片機系統(tǒng)),其對硬件仿真器依賴性較強。由于很多仿真器不能做到完全硬件仿真,因而可能造成仿真時正常,而實際運行時出現(xiàn)錯誤的情況,或者造成仿真不能通過,但是實際運行正常的情況。當單片機芯片型號發(fā)生較大變化時,需要配置新的仿真器,增加了資金投入。因此,開發(fā)一種虛擬的串口通信教學實驗系統(tǒng),具有良好的教學價值。例如,可以利用Keil和虛擬串口驅(qū)動(VSPD)即可達到這一目的[5-7],但這樣的實驗系統(tǒng)具有操作較為復雜、顯示不夠直觀、不能加入硬件設(shè)計等缺點。
本文討論一種基于VSPD和Proteus[8-9]串口調(diào)試與實驗方法,可以在一臺PC機上完成原本需要兩個終端才能實現(xiàn)的串口通信。首先從虛擬串口的結(jié)構(gòu)和原理,闡述串口通信的基本原理。接著以一個實例給出了基于VSPD的串口通信的具體實現(xiàn)過程。該例實現(xiàn)了PC機與單片機之間的串口通信,PC機端串口通信程序采用VC++6.0編寫,單片機選用Intel公司的AT89C51,在Proteus仿真軟件中用匯編語言編寫。
虛擬串口驅(qū)動程序是一個標準的Win32驅(qū)動程序模型(WDM)的設(shè)備驅(qū)動程序,它面向串口用戶程序,為用戶提供標準而完整的串口設(shè)備接口。該驅(qū)動程序的系統(tǒng)I/O調(diào)用接口以及讀寫控制完全仿造標準的串口驅(qū)動程序制作,所以從用戶角度看,虛擬串口的使用和普通串口沒有任何區(qū)別。
虛擬串口的應(yīng)用類型有很多,基于串口教學實驗的需要,這里只介紹其中一種——互聯(lián)型虛擬串口。互聯(lián)型虛擬串口是將兩個虛擬串口的數(shù)據(jù)通道連接起來。其效果相當于用串口回環(huán)線將兩個物理串口連接起來。除了將串口數(shù)據(jù)線TX和RX交叉連接以外,互聯(lián)型虛擬串口程序還將RTS、CTS、DTR、STR等控制線也進行互連,如圖1所示。
圖1 互聯(lián)型虛擬串口模擬的串口回環(huán)線
這些連接都是軟件意義上的,并沒有實際物理線相聯(lián)。這根使用軟件來模擬的串口回環(huán)線,實際上是使用線程通信完成的,其原理圖如圖2所示。由該圖可知,兩個虛擬串口連接以后,任何串口發(fā)送的數(shù)據(jù)將會被另外一個虛擬串口所接收。
圖2 互聯(lián)型虛擬串口原理
虛擬串口驅(qū)動程序有很多,常用的有VSPD、VSPM和SUDT SerialNull 等。而VSPD以其操作簡單,容易上手等特點倍受青睞。VSPD全稱為Virtual Serial Port Driver XP,是Eltima軟件公司的一款產(chǎn)品。它能成對地添加虛擬串口,最多可虛擬256個串口。VSPD虛擬串口對的操作界面如圖3所示。
圖3 VSPD虛擬串口對
VSPD可以和Proteus結(jié)合,添加的一對虛擬串口被設(shè)定為通過非MODEM(三線制)串口連接在一起,就像兩個真實的物理串口一樣,從而實現(xiàn)在一臺PC機上模擬兩個軟件的串口通信。
建立單片機與PC機之間的串口通信,單片機電路如圖4所示。要求單片機的4個開關(guān)控制4盞LED燈,當開關(guān)合上時,相應(yīng)的燈亮,同時將信息發(fā)送給PC機,如“P1.x is on. Lx lights.”,其中x取0~3,分別與SW1~4對應(yīng);PC機接收到信息后顯示,同時向單片機發(fā)送字符(0-9,A-F),并通過單片機控制數(shù)碼管顯示相應(yīng)的數(shù)字。PC機串口編程采用VC++6.0,單片機采用89C51匯編語言編程實現(xiàn)。串口通信格式為:1 200 bit/s波特率,8位數(shù)據(jù),無校驗,1個停止位。
圖4中,SCMR為虛擬接收端口,用來顯示單片機接收到的數(shù)據(jù);SCMT為虛擬發(fā)送端口,用來顯示單片機發(fā)送的內(nèi)容。P1為串口物理接口模型COMPIM,用來與外部進行RS-232串口通信。在仿真實驗時,必須在相應(yīng)的“Edit Component”對話框中設(shè)置與實驗一致的串口通信參數(shù)。其中COMPIM的設(shè)置界面如圖5所示。
圖4 串口實驗下位機電路
圖5 串口通信參數(shù)設(shè)置界面
為了使例程具有一般性,單片機采用通用的89C51,在Proteus上運行實現(xiàn)[10-12]。89C51的時鐘頻率取11.059 2 MHz,單片機選用串口方式1,定時器方式2,SMOD=1。由波特率公式:
波特率=2SMOD/32×T1溢出率,T1溢出率=時鐘頻率/[12×(256-TH1初值)]
可以求得T1的溢出率為1200/(2/32)=19200,從而算得定時初值為
256-11.0592×106/(19200×12)=208=0D0H
單片機的主程序如下:
MOV SP, #60H
MOV SCON, #50H ;串口方式1,允許接收
MOV TMOD, #20H ;定時器1為方式2
ORL PCON, #80H ; SMOD=1
MOV TH1, #0D0H ;波特率為1200
MOV TL1, #0D0H
SETB TR1
MOV DPTR, #CHSE ;發(fā)送’Hello, world!’
LP1: CLR A
MOVC A, @A+DPTR
CJNE A, #’’, SE1 ;判是否到發(fā)送結(jié)束位
LJMP LP2
SE1: LCALL SEND ;發(fā)送子程序
LCALL DELAY ;延時子程序
INC DPTR
LJMP LP1
LP2: MOV DPTR,#TABLE ;初始化顯示‘5’
MOV A, #05H
MOVC A, @A+DPTR
MOV P0, A
CLR A
CLR DPTR
LP: JNB P1.0, L1 ;檢測按鍵,如果P1.0按下轉(zhuǎn)L1
JNB P1.1, L2
JNB P1.2, L3
JNB P1.3, L4
JNB RI, LP ;等待接收1個字符
CLR RI
MOV A, SBUF ;接收到的字符送A
LCALL DELAY
MOV RDATA, A
LCALL SEND
LCALL DELAY
MOV DPTR, #TABLE
LCALL CHANGE ;ASCII碼轉(zhuǎn)16進制數(shù)子程序
MOV A, RDATA
LCALL DISP ;顯示子程序
LJMP LP
程序中,SEND為發(fā)送子程序,DELAY為延時子程序,CHANGE為數(shù)制轉(zhuǎn)換子程序,完成ASCII碼到十六進制的轉(zhuǎn)換,Lx(x為1,2,3,4)為開關(guān)操作程序,即實現(xiàn)按下開關(guān),相應(yīng)的指示性語句發(fā)送到PC機的功能。CHSE地址存放的是初始字符串“Hello, world!”,TABLE地址存放的是7段碼值。由于篇幅所限,具體代碼從略。
Win32中基于VC++6.0的常用串口通信程序一般可以用兩種方法實現(xiàn)[13-14]:①利用MSComm ActiveX串行通信控件;②使用Windows API通信函數(shù)。本實驗中采用MSComm ActiveX控件進行編程。MSComm提供了兩種處理通信問題的方法:①事件驅(qū)動法,當串口上發(fā)生某一事件時,使用MSComm控件的OnComm事件可以捕獲并處理這些事件;②查詢法,每當應(yīng)用程序執(zhí)行完某一串行口操作后,將不斷檢查MSCommEvent屬性以檢查執(zhí)行結(jié)果或者檢查某一事件是否發(fā)生。本實驗中采用第一種方法,在串口接收緩沖區(qū)中有字符時接收。
實驗中MSComm控件涉及的幾個重要屬性如表1所示。
表1 實驗中MSComm的幾個屬性
根據(jù)表1的控件屬性設(shè)置好正確的串口通信參數(shù)配置、數(shù)據(jù)獲取方式和通信響應(yīng)類型等,通過Output發(fā)送數(shù)據(jù),由Input在OnComm函數(shù)中接收數(shù)據(jù)。圖6為VC++6.0實現(xiàn)的串口通信實驗程序流程框圖。
圖6 串口實驗PC機程序流程
首先打開VSPD增加一對虛擬串口對,如COM1和COM2;接著運行C++程序,設(shè)置好串口號為COM2,波特率為1 200,8位數(shù)據(jù)位,1位停止位和無奇偶校驗之后,打開串口;然后運行Proteus軟件,對串口物理接口,虛擬接收/發(fā)送端口設(shè)置對應(yīng)的通信參數(shù),串口號選為COM1,點擊Proteus左下方的運行鍵。最后的結(jié)果如圖7所示。
程序通信后,首先由單片機向PC機發(fā)送字符串"Hello world!";當按下P1.x時,單片機就向PC機發(fā)送"P1.x is on. Lx lights."(x為0到3中的一個整數(shù)),同時相應(yīng)的LED就會點亮。由單片機向PC機發(fā)送過程中,PC機和虛擬發(fā)送端口同時顯示發(fā)送的內(nèi)容。當PC機向單片機發(fā)送字符A時,虛擬接收端口和數(shù)碼管就會顯示"A"。由此,實驗任務(wù)得到實現(xiàn)。
(a) PC端串口通信界面
虛擬端口發(fā)送顯示
虛擬端口接收顯示數(shù)碼管顯示
(b) 單片機端顯示界面
圖7 串口通信實驗仿真結(jié)果
本實驗利用虛擬串口驅(qū)動程序VSPD和虛擬仿真軟件Proteus實現(xiàn)了串口通信功能,具有實驗現(xiàn)象直觀、軟件調(diào)試方便的特點。在調(diào)試階段不受時間地點和器材的限制,從而減少硬件的使用,給開發(fā)和調(diào)試帶來了很大的靈活性,能取得事半功倍之效,提高學生的研究能力和學習興趣。
盡管本實驗中的單片機采用目前單片機教學中主流的MCS-51系列單片機,但本文方法也適用于各類單片機、微控制器的串口通信開發(fā)與調(diào)試,程序的編寫也可采用C語言以簡化開發(fā)過程[15]。同樣,PC機端串口程序也可采用不同的語言編寫,例如,當用VB或是其他語言實現(xiàn)串口通信程序時,仍可移植本實驗設(shè)計思路。因此,本實驗的實現(xiàn)方案可以根據(jù)教學實際進行靈活配置,將教學重點放在對串口通信的理解上,以取得良好的教學效果。
本文給出了虛擬串口通信實驗的框架結(jié)構(gòu)和基本實現(xiàn)方法,在實際教學中可以在此基礎(chǔ)上增加諸如修改通信參數(shù)、進行大數(shù)據(jù)量傳輸?shù)葘嶒炓?,以滿足不同的教學要求。