RS-232簡介:
在串行通訊時,要求通訊雙方都采用一個標(biāo)準(zhǔn)接口,使不同的設(shè)備可以方便地連接起來進行通訊.RS-232-C接口(又稱EIA RS-232-C)是目前最常用的一種串行通訊接口. ("RS-232-C"中的"-C"只不過表示RS-232的版本,所以與"RS-232"簡稱是一樣的)它是在1970年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng),調(diào)制解調(diào)器廠家及計算機終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn).它的全名是"數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)"該標(biāo)準(zhǔn)規(guī)定采用一個25個腳的DB-25連接器,對連接器的每個引腳的信號內(nèi)容加以規(guī)定,還對各種信號的電平加以規(guī)定.后來IBM的PC機將RS232簡化成了DB-9連接器,從而成為事實標(biāo)準(zhǔn).而工業(yè)控制的RS-232口一般只使用RXD,TXD,GND三條線.
下面,讓我們使用S51增強型單片機實驗板來開發(fā)一個簡單的串口通信實驗程序,這是一個串口通信綜合實驗,需要全套餐客戶的相關(guān)配件配合才能完成。通過該實驗程序,我們可以檢測實驗板串口的狀態(tài),接收計算機發(fā)送來的數(shù)據(jù),然后再發(fā)送回計算機,如果程序中發(fā)送和接收窗中顯示的字符相同,則說明實驗板的串口是良好的,能夠正常收發(fā)數(shù)據(jù),另外單片機接收計算機的控制指令,根據(jù)控制指令來控制實驗板上的繼電器動作。
圖 1 注:當(dāng)前按鍵:“K”,按鍵的ASC碼:“75”,按鍵的16進制碼:“4BH”
圖 2 注:按壓PC鍵盤的按鍵“K”單片機將串口接收到按鍵實時顯示在液晶模塊上(鎖定了大小鍵)。
從上面兩幅圖中可以看到,我們實現(xiàn)主要目標(biāo)如下:
1、在計算機上,VB6.0編寫的通信測試程序檢測的鍵盤操作,將我們的按壓PS2鍵盤(PC鍵盤)按鍵顯示在數(shù)據(jù)發(fā)送窗中,顯示按鍵當(dāng)前按鍵、按鍵的ASC碼、按鍵的16進制碼。同時將鍵值通過電腦的RS-232串口發(fā)送到S51單片機實驗板上,實驗板上的AT89S51單片機接收到數(shù)據(jù)后,以二進制方式顯示在實驗板的8位高亮度LED上,然后把接收到的數(shù)據(jù)重新發(fā)送回電腦的RS-232串口,電腦接收到后顯示在程序的接收數(shù)據(jù)窗中。
2、單片機檢測識別計算機發(fā)送過來的鍵盤鍵值,將按鍵值以二進制形式顯示在P1口的8位高亮度LED上,同時,將當(dāng)前按鍵、按鍵的HEX碼、ASC碼實時顯示在1602液晶模塊上面。
3、單片機接收計算機對單片機的控制指令,當(dāng)計算機發(fā)送“繼電器ON指令”時,則單片機驅(qū)動實驗板上的繼電器吸合;相反,如果計算機發(fā)送“繼電器OFF指令”時,單片機驅(qū)動繼電器釋放,我們可以學(xué)習(xí)掌握計算機智能控制的原理,只要掌握了這種方法,我們要在電腦上輕輕點擊鼠標(biāo)就可以控制家里的電氣開關(guān)了就不難了(操作方法,點擊軟件的“繼電器”按鈕,實驗板的繼電器吸合,再次點擊按鈕,繼電器釋放)。
4、單片機接收到數(shù)據(jù)后,發(fā)出一時短聲提示。同時將數(shù)據(jù)重新發(fā)送回電腦串口,供電腦程序接收顯示,電腦軟件接收到單片機發(fā)送過來的數(shù)據(jù)后,顯示在軟件的接收數(shù)據(jù)窗中。
【RS-232接口與單片機串行通信程序設(shè)計】
該系統(tǒng)程序由單片機通信程序和電腦通信程序構(gòu)成。在微機測控系統(tǒng)中,一般稱計算機為上位機、而前端采集控制的單片機系統(tǒng)稱為下位機。上位機主要負責(zé)所有測控數(shù)據(jù)的綜合管理與下位機的調(diào)度控制,而下位機由單片機構(gòu)成前端的測控系統(tǒng),進行原始數(shù)據(jù)的采集及設(shè)備的控制,下位機受上位機的管理控制。
一、單片機程序開發(fā)
51單片機有一個全雙工的串行通信口,非常適合與電腦進行通信,51單片機的串口開發(fā)在各種教科書上都有詳細的介紹,我們這里不在重復(fù),大家可以參考一下書籍。單片機程序功能主要如下:初始化串口、打開串口中斷、接收電腦發(fā)送的數(shù)據(jù)、在1602液晶模塊上顯示數(shù)據(jù)、將數(shù)據(jù)發(fā)送回電腦RS-232串口、接收繼電器控制命令、控制繼電器動作等。
單片機通信參考程序如下:
ORG 0000H
AJMP START ;轉(zhuǎn)到初始化程序
ORG 0023H
AJMP PGUART ;轉(zhuǎn)到串行中斷服務(wù)子程序
START: MOV SP,#60H ;堆棧指針初始化
MOV P0,#0FFH ;P0端口初始化
MOV P1,#0FFH ;P1端口初始化
MOV P2,#0FFH ;P2端口初始化
MOV P3,#0FFH ;P3端口初始化
MOV TMOD,#20H ;定時器T1工作于模式2,自動重裝載
MOV TH1,#0FDH ;TH1初值為"0FDH",9600bps
MOV TL1,#0FDH ;TL1初值為"0FDH",9600bps
MOV SCON,#50H ;串行口工作于方式1,允許接收
SETB TR1 ;啟動定時器T1
SETB ES ;允許串行口中斷
SETB EA ;開總中斷
CLR UABIT
;----------------------RS-232接口與單片機串行通信程序設(shè)計-------------------------------
MAIN: ...... ;主程序處理其他任務(wù),等待串口中斷
AJMP MAIN
PGUART: ...... ;串口中斷服務(wù)子程序,接收處理數(shù)據(jù)
RETI
END
二、RS-232串行通信測試軟件開發(fā)
計算機RS-232串行通信測試軟件采用VB6.0開發(fā),VisualBasic 6.0(簡稱VB6.0)以其簡單易學(xué),
VB6.0為可視化編程開發(fā)軟件,開發(fā)程序簡單易學(xué),VB程序開發(fā)主要分為兩步:第一步、使用VB控件設(shè)計出軟件界面,第二步、給各種控件編寫相應(yīng)的執(zhí)行程序代碼,代碼編寫完成后可以運行查看結(jié)果了。
VB6提供了多種控件,其中MSCOMM.OCX是用于串行通信的控件,我們可將該控件添加到工具箱(Toolbox)內(nèi),這樣就可以利用該控件進行串行通信程序的設(shè)計了。
下面介紹Mscomm控件的主要屬性和方法:
1) CommPort:設(shè)置或返回串行端口號,VB6的取值范圍為1~16,表示打開或返回通信端口號COM1~COM16
2) Setting:設(shè)置或返回串行端口的波特率、奇偶校驗位、數(shù)據(jù)位數(shù)、停止位。如:Mscomm1.Setting=“9600,N,8,1”
3) PortOpen:打開或關(guān)閉串行端口,格式為:Mscomm1.PortOpen=『True/False』
4) InBufferSize:設(shè)置或返回接收緩沖區(qū)的大小,缺省為1024字節(jié)
5) InBufferCount:返回接收緩沖區(qū)內(nèi)的等待讀取的字節(jié)個數(shù),可通過設(shè)置該屬性為0來清除接收緩沖區(qū)
6) RThreshold:該屬性為一閥值,當(dāng)接收緩沖區(qū)內(nèi)字節(jié)個數(shù)達到或超過該值后就產(chǎn)生OnComm事件
7) InputLen:設(shè)置或返回接收緩沖區(qū)內(nèi)用Input讀入的個數(shù)。若取0,則Input將讀取整個緩沖區(qū)的所有內(nèi)容
8) Input:該屬性表示從接收緩沖區(qū)InputLen個字符
9) OutBufferSize:設(shè)置或返回發(fā)送緩沖區(qū)大小,缺省為512字節(jié)
10) OutBufferCounter:返回發(fā)送緩沖區(qū)內(nèi)等待發(fā)送的字符數(shù),可用來清空緩沖區(qū)
11) Output:向發(fā)送緩沖區(qū)傳送一字符串,即向串口發(fā)送數(shù)據(jù)
第一步:開發(fā)程序界面
打開VB6.0 -> 新建“標(biāo)準(zhǔn) EXE”建立一個新的工程。在工程窗口Form1中添加我們要使用的各種按鈕和控件,其中一個圖標(biāo)如電話一樣的控件就是MSCOMM串行通信控件了,該控件在界面設(shè)計時候可見,在程序運行時候不可見。最后,放置好了各種控件后,程序的界面界面就出來了,是不是很簡單呀!如下圖4所示:
圖 4
第二步:VB軟件編寫
當(dāng)軟件的界面設(shè)計完成后,我們就可以給程序添加代碼了,在程序中實現(xiàn)的主要功能如下:RS-232端口初始化、檢測PC鍵盤按壓的按鍵、發(fā)送按鍵編碼、在數(shù)據(jù)發(fā)送窗顯示當(dāng)前按鍵編碼、在接收數(shù)據(jù)窗中接收顯示單片機發(fā)送來的數(shù)據(jù),檢測繼電器控制按鈕的操作,發(fā)送繼電器控制命令。。。如下圖5所示:
圖 5
【串行通信實驗操作】
完成了單片機通信程序及PC上我VB程序開發(fā)后,我們編譯工程,得到單片機芯片燒寫的HEX格式目標(biāo)文件rs232test.hex和串口測試程序可以執(zhí)行文件RS232test.exe,然后我們就可以拿出實驗板,馬上進行串口通信實驗了,檢測一下我們的實際通信效果。
1、使用ISP編程器將目標(biāo)文件rs232test.hex燒寫到AT89S51單片機中(見下圖6)
2、如前面的圖2所示:我們將燒寫好了通信程序的AT89S51芯片鎖緊到S51單片機實驗板上,然后把1602字符型液晶模塊插到實驗板的1602接口上,用RS232串口通信電纜和USB電纜將實驗板和電腦連接好,按壓實驗板的電源開關(guān),開啟電源,此時實驗板上的電源指示燈亮起來,實驗板準(zhǔn)備就緒,隨時可以接收電腦發(fā)送的數(shù)據(jù)了。
3、雙擊我們編寫的串口測試程序RS232test.exe,啟動RS-232串行通信測試軟件,在軟件上設(shè)置好和實驗板連接的通信端口,然后點擊“PC發(fā)送數(shù)據(jù)發(fā)送窗”,即可激活輸入窗口,然后我們按壓電腦鍵盤上的按鍵,按壓PS2鍵盤的按鍵將會被顯示在軟件中,同時發(fā)送到單片機上通過1602液晶模塊進行顯示,當(dāng)接收到正確數(shù)據(jù)時候,實驗板上的蜂鳴器也會發(fā)出短促的聲音,使你按壓鍵盤的感覺從聲音上體現(xiàn)出來。從單片機發(fā)送回來的數(shù)據(jù)被軟件接收后,會還原顯示在發(fā)送數(shù)據(jù)窗中,如果我們在電腦上按壓的鍵盤上的按鍵,在軟件的發(fā)送窗、接收窗及實驗板上1602液晶模塊上顯示的按鍵都相同,則說明我們電腦的RS-232串口良好,單片機的串口也是良好的,通信正常。然后,我們可以點擊軟件中的“繼電器”按鈕,實驗板上的單片機接收到電腦的控制指令后,就會控制繼電器產(chǎn)生相應(yīng)的開關(guān)動作,實現(xiàn)電腦軟件對實驗板上繼電器的控制。
通過實驗加深對51單片機串口的認(rèn)識:
下面我們通過這套串口測試程序來做個額外實驗。理論上,當(dāng)我們按壓鍵盤上的按鍵,所有按鍵都會發(fā)送到單片機,然后再返回計算機上的,在串口測試軟件上的PC發(fā)送數(shù)據(jù)窗和接收數(shù)據(jù)窗中顯示的字符數(shù)目、字符應(yīng)該是完全相同的,如上面圖1中顯示。但是,當(dāng)我們連續(xù)快速按壓PC鍵盤(注意:連續(xù)速度要足夠快哦,才能看到實驗現(xiàn)象)時,會發(fā)現(xiàn)接收數(shù)據(jù)窗中有時候會漏掉字符,累積下來,接收窗中的字符就會比發(fā)送窗中的字符少了。
發(fā)生這種現(xiàn)象的原因是什么 ?!
其實這是由于計算機發(fā)送過來的數(shù)據(jù)太快,而單片機的串口中斷一次只能接收處理一個數(shù)據(jù),前一個數(shù)據(jù)還沒有處理完,后面又有數(shù)據(jù)發(fā)送過來,單片機來不及處理漏掉了。這是由51單片機的串口特性決定的,AT89S51單片機的串口只有一個字節(jié)的發(fā)送和接收緩沖區(qū)SBUF,也就是說每次只能發(fā)送或接收一個字節(jié)數(shù)據(jù),如果在接收的數(shù)據(jù)沒有及時處理完,而又有新的數(shù)據(jù)進來,會造成數(shù)據(jù)丟失,不像計算機中VB6的MSCOMM串行通信控件,默認(rèn)的接收緩沖區(qū)為1024字節(jié),而默認(rèn)的發(fā)送緩沖區(qū)也有512字節(jié),而且還可以改變緩沖區(qū)大小,計算機有了收發(fā)數(shù)據(jù)緩沖區(qū),通信當(dāng)中就不容易出現(xiàn)緩沖區(qū)溢出而通信錯誤的現(xiàn)象。
在測控系統(tǒng)中,如果出現(xiàn)這種錯誤的話則有可能系統(tǒng)失控,數(shù)據(jù)出錯,誤報警等。當(dāng)然,我們在通信中也可以加入校驗機制來檢查錯誤,但這種現(xiàn)象也使系統(tǒng)穩(wěn)定性降低,出現(xiàn)莫名其妙的故障,而且這種屬于軟件故障,我們往往不容易想到,會走彎路。為了減少這種問題的出現(xiàn),在這里站長提醒大家,在開發(fā)的單片機串口中斷服務(wù)子程序中,要盡量加快數(shù)據(jù)處理速度,在接收完成數(shù)據(jù)后,要及時打開串口中斷,以便接收新的數(shù)據(jù),而其他占用時間的運算程序盡量不要在串口中斷里面處理,這是每一個單片機開發(fā)人員值得注意的問題,希望大家能夠從我們這個實驗中得到啟發(fā),開發(fā)出更完美的程序來,少走彎路。
好了,這個實驗到此結(jié)束了,希望大家通過對這個軟件的學(xué)習(xí),掌握單片機實時溫度監(jiān)控的開發(fā)、串口通信程序的開發(fā)及計算機串口實時控制開發(fā)原理及PC監(jiān)控軟件的開發(fā),為開發(fā)其他功能更加完善的單片機綜合應(yīng)用系統(tǒng)打好基礎(chǔ)。