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