摘要:本文詳細介紹了MSComm控件在串口編程中使用。
目次
MSComm控件兩種處理通訊的方式
CommPort屬性
RThreshold 屬性
CTSHolding屬性
SThreshold 屬性
CDHolding屬性
DSRHolding屬性
Settings 屬性
InputLen 屬性
EOFEnable 屬性
Handshake 常數
OnComm 常數
InputMode 常數
錯誤消息
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 線高
False Data Set Ready 線低
說明:當 Data Set Ready 線為高電平 (DSRHolding = True) 且超時時,MSComm控件設置 CommEvent屬性為 comEventDSRTO(數據准備超時)並產生 OnComm 事件。
當為 Data Terminal Equipment (DTE) 機器寫 Data Set Ready/Data Terminal Ready 握手例程時該屬性是十分有用的。
數據類型:Boolean
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控件讀取接收緩沖區中全部.