VB中-MSComm控件使用詳解_第1頁
VB中-MSComm控件使用詳解_第2頁
VB中-MSComm控件使用詳解_第3頁
VB中-MSComm控件使用詳解_第4頁
VB中-MSComm控件使用詳解_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、VB中MSComm控件使用詳解VB中MSComm控件使用詳解MSComm控件通過串行瑞口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通訊功能。MSComm控件在串口編程時非常方便,程序員不必去花時間去了解較為復(fù)雜的API函數(shù),而且在VC、VB、Delphi等語言中均可使用。MicrosoftCommunicationsControl(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法。具體的來說,它提供了兩種處理通信問題的方法:一是事件驅(qū)動(Event-driven)方法,一是査詢法。MSComm控件

2、兩種處理通訊的方式MSComm控件提供下列兩種處理通訊的方式:事件驅(qū)動方式和査詢方式。1.1事件驅(qū)動方式事件驅(qū)動通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時需要得到通知,例如,在串口接收緩沖區(qū)中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)線上一個字符到達或一個變化發(fā)生時。在這些情況下,可以利用MSComm控件的OnComm事件捕獲并處理這些通訊事件。OnComm事件還可以檢査和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱CommEvent屬性。在編程過程中,就可以在0nComm事件處理函數(shù)中加入自己的處理代碼。這種方法的

3、優(yōu)點是程序響應(yīng)及時,可靠性髙。每個MSComm控件對應(yīng)著一個串行端口。如果應(yīng)用程序需要訪問多個串行端口,必須使用多個MSComm控件。1.2査詢方式査詢方式實質(zhì)上還是事件驅(qū)動,但在有些情況下,這種方式顯得更為便捷。在程序的每個關(guān)鍵功能之后,可以通過檢査CommEvent屬性的值來査詢事件和錯誤。如果應(yīng)用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字符都產(chǎn)生事件,因為唯一等待接收的字符是調(diào)制解調(diào)器的確定“響應(yīng)。MSComm控件的常用屬性MSComm控件有很多重要的屬性,但首先必須熟悉兒個屬性。CommPort設(shè)置并返回通訊端口號。S

4、ettings以字符串的形式設(shè)置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位。PortOpen設(shè)置并返回通訊端口的狀態(tài)。也可以打開和關(guān)閉端口。Input從接收緩沖區(qū)返回和刪除字符。Output向傳輸緩沖區(qū)寫一個字符串。下而分別描述:CommPort屬性設(shè)置并返回通訊端口號。語法object.CommPort=valueCommPort屬性語法包括下列部分:部分描述object對彖表達式,其值是應(yīng)用于列表中的對象。value一整型值,說明端口號。說明在設(shè)計時,value可以設(shè)置成從1到16的任何數(shù)(缺省值為1)。但是如果用PortOpen屬性打開一個并不存在的端口時,MSComm控件會產(chǎn)生錯誤68(設(shè)

5、備無效)。警告必須在打開端口之前設(shè)置CommPort屬性。數(shù)據(jù)類型IntegerSettings屬性設(shè)置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位參數(shù)。語法object.Settings=valueSettings屬性語法包括下列部分:部分描述object對象表達式,其值是應(yīng)用于列表中的對象。value字符串表達式,說明通訊端口的設(shè)宜值,如下所述。說明當(dāng)端口打開時,如果value非法,則MSComm控件產(chǎn)生錯誤380(非法屬性值。Value由四個設(shè)置值組成,有如下的格式:BBBBZPZDZSBBBB為波特率,P為奇偶校驗,D為數(shù)據(jù)位數(shù),S為停止位數(shù)。value的缺省值是:9600,N,8,1下表列

6、出合法的波特率:設(shè)置值110300600120024009600(缺?。?440019200288003840056000128000256000下表說明合法的奇偶校驗值。設(shè)置值描述E偶數(shù)(Even)M標(biāo)記(Mark)N缺省(Default)None0奇數(shù)(Odd)S空格(Space)下表列出合法的數(shù)據(jù)位值。設(shè)置值4567(缺省)下表列出合法的停止位值。設(shè)置值(缺省)1.52數(shù)據(jù)類型StringSettings示例下而的例子設(shè)置控件端口通訊,波特率9600,無奇偶校驗檢查,8個數(shù)據(jù)位,1個停止位:MSComml.Settings=9600,N,8,lPortOpen屬性設(shè)宜并返回通訊端口的狀態(tài)

7、(開或關(guān))。在設(shè)計時無效。語法object.PortOpen=valuePortOpen屬性語法包括下列部分:部分描述object對彖表達式,其值是應(yīng)用于列表中的對象。value布爾表達式,說明通訊端口的狀態(tài)。設(shè)置值value設(shè)置值是:設(shè)置值描述True端口開False端口關(guān)說明設(shè)置PortOpen屬性為True打開端口。設(shè)置為False關(guān)閉端口并淸除接收和傳輸緩沖區(qū)。當(dāng)應(yīng)用程序終止時,MSComm控件自動關(guān)閉串行端口。在打開端口之前,確定CommPort屬性設(shè)置為一個介法的端口號。如果CommPort屬性設(shè)宜為一個非法的端口號,則當(dāng)打開該端口時,MSComm控件產(chǎn)生錯誤68(設(shè)備無效)。另外

8、,串行端口設(shè)備必須支持Settings屬性當(dāng)前的設(shè)置值。如果Settings屬性包含硬件不支持的通訊設(shè)置值,那么硬件可能不會正常工作。如果在端口打開之前,DTREnable或RTSEnable屬性設(shè)置為True,當(dāng)關(guān)閉端口時,該屬性設(shè)置為False.否則,DTR和RTS線保持其先前的狀態(tài)。數(shù)據(jù)類型BooleanPortOpen屬性示例下例以波特率9600打開1號通訊端口,沒有奇偶檢査,8個數(shù)據(jù)位,1個停止位。MSComml.Settings=”9600,n,8,1”MSComm1.CommPort=1MSComml.PortOpen=TrueInput屬性返回并刪除接收緩沖區(qū)中的數(shù)據(jù)流。該屬性

9、在設(shè)計時無效,在運行時為只讀。語法object.InputInput屬性語法包括下列部分:部分描述object對彖表達式,其值是應(yīng)用于列表中的對象。說明InputLen屬性確定被Input屬性讀取的字符數(shù)。設(shè)宜InputLen為0,則Input屬性讀取緩沖區(qū)中全部的內(nèi)容。InputMode屬性確定用Input屬性讀取的數(shù)據(jù)類型。如果設(shè)置InputMode為comInputModeText,Input屬性通過一個Variant返回文本數(shù)據(jù)。如果設(shè)置InputMode為comlnputModeBinary,Input屬性通過一個Variant.返回一二進制數(shù)據(jù)的數(shù)組。數(shù)據(jù)類型VariantInpu

10、t屬性示例該例子說明如何從接收緩沖區(qū)讀取數(shù)據(jù)。PrivateSubCommandl_Click()DimInStringasString1讀取所有可用數(shù)據(jù)。MSComml.InputLen=0檢査數(shù)據(jù)。IfMSComml.InBufferCountThen1Readdata.InString=MSComml.InputEndIfEndSubOutput屬性往傳輸緩沖區(qū)寫數(shù)據(jù)流。該屬性在設(shè)計時無效,在運行時為只讀。語法object.Output=valueOutput屬性語法包括下列部分:部分描述object對彖表達式,其值是應(yīng)用于列表中的對象。value要寫到傳輸緩沖區(qū)中的一個字符串。說明Ou

11、tput屬性可以傳輸文本數(shù)據(jù)或二進制數(shù)據(jù)。用Output屬性傳輸文本數(shù)據(jù),必須左義一個包含一個字符串的Variant.,發(fā)送二進制數(shù)據(jù),必須傳遞一個包含字節(jié)數(shù)組的Variant到Output屬性。正常情況下,如果發(fā)送一個ANSI字符串到應(yīng)用程序,可以以文本數(shù)據(jù)的形式發(fā)送。如果發(fā)送包含嵌入控制字符、Null字符等等的數(shù)據(jù),要以二進制形式發(fā)送。數(shù)據(jù)類型VariantOutput屬性示例下而的例子說明如何將用戶鍵入的每一個字符送到串行端口:PrivateSubForm_KeyPress(KeyAsciiAsInteger)DimBufferasVariant設(shè)置并打開窗口MSComml.CommPo

12、rt=1MSComml.PortOpen=TrueBuffer=Chr$(KeyAscii)MSComml.Output=BufferEndSubOnComm事件無論何時當(dāng)CommEvent屬性的值變化時,就產(chǎn)生OnComm事件,標(biāo)志發(fā)生了一個通訊事件或一個錯誤。語法PrivateSubobject_OnComm()OnComm事件語法包括下列部分:部分描述object對象表達式,其值是應(yīng)用于列表中的對象。說明CommEvent屬性包含實際錯誤或產(chǎn)生OnComm事件的數(shù)碼。注意,設(shè)置Rthreshold或Sthreshold屬性為0,分別使捕獲comEvReceive和comEvSend事件無

13、效。OnComm事件示例下例說明如何處理通訊錯誤和事件??梢栽谙嚓P(guān)的Case語句之后插入代碼來處理特定的錯誤或事件。PrivateSubMSComm_OnComm()SelectCaseMSComml.CommEventHandleeacheventorerrorbyplacingcodebeloweachcasestatement錯誤收到BreaksCD(RLSD)超時。CTSTimeout01DSRTimeouto1FramingError數(shù)據(jù)丟失。接收緩沖區(qū)溢岀。Parity錯誤。傳輸緩沖區(qū)已滿。獲取DCB時意外錯誤CasecomEventBreakCasecomEventCDTOCas

14、ecomEventCTSTOCasecomEventDSRTOCasecomEventFrameCasecomEventOverrunCasecomEventRxOverCasecomEventRxParityCasecomEventTxFullCasecomEvCDCD線狀態(tài)變化。CasecomEventDCBCasecomEvCTSCasecomEvDSRCasecomEvRing1CTS線狀態(tài)變化。DSR線狀態(tài)變化。RingIndicator變化。CasecomEvReceive收到RThreshold#ofchars.CasecomEvSend傳輸緩沖區(qū)有Sthreshold個字符Ca

15、secomEvEof輸入數(shù)據(jù)流中發(fā)現(xiàn)EOF字符EndSelectEndSubCommEvent屬性返回最近的通訊事件或錯誤。該屬性在設(shè)計時無效,在運行時為只讀。語法object.CommEventCommEvent屬性語法包括下列部分:部分描述object對象表達式,其值是應(yīng)用于列表中的對象。說明只要有通訊錯誤或事件發(fā)生時都會產(chǎn)生OnComm事件,CommEvent屬性存有該錯誤或事件的數(shù)值代碼。要確定引發(fā)OnComm事件的確切的錯誤或事件,請參閱CommEvent屬性。CommEvent屬性返回下列值之一來表示不同的通訊錯誤或事件。這些常數(shù)可以在該控件的對象庫中找到。通訊錯誤包括下列設(shè)置值:

16、常數(shù)值描述comEventBreak1001接收到一個中斷信號。comEventCTSTO1002ClearToSend超時。在系統(tǒng)規(guī)定時間內(nèi)傳輸一個字符時,ClearToSend線為低電平。comEventDSRTO1003DataSetReady超時。在系統(tǒng)規(guī)左時間內(nèi)傳輸一個字符時,DataSetReady線為低電平。comEventFrame1004幀錯誤。換件檢測到一幀錯誤。comEventOverrun1006瑞口超速。沒有在下一個字符到達之前從碩件讀取字符,該字符丟失。comEventCDTO1007載波檢測超時。在系統(tǒng)規(guī)立時間內(nèi)傳輸一個字符時,CarrierDetect線為低電平

17、。CarrierDetect也稱為ReceiveLineSignalDetect(RLSD)。comEventRxOver1008接受緩沖區(qū)溢出。接收緩沖區(qū)沒有空間。comEventRxParity1009奇偶校驗。硬件檢測到奇偶校驗錯誤comEventTxFull1010傳輸緩沖區(qū)已滿。傳輸字符時傳輸緩沖區(qū)已滿comEventDCB1011檢索端口的設(shè)備控制塊(DCB)時的意外錯誤通訊事件包括下列設(shè)置值:常數(shù)值描述comEvSend1在傳輸緩沖區(qū)中有比Sthreshold數(shù)少的字符。comEvReceive2收到Rthreshold個字符。該事件將持續(xù)產(chǎn)生直到用Input屬性從接收緩沖區(qū)中刪

18、除數(shù)據(jù)。comEvCTS3ClearToSend線的狀態(tài)發(fā)生變化。comEvDSR4DataSetReady線的狀態(tài)發(fā)生變化。該事件只在DST從1變到0時才發(fā)生。comEvCD5CarrierDetect線的狀態(tài)發(fā)生變化。comEvRing6檢測到振鈴信號。一些UART(通用異步接收一傳輸)可能不支持該事件。comEvEOF7收到文件結(jié)束(ASCII字符為26)字符。數(shù)據(jù)類型IntegerMSComm控件示例下而這個簡單的例子演示了用調(diào)制解調(diào)器進行基本的串行通訊:PrivateSubForm_Load()保存輸入子串的緩沖區(qū)DimInstringAsString使用COMloMSComm1.C

19、ommPort=19600波特,無奇偶校驗,8位數(shù)據(jù),一個停止位。MSComml.Settings=9600,8,1當(dāng)輸入占用時,告訴控件讀入整個緩沖區(qū)。MSComml.InputLen=0打開端口。MSComml.PortOpen=True將attention命令送到調(diào)制解調(diào)器。Chr$函數(shù):返回String,其中包含有與指定的字符代碼相關(guān)的字符MSComml.Output=ATVIQO&Chr$(13)確保調(diào)制解調(diào)器以“OK“響應(yīng)。等待數(shù)據(jù)返回到串行端口。DoDoEventsBuffer$=Buffer$&MSComml.InputLoopUntilInStr(Buffer$,OK&vbC

20、RLF)從串行端口讀OK響應(yīng)。關(guān)閉串行端口。MSComml.PortOpen=FalseEndSub注意MSComm控件可以采用輪詢或事件驅(qū)動的方法從端口獲取數(shù)據(jù)。這個簡單的例子使用了倫詢方法。實例1:計算機撥號在一些實際應(yīng)用中經(jīng)常需要使用計算機撥號。下而這個例子利用MSComm控件操作Modem進行撥號,實現(xiàn)串口通信。實現(xiàn)步驟:建窗體添加一個MSComm控件,用來建立與串口的連接:添加一個Text控件,Name屬性為Txttel,用來輸入電話號碼;添加3個CommandButton控件,Name屬性分別為DialButtonXancellButton.QuitButton,分別用來實現(xiàn)撥號、

21、中止撥號、中止程序:添加一個Label控件,用來顯示所有與撥號有關(guān)的信息。窗體見圖設(shè)置MSComm控件屬性InBufferSize=1024;zInBufferSize是指整個接收緩沖區(qū)的大小。缺省值是1024字節(jié)。Inputlen=O:InputLen屬性的缺省值是0。設(shè)宜InputLen為0時,使用Input將使MSComm控件讀取接收緩沖區(qū)中全部的內(nèi)容。InputMode=0;0(缺?。?shù)據(jù)通過Input屬性以文本形式取回。1一數(shù)據(jù)通過Input屬性以二進制形式取回Rthreshold=2;當(dāng)接收字符后,若Rthreshold屬性設(shè)置為0(缺省值)則不產(chǎn)生OnComm事件。RTSEnab

22、le=True:當(dāng)RTSEnable設(shè)置為True,端口打開時,RequestToSend線設(shè)置為高電平,端口關(guān)閉時,設(shè)置為低電平。Settings=、9600,N,8,l;Sthreshold=Oa若設(shè)置Sthreshold屬性為0(缺省值),數(shù)據(jù)傳輸事件不會產(chǎn)生OnComm事件。若設(shè)置Sthreshold屬性為1,當(dāng)傳輸緩沖區(qū)完全空時,MSComm控件產(chǎn)生OnComm事件。因為每一臺計算機的串口使用狀態(tài)都不會一樣。為使程序具有通用性,在窗體的Load方法中首先進行串口測試,找到第一個可用串口后再進行設(shè)置。程序功能程序根據(jù)輸入的電話號碼進行撥號,Modem正常撥號后,提示用戶摘機,準(zhǔn)備通話。

23、圖1電話撥號實例主要方法與事件代碼設(shè)置可用串口PrivateSubForm_Load()OnErrorGoToerror_openFori=1To4MSComml.CommPort=1MSComm1.PortOpen=True設(shè)置可用的第一個串口OnErrorGoTo0ExitSuberror_resume:Nexterror_open:Resumeerror_resumeEndSubPrivateSubDialButton_Click()DimNumber$,Temp$Number$=Trim$(Txttel.Text)返回Variant(String),其中包含指定字符串的拷貝,沒有前導(dǎo)空

24、白(LTrim).尾隨空白(RTrim)或前導(dǎo)和尾隨空白(Trim)。IfNumber$=ThenMsgBox請輸入電話號碼Txttel.SetFocusExitSubEndIfDialButton.Enabled=FalseQuitButton.Enabled=FalseDialString$=ATDT+Number$+vbCr淸除接收緩沖區(qū)MSComml.InBufferCount=0撥電話號碼MSComml.Output=DialString$Lblmessage.Caption=正在撥號碼一+Numbe$DialButton.Enabled=TrueQuitButton.Enabled

25、=TrueEndSubPrivateSubMSComml_OnComm()SelectCaseMSComml.CommEventCasecomEvReceive讀取串口數(shù)據(jù)COMBUF=COMBUF+MSComml.InputIc=InStr(lzCOMBUF,、OIC)IfIc=0ThenExitSubModem已正常撥號,返回OKLblmessage.Caption=請您摘下電話機,準(zhǔn)備通話CasecomEvSendEndSelectEndSubPrivateSubCancelButton_Click()斷開與調(diào)制解調(diào)器的連接MSComml.Output=、ATH+vbCrEndSub實例

26、2:實現(xiàn)來電顯示在一些實際應(yīng)用中,需要顯示并保存來電號碼,并根據(jù)電話號碼顯示相應(yīng)資料,比如小區(qū)物業(yè)管理和110報警等系統(tǒng)。實現(xiàn)步驟:創(chuàng)建窗體添加一個MSComm控件,用來建立與串口的連接;添加4個Option控件,用來確定使用的串口號:添加4個Label控件,用來顯示來電號碼及日期時間;添加一個ProgressBar控件,用來顯示電話振鈴次數(shù):為方便調(diào)試程序,添加一個Text控件Text5,用來顯示Modem傳來的所有信息。窗體見圖2。圖2來電顯示窗體設(shè)置MSComm控件屬性InBufferSize=1024;Inputlen=O:InputMode=0:Rthreshold=l:RTSEna

27、ble=True:Settings=9600zNz8zln;Sthreshold=0o程序功能程序首先初始化Modem,然后等待來電。當(dāng)有來電時,MSComm產(chǎn)生OnComm事件,Modem送岀的信息格式為DATE=月日回車換行TIME=時分回車換行NMBR=電話號碼回車換行。在OnComm事件處理程序中對讀入信息進行截取,截取電話號碼后,以該電話號碼為關(guān)鍵字,査詢并顯示數(shù)據(jù)庫中有關(guān)信息。主要方法與事件代碼通用聲明部分ConstDEBFLG=1PublicCOMXZBEEPNO,HANGUP,PNLOCAsIntegerPublicCOMBUF,COMLINAsStringPrivateSub

28、Form_Load()檢測串行口DimI,CAsIntegerCOMX=0COMBUF=COMLIN=BEEPNO=0HANGUP=0正常運行程序,關(guān)閉右側(cè)Text5IfDEBFLG=0ThenForml.Width=Forml.WidthText5.WidthText5.Enabled=FalseText5.Visible=FalseEndIfOnErrorGoToERROR_FORM_LOAD檢測可用串口ForC=1To4IfMSComml.PortOpenThenMSComml.PortOpen=FalseMSComml.CommPort=CIfNotMSComml.PortOpenTh

29、enMSComml.PortOpen=TrueIfMSComml.PortOpenThenMSComml.PortOpen=FalseIfCOMX=0ThenCOMX=CFORM_LOAD_1:NextCIfCOMX=0ThenEndOnErrorGoTo0Optionl(COMX一l).Value=TrueExitSubERROR_FORM_LOAD:Optionl(C1).Enabled=FalseResumeFORM_LOAD_1EndSub選擇串行口PrivateSubOptionl_Click(IndexAsInteger)COMX=Index+1CallINIT_MODEMEndS

30、ub初試化ModemPrivateSubINIT_MODEM()IfMSComml.PortOpenThenMSComml.PortOpen=FalseMSComml.CommPort=COMXIfNotMSComml.PortOpenThenMSComml.PortOpen=TrueMSComml.Output=AT#CID=1+vbCr檢査Modem命令是否完成CallCHKMODEMMSComml.Output=、ATS0=0+vbCrEndSub檢査Modem命令是否完成PrivateSubCHK_MODEM()DimTAsSingleDimLAsIntegerT=TimerDoCOMBUF=COMBUF+MSComml.InputL=InStr(lzCOMBUF,、OK)LoopUntilL0OrTimerT1IfL=0ThenLinel.Visible=TrueLine2.Visible=TrueForml.ShowMsgBoxMODEM未聯(lián)機z;vbOKOnly+v

溫馨提示

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

評論

0/150

提交評論