MSComm 控制項通過序列埠傳輸和接收資料,為應用程式提供串列通訊功能。MSComm控制項在串口編程時非常方便,程式員不必去花時間去瞭解較為複雜的API函數,而且在VC、VB、Delphi等語言中均可使用。 Microsoft Communications Control(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串列通訊編程的ActiveX控制項,它為應用程式提供了通過串列介面收發資料的簡便方法。具體的來說,它提供了兩種處理通訊問題的方法:一是事件驅動(Event-driven)方法,一是查詢法。
1.MSComm控制項兩種處理通訊的方式
MSComm控制項提供下列兩種處理通訊的方式:事件驅動方式和查詢方式。
1.1 事件驅動方式
事件驅動通訊是處理序列埠互動作用的一種非常有效方法。在許多情況下,在事件發生時需要得到通知,例如,在串口接收緩衝區中有字元,或者 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個字元到達或一個變化發生時。在這些情況下,可以利用 MSComm 控制項的 OnComm 事件捕獲並處理這些通訊事件。OnComm 事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱 CommEvent 屬性。在編程過程中,就可以在OnComm事件處理函數中加入自己的處理代碼。這種方法的優點是程式響應及時,可靠性高。每個MSComm 控制項對應著一個序列埠。如果應用程式需要訪問多個序列埠,必須使用多個 MSComm 控制項。
1.2 查詢方式
查詢方式實質上還是事件驅動,但在有些情況下,這種方式顯得更為便捷。在程式的每個關鍵功能之後,可以通過檢查 CommEvent 屬性的值來查詢事件和錯誤。如果應用程式較小,並且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程式,則沒有必要對每接收一個字元都產生事件,因為唯一等待接收的字元是數據機的“確定”響應。
2.MSComm 控制項的常用屬性
MSComm 控制項有很多重要的屬性,但首先必須熟悉幾個屬性。
| CommPort |
設定並返回通訊連接埠號碼。 |
| Settings |
以字串的形式設定並返回傳輸速率、同位、資料位元、停止位。 |
| PortOpen |
設定並返回通訊連接埠的狀態。也可以開啟和關閉連接埠。 |
| Input |
從接收緩衝區返回和刪除字元。 |
| Output |
向傳輸緩衝區寫一個字串。 |
下面分別描述:
CommPort屬性:設定並返回通訊連接埠號碼。
文法 object.CommPort[value ] (value 一整型值,說明連接埠號碼。)
說明 在設計時,value 可以設定成從 1 到 16 的任何數(預設值為 1)。但是如果用 PortOpen 屬性開啟一個並不存在的連接埠時,MSComm 控制項會產生錯誤 68(裝置無效)。
注意:必須在開啟連接埠之前設定 CommPort 屬性。
RThreshold 屬性:在 MSComm 控制項設定 CommEvent 屬性為 comEvReceive 併產生 OnComm 之前,設定並返回的要接收的字元數。
文法:object.Rthreshold [ = value ](value 整型運算式,說明在產生 OnComm 事件之前要接收的字元數。 )
說明:當接收字元後,若 Rthreshold 屬性設定為 0(預設值)則不產生 OnComm 事件。例如,設定 Rthreshold 為 1,接收緩衝區收到每一個字元都會使 MSComm 控制項產生 OnComm 事件。
CTSHolding 屬性:確定是否可通過查詢 Clear To Send (CTS) 線的狀態發送資料。Clear To Send 是數據機發送到相聯電腦的訊號,指示傳輸可以進行。該屬性在設計時無效,在運行時為唯讀。
文法: object.CTSHolding(Boolean)
Mscomm 控制項的 CTSHolding 屬性設定值:
True Clear To Send 線為高電平。
False Clear To Send 線為低電平。
說明:如果 Clear To Send 線為低電平 (CTSHolding = False) 並且逾時時,MSComm 控制項設定 CommEvent 屬性為 comEventCTSTO (Clear To Send Timeout) 併產生 OnComm 事件。
Clear To Send 線用於 RTS/CTS (Request To Send/Clear To Send) 硬體握手。如果需要確定 Clear To Send 線的狀態,CTSHolding 屬性給出一種手工查詢的方法。
詳細資料 有關握手協議,請參閱 Handshaking 屬性。
SThreshold 屬性: MSComm 控制項設定 CommEvent 屬性為 comEvSend 併產生 OnComm 事件之前,設定並返回傳輸緩衝區中允許的最小字元數。
文法 object.SThreshold [ = value ]
value 整形運算式,代表在 OnComm 事件產生之前在傳輸緩衝區中的最小字元數。
說明:若設定 Sthreshold 屬性為 0(預設值),資料轉送事件不會產生 OnComm 事件。若設定 Sthreshold 屬性為 1,當傳輸緩衝區完全空時,MSComm 控制項產生 OnComm 事件。如果在傳輸緩衝區中的字元數小於 value,CommEvent 屬性設定為 comEvSend,併產生 OnComm 事件。comEvSend 事件僅當字元數與 Sthreshold 交叉時被啟用一次。例如,如果 Sthreshold 等於 5,僅當在輸出隊列中字元數從 5 降到 4 時,comEvSend 才發生。如果在輸出隊列中從沒有比 Sthreshold 多的字元,comEvSend 事件將絕不會發生。
Handshake 常數
| 常數 |
值 |
描述 |
| comNone |
0 |
無握手。 |
| comXonXoff |
1 |
XOn/Xoff 握手。 |
| comRTS |
2 |
Request-to-send/clear-to-send 握手。 |
| comRTSXOnXOff |
3 |
Request-to-send 和 clear-to-send 握手皆可。 |
OnComm 常數
| 常數 |
值 |
描述 |
| comEvSend |
1 |
發送事件。 |
| comEvReceive |
2 |
接收事件。 |
| comEvCTS |
3 |
clear-to-send 線變化。 |
| comEvDSR |
4 |
data-set ready 線變化。 |
| comEvCD |
5 |
carrier detect 線變化。 |
| comEvRing |
6 |
響鈴檢測。 |
| comEvEOF |
7 |
檔案結束。 |
Error 常數
| 常數 |
值 |
描述 |
| comEventBreak |
1001 |
接收到中斷訊號 |
| comEventCTSTO |
1002 |
Clear-to-send 逾時 |
| comEventDSRTO |
1003 |
Data-set ready 逾時 |
| comEventFrame |
1004 |
幀錯誤 |
| comEventOverrun |
1006 |
連接埠超速 |
| comEventCDTO |
1007 |
Carrier detect 逾時 |
| comEventRxOver |
1008 |
接收緩衝區溢位 |
| comEventRxParity |
1009 |
Parity 錯誤 |
| comEventTxFull |
1010 |
傳輸緩衝區滿 |
| comEventDCB |
1011 |
檢索連接埠 裝置控制塊 (DCB) 時的意外錯誤 |
InputMode 常數
| 常數 |
值 |
描述 |
| comInputModeText |
0 (預設) |
通過 Input 屬性以文本方式取回資料。 |
| comInputModeBinary |
1 |
通過 Input 屬性以二進位方式檢取回資料。 |
CDHolding 屬性:通過查詢 Carrier Detect (CD) 線的狀態確定當前是否有傳輸。Carrier Detect 是從數據機發送到相聯電腦的一個訊號,指示數據機正在聯機。該屬性在設計時無效,在運行時為唯讀。
文法 object.CDHolding
設定值:CDHolding 屬性的設定值為:
| 設定 |
描述 |
| True |
Carrier Detect 線為高電平 |
| False |
Carrier Detect 線為低電平 |
說明:注意當 Carrier Detect 線為高電平 (CDHolding = True) 且逾時時,MSComm 控制項設定CommEvent 屬性為 comEventCDTO(Carrier Detect 逾時錯誤),併產生 OnComm 事件。
注意 在主應用程式中捕獲一個丟失的傳輸是特別重要的,例如一個公告板,因為呼叫者可以隨時掛起(放棄傳輸)。
Carrier Detect 也被稱為 Receive Line Signal Detect (RLSD)。
資料類型:Boolean
DSRHolding 屬性:確定 Data Set Ready (DSR) 線的狀態。Data Set Ready 訊號由數據機發送到相連電腦,指示作好操作準備。該屬性在設計時無效,在運行時為唯讀。
文法:object.DSRHolding
object 所在處表示對象運算式,其值是“應用於”列表中的對象。
DSRHolding 屬性返回以下值:
| 值 |
描述 |
說明 |
| True |
Data Set Ready 線高 |
當 Data Set Ready 線為高電平 (DSRHolding = True) 且逾時時,MSComm 控制項設定 CommEvent 屬性為 comEventDSRTO(資料準備逾時)併產生 OnComm 事件。 當為 Data Terminal Equipment (DTE) 機器寫 Data Set Ready/Data Terminal Ready 握手常式時該屬性是十分有用的。 資料類型:Boolean |
| False |
Data Set Ready 線低 |
Settings 屬性: 設定並返回傳輸速率、同位、資料位元、停止位參數。
文法: object.Settings[ = value]
說明:當連接埠開啟時,如果 value 非法,則 MSComm 控制項產生錯誤 380(非法屬性值)。
Value 由四個設定值組成,有如下的格式:
"BBBB,P,D,S"
BBBB 為傳輸速率,P 為同位,D 為資料位元數,S 為停止位元。value 的預設值是:
"9600,N,8,1"
InputLen 屬性:設定並返回 Input 屬性從接收緩衝區讀取的字元數。
文法 object.InputLen [ = value]
InputLen 屬性文法包括下列部分:
value 整型運算式,說明 Input 屬性從接收緩衝區中讀取的字元數。
說明:InputLen 屬性的預設值是 0。設定 InputLen 為 0 時,使用 Input 將使 MSComm 控制項讀取接收緩衝區中全部的內容。
若接收緩衝區中 InputLen 字元無效,Input 屬性返回一個零長度字串 ("")。在使用 Input 前,使用者可以選擇檢查 InBufferCount 屬性來確定緩衝區中是否已有需要數目的字元。該屬性在從輸出格式為定長資料的機器讀取資料時非常有用。
EOFEnable 屬性:確定在輸入過程中 MSComm 控制項是否尋找檔案結尾 (EOF) 字元。如果找到 EOF 字元,將停止輸入並啟用 OnComm 事件,此時 CommEvent 屬性設定為 comEvEOF,
文法:object.EOFEnable [ = value ]
EOFEnable 屬性文法包括下列部分:
value 布林運算式,確定當找到 EOF 字元時,OnComm 事件是否被啟用,如“設定值”中所描述。
value 的設定值:
True 當 EOF 字元找到時 OnComm 事件被啟用。
False (預設)當 EOF 字元找到時 OnComm 事件不被啟用。
說明:當 EOFEnable 屬性設定為 False,OnComm 控制項將不在輸入資料流中尋找 EOF 字元。
3.錯誤訊息(MS Comm 控制項)
下表列出 MSComm 控制項可以捕獲的錯誤:
| 值 |
描述 |
| 380 |
無效屬性值 comInvalidPropertyValue |
| 383 |
屬性為唯讀 comSetNotSupported |
| 394 |
屬性為唯讀 comGetNotSupported |
| 8000 |
連接埠開啟時操作不合法 comPortOpen |
| 8001 |
逾時值必須大於 0 |
| 8002 |
無效連接埠號碼 comPortInvalid |
| 8003 |
屬性只在運行時有效 |
| 8004 |
屬性在運行時為唯讀 |
| 8005 |
連接埠已經開啟 comPortAlreadyOpen |
| 8006 |
裝置標識符無效或不支援該標識符 |
| 8007 |
不支援裝置的傳輸速率 |
| 8008 |
指定的位元組大小無效 |
| 8009 |
預設參數錯誤 |
| 8010 |
硬體不可用(被其它鎖定裝置) |
| 8011 |
函數不能分配隊列 |
| 8012 |
裝置沒有開啟 comNoOpen |
| 8013 |
裝置已經開啟 |
| 8014 |
不能使用 comm 通知 |
| 8015 |
不能設定 comm 狀態 comSetCommStateFailed |
| 8016 |
不能設定 comm 事件屏蔽 |
| 8018 |
僅當連接埠開啟時操作才有效 comPortNotOpen |
| 8019 |
裝置忙 |
| 8020 |
讀 comm 裝置錯誤 comReadError |
| 8021 |
為該連接埠檢索裝置控制塊時的內部錯誤 comDCBError |