深入了解Mscomm控件
Mscomm控件通過串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通訊功能。Mscomm控件在串口編程時(shí)非常方便,程序員不必去花時(shí)間去了解較為復(fù)雜的API函數(shù),而且在VC、VB、Delphi等語言中均可使用。 Microsoft Communications Control(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法。具體的來說,它提供了兩種處理通信問題的方法:一是事件驅(qū)動(dòng)(Event-driven)方法,一是查詢法。
1.Mscomm控件兩種處理通訊的方式
Mscomm控件提供下列兩種處理通訊的方式:事件驅(qū)動(dòng)方式和查詢方式。
1.1 事件驅(qū)動(dòng)方式
事件驅(qū)動(dòng)通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時(shí)需要得到通知,例如,在串口接收緩沖區(qū)中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個(gè)字符到達(dá)或一個(gè)變化發(fā)生時(shí)。在這些情況下,可以利用 MSComm 控件的 OnComm 事件捕獲并處理這些通訊事件。OnComm 事件還可以檢查和處理通訊錯(cuò)誤。所有通訊事件和通訊錯(cuò)誤的列表,參閱 CommEvent 屬性。在編程過程中,就可以在OnComm事件處理函數(shù)中加入自己的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。每個(gè)MSComm 控件對(duì)應(yīng)著一個(gè)串行端口。如果應(yīng)用程序需要訪問多個(gè)串行端口,必須使用多個(gè) MSComm 控件。
1.2 查詢方式
查詢方式實(shí)質(zhì)上還是事件驅(qū)動(dòng),但在有些情況下,這種方式顯得更為便捷。在程序的每個(gè)關(guān)鍵功能之后,可以通過檢查 CommEvent 屬性的值來查詢事件和錯(cuò)誤。如果應(yīng)用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個(gè)簡單的電話撥號(hào)程序,則沒有必要對(duì)每接收一個(gè)字符都產(chǎn)生事件,因?yàn)槲ㄒ坏却邮盏淖址钦{(diào)制解調(diào)器的“確定”響應(yīng)。
2.Mscomm控件的常用屬性
Mscomm控件件有很多重要的屬性,但首先必須熟悉幾個(gè)屬性。
CommPort 設(shè)置并返回通訊端口號(hào)。
Settings 以字符串的形式設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位。
PortOpen 設(shè)置并返回通訊端口的狀態(tài)。也可以打開和關(guān)閉端口。
Input 從接收緩沖區(qū)返回和刪除字符。
Output 向傳輸緩沖區(qū)寫一個(gè)字符串。
下面分別描述:
CommPort屬性 設(shè)置并返回通訊端口號(hào)。
語法:object.CommPort[value ] (value 一整型值,說明端口號(hào)。)
說明:在設(shè)計(jì)時(shí),value 可以設(shè)置成從 1 到 16 的任何數(shù)(缺省值為 1)。但是如果用 PortOpen 屬性打開一個(gè)并不存在的端口時(shí),MSComm 控件會(huì)產(chǎn)生錯(cuò)誤 68(設(shè)備無效)。
注意:必須在打開端口之前設(shè)置 CommPort 屬性。
RThreshold 屬性:在 MSComm 控件設(shè)置 CommEvent 屬性為 comEvReceive 并產(chǎn)生 OnComm 之前,設(shè)置并返回的要接收的字符數(shù)。
語法:object.Rthreshold [ = value ](value 整型表達(dá)式,說明在產(chǎn)生 OnComm 事件之前要接收的字符數(shù)。 )
說明:當(dāng)接收字符后,若 Rthreshold 屬性設(shè)置為 0(缺省值)則不產(chǎn)生 OnComm 事件。例如,設(shè)置 Rthreshold 為 1,接收緩沖區(qū)收到每一個(gè)字符都會(huì)使 Mscomm控件產(chǎn)生 OnComm 事件。
CTSHolding 屬性:確定是否可通過查詢 Clear To Send (CTS) 線的狀態(tài)發(fā)送數(shù)據(jù)。Clear To Send 是調(diào)制解調(diào)器發(fā)送到相聯(lián)計(jì)算機(jī)的信號(hào),指示傳輸可以進(jìn)行。該屬性在設(shè)計(jì)時(shí)無效,在運(yùn)行時(shí)為只讀。
語法: object.CTSHolding(Boolean)
Mscomm 控件的 CTSHolding 屬性設(shè)置值:
- True Clear To Send 線為高電平。
- False Clear To Send 線為低電平。
說明:如果 Clear To Send 線為低電平 (CTSHolding = False) 并且超時(shí)時(shí),MSComm 控件設(shè)置 CommEvent 屬性為 comEventCTSTO (Clear To Send Timeout) 并產(chǎn)生 OnComm 事件。
Clear To Send 線用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要確定 Clear To Send 線的狀態(tài),CTSHolding 屬性給出一種手工查詢的方法。
詳細(xì)信息 有關(guān)握手協(xié)議,請(qǐng)參閱 Handshaking 屬性。
SThreshold 屬性: MSComm 控件設(shè)置 CommEvent 屬性為 comEvSend 并產(chǎn)生 OnComm 事件之前,設(shè)置并返回傳輸緩沖區(qū)中允許的最小字符數(shù)。
語法:object.SThreshold [ = value ]
value 整形表達(dá)式,代表在 OnComm 事件產(chǎn)生之前在傳輸緩沖區(qū)中的最小字符數(shù)。
說明:若設(shè)置 Sthreshold 屬性為 0(缺省值),數(shù)據(jù)傳輸事件不會(huì)產(chǎn)生 OnComm 事件。若設(shè)置 Sthreshold 屬性為 1,當(dāng)傳輸緩沖區(qū)完全空時(shí),MSComm 控件產(chǎn)生 OnComm 事件。如果在傳輸緩沖區(qū)中的字符數(shù)小于 value,CommEvent 屬性設(shè)置為 comEvSend,并產(chǎn)生 OnComm 事件。comEvSend 事件僅當(dāng)字符數(shù)與 Sthreshold 交叉時(shí)被激活一次。例如,如果 Sthreshold 等于 5,僅當(dāng)在輸出隊(duì)列中字符數(shù)從 5 降到 4 時(shí),comEvSend 才發(fā)生。如果在輸出隊(duì)列中從沒有比 Sthreshold 多的字符,comEvSend 事件將絕不會(huì)發(fā)生。
Handshake 常數(shù)
常數(shù) 值 描述
- comNone 0 無握手。
- comXonXoff 1 XOn/Xoff 握手。
- comRTS 2 Request-to-send/clear-to-send 握手。
- comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
OnComm 常數(shù)
常數(shù) 值 描述
- comEvSend 1 發(fā)送事件。
- comEvReceive 2 接收事件。
- comEvCTS 3 clear-to-send 線變化。
- comEvDSR 4 data-set ready 線變化。
- comEvCD 5 carrier detect 線變化。
- comEvRing 6 振鈴檢測(cè)。
- comEvEOF 7 文件結(jié)束。
Error 常數(shù)
常數(shù) 值 描述
- comEventBreak 1001 接收到中斷信號(hào)
- comEventCTSTO 1002 Clear-to-send 超時(shí)
- comEventDSRTO 1003 Data-set ready 超時(shí)
- comEventFrame 1004 幀錯(cuò)誤
- comEventOverrun 1006 端口超速
- comEventCDTO 1007 Carrier detect 超時(shí)
- comEventRxOver 1008 接收緩沖區(qū)溢出
- comEventRxParity 1009 Parity 錯(cuò)誤
- comEventTxFull 1010 傳輸緩沖區(qū)滿
- comEventDCB 1011 檢索端口 設(shè)備控制塊 (DCB) 時(shí)的意外錯(cuò)誤
InputMode 常數(shù)
常數(shù) 值 描述
comInputModeText 0 (缺省)通過 Input 屬性以文本方式取回?cái)?shù)據(jù)。
comInputModeBinary 1 通過 Input 屬性以二進(jìn)制方式檢取回?cái)?shù)據(jù)。
CDHolding 屬性:通過查詢 Carrier Detect (CD) 線的狀態(tài)確定當(dāng)前是否有傳輸。Carrier Detect 是從調(diào)制解調(diào)器發(fā)送到相聯(lián)計(jì)算機(jī)的一個(gè)信號(hào),指示調(diào)制解調(diào)器正在聯(lián)機(jī)。該屬性在設(shè)計(jì)時(shí)無效,在運(yùn)行時(shí)為只讀。
語法 object.CDHolding
設(shè)置值:CDHolding 屬性的設(shè)置值為:
設(shè)置 描述
True Carrier Detect 線為高電平
False Carrier Detect 線為低電平
說明:注意當(dāng) Carrier Detect 線為高電平 (CDHolding = True) 且超時(shí)時(shí),MSComm 控件設(shè)置CommEvent 屬性為 comEventCDTO(Carrier Detect 超時(shí)錯(cuò)誤),并產(chǎn)生 OnComm 事件。
注意 在主機(jī)應(yīng)用程序中捕獲一個(gè)丟失的傳輸是特別重要的,例如一個(gè)公告板,因?yàn)楹艚姓呖梢噪S時(shí)掛起(放棄傳輸)。
Carrier Detect 也被稱為 Receive Line Signal Detect (RLSD)。
數(shù)據(jù)類型 Boolean
DSRHolding 屬性:確定 Data Set Ready (DSR) 線的狀態(tài)。Data Set Ready 信號(hào)由調(diào)制解調(diào)器發(fā)送到相連計(jì)算機(jī),指示作好操作準(zhǔn)備。該屬性在設(shè)計(jì)時(shí)無效,在運(yùn)行時(shí)為只讀。
語法:object.DSRHolding
object 所在處表示對(duì)象表達(dá)式,其值是“應(yīng)用于”列表中的對(duì)象。
DSRHolding 屬性返回以下值:
值 描述
True Data Set Ready 線高
False Data Set Ready 線低
說明:當(dāng) Data Set Ready 線為高電平 (DSRHolding = True) 且超時(shí)時(shí),MSComm 控件設(shè)置 CommEvent 屬性為 comEventDSRTO(數(shù)據(jù)準(zhǔn)備超時(shí))并產(chǎn)生 OnComm 事件。
當(dāng)為 Data Terminal Equipment (DTE) 機(jī)器寫 Data Set Ready/Data Terminal Ready 握手例程時(shí)該屬性是十分有用的。
數(shù)據(jù)類型:Boolean
Settings 屬性: 設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位參數(shù)。
語法: object.Settings[ = value]
說明:當(dāng)端口打開時(shí),如果 value 非法,則 MSComm 控件產(chǎn)生錯(cuò)誤 380(非法屬性值)。
Value 由四個(gè)設(shè)置值組成,有如下的格式:
"BBBB,P,D,S"
BBBB 為波特率,P 為奇偶校驗(yàn),D 為數(shù)據(jù)位數(shù),S 為停止位數(shù)。value 的缺省值是:
"9600,N,8,1"
InputLen 屬性:設(shè)置并返回 Input 屬性從接收緩沖區(qū)讀取的字符數(shù)。
語法 object.InputLen [ = value]
InputLen 屬性語法包括下列部分:
value 整型表達(dá)式,說明 Input 屬性從接收緩沖區(qū)中讀取的字符數(shù)。
說明:InputLen 屬性的缺省值是 0。設(shè)置 InputLen 為 0 時(shí),使用 Input 將使 MSComm 控件讀取接收緩沖區(qū)中全部的內(nèi)容。
若接收緩沖區(qū)中 InputLen 字符無效,Input 屬性返回一個(gè)零長度字符串 ("")。在使用 Input 前,用戶可以選擇檢查 InBufferCount 屬性來確定緩沖區(qū)中是否已有需要數(shù)目的字符。該屬性在從輸出格式為定長數(shù)據(jù)的機(jī)器讀取數(shù)據(jù)時(shí)非常有用。
EOFEnable 屬性:確定在輸入過程中 MSComm 控件是否尋找文件結(jié)尾 (EOF) 字符。如果找到 EOF 字符,將停止輸入并激活 OnComm 事件,此時(shí) CommEvent 屬性設(shè)置為 comEvEOF
語法:object.EOFEnable [ = value ]
EOFEnable 屬性語法包括下列部分:
value 布爾表達(dá)式,確定當(dāng)找到 EOF 字符時(shí),OnComm 事件是否被激活,如“設(shè)置值”中所描述。
value 的設(shè)置值:
True 當(dāng) EOF 字符找到時(shí) OnComm 事件被激活。
False (缺省)當(dāng) EOF 字符找到時(shí) OnComm 事件不被激活。
說明:當(dāng) EOFEnable 屬性設(shè)置為 False,OnComm 控件將不在輸入流中尋找 EOF 字符。
錯(cuò)誤消息(MS Comm 控件)
下表列出 MSComm 控件可以捕獲的錯(cuò)誤:
值 描述
- 380 無效屬性值 comInvalidPropertyValue
- 383 屬性為只讀 comSetNotSupported
- 394 屬性為只讀 comGetNotSupported
- 8000 端口打開時(shí)操作不合法 comPortOpen
- 8001 超時(shí)值必須大于 0
- 8002 無效端口號(hào) comPortInvalid
- 8003 屬性只在運(yùn)行時(shí)有效
- 8004 屬性在運(yùn)行時(shí)為只讀
- 8005 端口已經(jīng)打開 comPortAlreadyOpen
- 8006 設(shè)備標(biāo)識(shí)符無效或不支持該標(biāo)識(shí)符
- 8007 不支持設(shè)備的波特率
- 8008 指定的字節(jié)大小無效
- 8009 缺省參數(shù)錯(cuò)誤
- 8010 硬件不可用(被其它設(shè)備鎖定)
- 8011 函數(shù)不能分配隊(duì)列
- 8012 設(shè)備沒有打開 comNoOpen
- 8013 設(shè)備已經(jīng)打開
- 8014 不能使用 comm 通知
- 8015 不能設(shè)置 comm 狀態(tài) comSetCommStateFailed
- 8016 不能設(shè)置 comm 事件屏蔽
- 8018 僅當(dāng)端口打開時(shí)操作才有效 comPortNotOpen
- 8019 設(shè)備忙
- 8020 讀 comm 設(shè)備錯(cuò)誤 comReadError
- 8021 為該端口檢索設(shè)備控制塊時(shí)的內(nèi)部錯(cuò)誤 comDCBError
Mscomm控件的基本內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)Mscomm控件有所幫助。
【編輯推薦】