使用VB中的MSComm控件實現(xiàn)串口通信_第1頁
使用VB中的MSComm控件實現(xiàn)串口通信_第2頁
使用VB中的MSComm控件實現(xiàn)串口通信_第3頁
使用VB中的MSComm控件實現(xiàn)串口通信_第4頁
使用VB中的MSComm控件實現(xiàn)串口通信_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.使用VB中的MSComm控件實現(xiàn)RS-232串口通信實驗準備:需要準備一些與串口通信有關(guān)的設(shè)備,如(外置式)調(diào)制解調(diào)器、計算機串口與調(diào)制解調(diào)器的連接線、一根DTE到DTE的無調(diào)制解調(diào)器連接線(接法見本章有關(guān)習題的參考答案),在實驗前檢查計算機的兩個串口是否能夠正常工作。實驗環(huán)境:Windows 95/98操作系統(tǒng),Microsoft VB 5.0以上程序設(shè)計環(huán)境。對例題中涉及調(diào)制解調(diào)器的內(nèi)容,采用計算機與調(diào)制解調(diào)器連接的方式;對在例題中設(shè)計數(shù)據(jù)傳輸?shù)膬?nèi)容,須事先將DTE到DTE的無調(diào)制解調(diào)器連接線的兩端,分別插入Com1和Com2串口。實驗說明:VB中的MSComm控件通過串行端口傳輸和接收

2、數(shù)據(jù),為應用程序提供串行通訊功能。MSComm控件提供下列兩種處理通訊的方式:(1)事件驅(qū)動(實時)方式,這是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時需要得到通知,例如,在Carrier Detect(CD)或RequestToSend(RTS)線上一個字符到達或一個變化發(fā)生時。在這些清況下,可以利用MSComm控件的OnComm事件捕獲并處理這些通訊事件。OnComm事件還可以檢查和處理通訊錯誤。(2)輪詢方式,在程序的每個關(guān)鍵功能之后,可以通過檢查CommEvent屬性的值來查詢事件和錯誤。如果應用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一

3、個簡單的電話撥號程序,則沒有必要對每接收一個字符都產(chǎn)生事件,因為唯一等待接收的字符是調(diào)制解調(diào)器的“OK”響應。每個使用的MSComm控件都對應著一個串行端口。如果應用程序需要訪問多個串行端口,必須使用多個MSComm控件??梢栽赪indows“控制面板”中改變端口地址和中斷地址。下面這個簡單的例子采用了輪詢方法演示了用調(diào)制解調(diào)器進行基本的串行通訊:Private Sub Form_Load()Dim Instring As String保存輸入子串的緩沖區(qū)MSCOmm1.CommPort=3使用COM3。MSComm1.Settings=2400,N,8,12400波特率,無奇偶校驗,8位數(shù)據(jù)

4、位,一位停止位MSComm1.InputLen0當輸入占用時,告訴控件讀人整個緩沖區(qū)。MSComm1.PortOpenTrue打開端口。MSComm1.Output=AT+Chr$(13)將調(diào)制解調(diào)器的Attention命令送到調(diào)制解調(diào)器。Do等待數(shù)據(jù)返回到串行端口。DoEventsLoop Until MSComm1.InBufferCount=2InstringMSComm1.Input從串行端口讀”O(jiān)K“響應。進行相應的處理,這里省略MSComm1PortOpenFalse關(guān)閉串行端口。End Sub下面我們將講述一下MSComm控件的所有屬性,其中前5個是最基本的,必須首先掌握。MsC

5、omm控件屬性1) CommPort,設(shè)置并返回通訊端口號。語法為:Object.CommPort=value說明:value一為一個整型值,說明端口號。在設(shè)計時,va1ue可以設(shè)置成從1到16的任何數(shù)(缺省值為1)。但是如果用PortOpen屬性打開一個并不存在的端口時,MSComm控件會產(chǎn)生錯誤68(設(shè)備無效)。注意:必須在打開端口之前設(shè)置CommPort屬性的值。2) Settings,設(shè)置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位參數(shù)。語法為:0bject.Settingsvalue說明:value一為字符串表達式,說明通訊端口的設(shè)置值。Value由四個設(shè)置值組成,其格式如下:“BBBB,

6、P,D,S”,其中:BBBB為波特率,P為奇偶校驗,D為數(shù)據(jù)位數(shù),S為停止位數(shù)。value的缺省值:”9600,N,8,1”3) PortOpen,設(shè)置并返回通訊端口的狀態(tài)(開或關(guān))。在設(shè)計時無效。語法為:object.PortOpenvalue說明:value一為布爾表達式,說明通訊端口的狀態(tài)。value的取值為:True端口開,F(xiàn)alse一端口關(guān)注意:設(shè)置PortOpen屬性為True時打開端口。設(shè)置為False時關(guān)閉端口并清除接收和傳輸緩沖區(qū)。當應用程序終止時,MSComm控件自動關(guān)閉串行端口。串行端口設(shè)備必須支持Settings屬性當前的設(shè)置值。如果Settings屬性包含硬件不支持的

7、通訊設(shè)置值,那么硬件可能不會正常工作。如果在端口打開之前,DTREnable或RTSEnable屬性設(shè)置為True,當關(guān)閉端口時,該屬性設(shè)置為False。否則,DTR和RTS線保持其先前的狀態(tài)。下例以波特率2400打開4號通訊端口,沒有奇偶檢查,7個數(shù)據(jù)位,1。5個停止位:MSComm1.Settings=2400,n,7,1.5MSCOmm1.CommPort=4MSComm1.PortOpen=True4) Input,返回并刪除接收緩沖區(qū)中的數(shù)據(jù)流。該屬性在設(shè)計時無效,在運行時為只讀。語法為:Object.Input說明:InputLen屬性確定被Input屬性讀取的字符數(shù)。設(shè)置Inpu

8、tLen為0,則Input屬性讀取緩沖區(qū)中全部的內(nèi)容。InputMode屬性確定Input屬性讀取的數(shù)據(jù)類型。如果設(shè)置InputMode為comlnputModeText,則Input屬性通過一個Variant返回文本數(shù)據(jù)。如果設(shè)置InputMode為comInputModeBinary,Input屬性通過一個Variant返回一二進制數(shù)據(jù)的數(shù)組。例:這個例子說明如何從接收緩沖區(qū)讀取數(shù)據(jù):Private Sub CmdReceive_Click()Dim InString as StringMSComm1.InputLen=0讀取所有可用數(shù)據(jù)。If MSComm1.InBufferCount

9、Then檢查數(shù)據(jù)。InStringMSComm1.Input 讀入數(shù)據(jù)End IfEnd Sub5) Output,往傳輸緩沖區(qū)寫數(shù)據(jù)流。該屬性在設(shè)計時無效,在運行時為只讀。語法為:object.Output=value說明:value一為準備寫到傳輸緩沖區(qū)中去的一個字符串。Output屬性可以傳輸文本數(shù)據(jù)或二進制數(shù)據(jù)。用Output屬性傳輸文本數(shù)據(jù),必須定義一個包含一個字符串的Variant。發(fā)送二進制數(shù)據(jù),必須傳遞一個包含字節(jié)數(shù)組的variant到Output屬性。一般情況下,如果發(fā)送一個ANSI字符串到應用程序,可以以文本數(shù)據(jù)的形式發(fā)送。如果發(fā)送包含嵌人控制字符、Null字符等等的數(shù)據(jù),

10、要以二進制形式發(fā)送。例:這個例子說明如何將用戶鍵人的每一個字符送到串行端口:Private Sub Form_KeyPress(KeyAscii As lnteger)Dim Buffer as VariantMSCOmm1.CommPort=1 設(shè)置并打開端口MSComm1.PortOpen=True BufferChr$(KeyAscii)MSCOmm1.Output=BufferEnd Sub6) Break,設(shè)置或清除中斷信號的狀態(tài)。該屬性在設(shè)計時無效。7) CDHolding,通過查詢載波偵聽CarrierDetect(CD)線的狀態(tài)確定當前是否有傳輸。CarrierDetect是從

11、調(diào)制解調(diào)器發(fā)送到相聯(lián)計算機的一個信號,指示調(diào)制解調(diào)器正在聯(lián)機。該屬性在設(shè)計時無效,在運行時為只讀。8) CommEvent,返回最近的通訊事件或錯誤。該屬性在設(shè)計時無效,在運行時為只讀。9) CommID,返回一個說明通訊設(shè)備的句柄。該屬性在設(shè)計時無效,在運行時為只讀。說明:該值與Windows API CreateFile函數(shù)返回的值一致。在WindowsAPI中調(diào)用任何通訊例程時使用該值。10) CTSHolding,確定是否可通過查詢ClearToSend(CTS)線的狀態(tài)發(fā)送數(shù)據(jù)。C1ear To Send是調(diào)制解調(diào)器發(fā)送到相聯(lián)計算機的信號,指示傳輸可以進行。該屬性在設(shè)計時無效,在運行

12、時為只讀。11) DSRHolding,確定DataSetReady(DSR)線的狀態(tài)。Data Set Ready信號由調(diào)制解調(diào)器發(fā)送到相連計算機,指示作好操作準備。該屬性在設(shè)計時無效,在運行時為只讀。12) DTREnable,確定在通訊時是否使DataTerminalReady(DTR)線有效。Data Terminal Ready是計算機發(fā)送到調(diào)制解調(diào)器的信號,指示計算機在等待接受傳輸。13) EOFEnable,EOFEnable屬性確定在輸入過程中MSComm控件是否尋找文件結(jié)尾(EOF)字符。如果找到EOF字符,將停止輸入并激活OnComm事件,此時commEvent屬性設(shè)置為c

13、omEvEOF。14) Handshaking,設(shè)置井返回硬件握手協(xié)議。語法為:Object.Handshaking=value說明:value一為整型表達式,說明握手約定。value的取值為:常數(shù)值說明comNone0(缺省)沒有握手comXOnXOff .1(XON/XOFF)握手comRTS2RTS/CTS (Request To Send/Clear To Send)握手comRTSXOnXOff3Request To Send 和 XON/XOFF皆可Handshaking是指內(nèi)部通訊協(xié)議,通過該協(xié)議,數(shù)據(jù)從硬件端口傳輸?shù)浇邮站彌_區(qū)。當一個數(shù)據(jù)字符到達串行端口,通訊設(shè)備就把它移到接收

14、緩沖區(qū)以使程序可以讀它。如果沒有接受緩沖區(qū),程序需要直接從硬件讀取每一個字符,這很可能會造成數(shù)據(jù)丟失,因為字符到達的速度可以非???。握手協(xié)議保證在緩沖區(qū)過載時數(shù)據(jù)不會丟失,緩沖區(qū)過載為數(shù)據(jù)到達端口太快而使通訊設(shè)備來不及將它移到接收緩沖區(qū)。15) InBufferCount,返回接收緩沖區(qū)中等待的字符數(shù)。該屬性在設(shè)計時無效。說明:InBufferCount是指調(diào)制解調(diào)器已接收,并在接收緩沖區(qū)等待被取走的字符數(shù)。可以把InBufferCount屬性設(shè)置為0來清除接收緩沖區(qū)。16) InBufferSize,設(shè)置并返回接收緩沖區(qū)的字節(jié)數(shù)。說明:InBufferSize是指整個接收緩沖區(qū)的大小。缺省值

15、是1024字節(jié)。注意:接收緩沖區(qū)越大則應用程序可用內(nèi)存越小。但若接受緩沖區(qū)太小,若不使用握手協(xié)議。就可能有溢出的危險。一般的規(guī)律是,首先設(shè)置一個1024字節(jié)的緩沖區(qū)。如果出現(xiàn)溢出錯誤,則通過增加緩沖區(qū)的大小來控制應用程序的傳輸速率。17) InputLen,設(shè)置并返回Input屬性從接收緩沖區(qū)讀取的字符數(shù)。說明:InputLen屬性的缺省值是0。設(shè)置InputLen為0時,使甩Input將使MSColnm控件讀取接收緩沖區(qū)中全部的內(nèi)容。若接收緩沖區(qū)中InputLen字符無效,1nput。屬性返回一個零長度字符串()。在使用Input前,用戶可以選擇檢查InBuffereount屬性來確定緩沖區(qū)

16、中是否已有需要數(shù)目的字符。該屬性在從輸出格式為定長數(shù)據(jù)的機器讀取數(shù)據(jù)時非常有用。例:這個例子說明如何讀取25個數(shù)據(jù)字符:Private CmdRead_Click()Dim CommData as StringMSComm11nputLen25 確定一個25個字符的數(shù)據(jù)塊。CommDataMSComm1.Input讀數(shù)據(jù)。End Sub18) InputMode,設(shè)置或返回Input屬性取回的數(shù)據(jù)的類型。說明:InputMode屬性確定Input屬性如何取回數(shù)據(jù)。數(shù)據(jù)取回的格式或是字符串或是一數(shù)據(jù)組的二進制數(shù)據(jù)的數(shù)組。若數(shù)據(jù)只用ANSI字符集,則用comInputModeText。對其它字符數(shù)

17、據(jù),如數(shù)據(jù)中有嵌入控制字符、Nulls等等,則使用comInputModeBinary。19) NullDiscard,確定null字符是否從端口傳送到接收緩沖區(qū)。20) OutBufferrCount,返回在傳輸緩沖區(qū)中等待的字符數(shù)。也可以用它來清除傳輸緩沖區(qū)。該屬性在設(shè)計時無效。說明:設(shè)置OutBufferCount屬性為0可以清除傳輸緩沖區(qū)。21) OutBufferSize,以字節(jié)的形式設(shè)置并返回傳輸緩沖區(qū)的大小。說明:OutBufferSize指整個傳輸緩沖區(qū)的大小:缺省值是512字節(jié)。傳輸緩沖區(qū)設(shè)置的越大則應用程序可用內(nèi)存越小。但若緩沖區(qū)太小,若不使用握手協(xié)議,就可能有溢出的危險。

18、一般的規(guī)律是,首先設(shè)置一個512字節(jié)的緩沖區(qū)。如果出現(xiàn)溢出錯誤,則通過增加緩沖區(qū)的大小來控制應用程序的傳輸速率。22) ParityReplace,當發(fā)生奇偶校驗錯誤時,設(shè)置并返回替換數(shù)據(jù)流中一個非法字符的字符。說明:缺省的情況是,Mscomm控件用問號(?)替換非法字符。如果設(shè)置parityRep1ace為一個空字符串(),則當奇偶校驗錯誤出現(xiàn)時,字符替換無效。但onComm事件仍然產(chǎn)生,并且設(shè)置CommEvent。屬性為comEventRXparity。ParityReplace字符被用于面向字節(jié)的操作,它必須是單字節(jié)字符。可指定0到255之間的任何ANSI字符代碼。23) Rthresh

19、old,在MSCoinm控件設(shè)置CommEvent屬性為comEvReceive,并產(chǎn)生onComm事件之前,設(shè)置并返回的要接收的字符數(shù)。24) RTSEnable,確定是否使Requestrosend(RTS)線有效。一般情況下,由計算機發(fā)送RequestToSend信號到聯(lián)接的調(diào)制解調(diào)器,以請示允許發(fā)送數(shù)據(jù)。25) Sthreshold,在MSComm控件設(shè)置。CommEvent屬性為comEvSend并產(chǎn)生onComm事件之前,設(shè)置并返回傳輸緩沖區(qū)中允許的最小字符數(shù)。事件1) onComm,無論何時當CommEvent屬性的值變化時,就產(chǎn)生onComm事件,它標志發(fā)生了一個通訊事件或一個

20、錯誤。說明:CommEvent屬性包含實際錯誤或產(chǎn)生onComm事件的編碼。但是,當Rthresho1d或Sthreshold屬性被設(shè)置為0時,則會分別使comEvReceive和comEvSend事件無效。使用輪詢方式實現(xiàn)串口通信工程名稱:MSComm_Show1.vbp發(fā)送窗體名稱:MSComm_Send1.frm接收窗體名稱:MSComm_Receive_Polling.frm控件及屬性設(shè)置:對象名稱屬性對象名稱屬性MSComm_SendCaption: MSComm_SendMSComm_Receive_PollingCaption: MSComm_Receive_PollingLab

21、el1Caption:發(fā)送窗口Label1Caption:接收窗口Label2Caption: 請將發(fā)送內(nèi)容寫入文本框Label2Caption: 接收到的文本將在文本框中顯示Text1Text:Text1Text:MSComm1Macomm1程序代碼:發(fā)送窗體程序Private Sub Form_Load() MSComm1.CommPort = 1 使用COM1。 MSComm1.Settings = 2400,N,8,1 2400波特率,無奇偶校驗,8位數(shù)據(jù)位,一位停止位 MSComm1.InputLen = 0 當輸入占用時,告訴控件讀人整個緩沖區(qū)。 MSComm1.PortOpen

22、= True 打開端口。 Mscomm_Receive_Polling.Show 顯示輪詢接收窗體,啟動接收程序End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer) MSComm1.Output = Chr$(KeyAscii) 發(fā)送用戶從鍵盤上輸入的字符End SubPrivate Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = False 關(guān)閉串行端口End Sub接收窗體程序Private Sub Form_Load() MSComm1.CommPort = 2 使用COM

23、2。 MSComm1.Settings = 2400,N,8,1 MSComm1.InputLen = 0 MSComm1.PortOpen = True End SubPrivate Sub Form_Click() Text1.Text = MSComm1.Input 從串行端口讀內(nèi)容。End SubPrivate Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = FalseEnd Sub實驗操作步驟:1) 用發(fā)送窗體(MSComm_Send)作為啟動對象,啟動程序后,發(fā)送窗體和輪詢接收窗體都將出現(xiàn)在屏幕上;2) 用鼠標將光標設(shè)置到

24、發(fā)送窗體的文本框中,在文本框中輸入字母或數(shù)字,觀察接受窗口的文本框有無變化;3) 移動鼠標光標單擊接收窗體,接收窗體由deactivate成為一個Activate狀態(tài),再觀察接收窗體的文本框有什么變化,請考慮一下程序執(zhí)行的過程和輪詢方式的工作原理。使用事件驅(qū)動(實時)方式實現(xiàn)串口通信工程名稱:MSComm_Show2.vbp發(fā)送窗體名稱:MSComm_Send2.frm接收窗體名稱:MSComm_Receive_Realtime.frm控件及屬性設(shè)置:對象名稱屬性對象名稱屬性MSComm_SendCaption: MSComm_SendMSComm_Receive_PollingCaption: MSComm_Receive_RealtimeLabel1Caption:發(fā)送窗口Label1Caption:接收窗口Label2Caption: 請將發(fā)送內(nèi)容寫入文本框Label2Caption: 接收到的文本將在文本框中顯示Text1Text:Text1Text:MSComm1Macomm1Rthreshold:1程序代碼:發(fā)送窗體程序Private Sub Form_Load() MSComm1.CommPort = 1 MSComm1.Settings = 2400,N,8,1 MSCo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論