通信控件MSComm使用詳解
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 |