MSComm 控件為應用程序提供了串口通信功能,該應用程序允許通過串口發(fā)送和接收數(shù)據(jù)。 語法 MSComm 說明 MSComm控件提供了兩種處理通信的方法: · 事件驅(qū)動通信,是一種功能很強的處理串口活動的方法。在大多數(shù)情況下,用戶需要獲知事件發(fā)生的時間, 例如,在CD(Carrier Detect)線或RTS(Request To Send)線上有字符到達或發(fā)生了改變等。在這種情況下 ,使用MSComm 控件的OnComm 事件捕獲和處理這些通信事件。OnComm也可以捕獲和處理通信中的錯誤。要獲取 所有事件和通信錯誤的完整清單,請參閱CommEvent屬性。 · 用戶也可以在每個重要的程序功能之后檢查CommEvent 屬性的值來檢測事件和通信錯誤。這對小的自含程序 可能比較常用。例如,如果編寫一個簡單的電話撥號程序,那么在接收了每個字符后都產(chǎn)生一個事件并沒有 意義,因為你只打算從調(diào)制解調(diào)器中接收OK響應信息。 使用的每個MSComm 控件都與一個串口對應。如果在應用程序中需要訪問多個串口,必須使用多個MSComm 控件 。可以在Windows 控制面板中修改串口地址的中斷地址。 雖然MSComm控件有許多很重要的屬性,但應先熟悉下面幾個屬性: 屬性描述 CommPort 設置或返回通信端口號 Settings 以字符串的形式設置或返回波特率、奇偶校驗、數(shù)據(jù)位和停止位 PortOpen 設置或返回通信端口的狀態(tài)。也可以打開和關閉端口 Input 返回和刪除接收緩沖區(qū)中的字符 Output 將字符串寫入發(fā)送緩沖區(qū) 示例 下面的例子演示了使用調(diào)制解調(diào)器進行基本的通信。 Private Sub Form_Load () Buffer to hold input string Dim Instring As String Use COM1. MSComm1.CommPort = 1 9600 baud no parity 8 data and 1 stop bit. MSComm1.Settings = "9600N81" Tell the control to read entire buffer when Input is used. MSComm1.InputLen = 0 Open the port. MSComm1.PortOpen = True Send the attention command to the modem. MSComm1.Output = "ATVtQ0"& + Chr$(13) Ensure that the modem responds with “OK” Wait for data to come back to the serial port. Do DoEvents Buffer$ = Buffer$ MSComm1.Input Loop Until InStr (Buffer$ “OK” & vbCRLF) Read the "OK" response data in the serial port. Close the serial port. MSComm1.PortOpen = False End Sub 注意:MSComm 控件可以使用查詢或事件驅(qū)動的方法從串口接收數(shù)據(jù)。本例使用了查詢的方法。對于事件驅(qū)動方 法的例子,請參閱OnComm 事件的幫助。 Break屬性 設置或清除斷開信號狀態(tài)。在設計時該屬性不可用。 語法 object.Break [=value] Break屬性的語法有如下幾個部分: 部分描述 object 對象表達式,其值是“應用于”列表中的一個對象 value 一個布爾表達式,指明是否設置斷開信號狀態(tài),如“設置”中所示 設置 vlaue 值的設置如下: 設置描述 True 設置斷開信號狀態(tài) False 清除斷開信號狀態(tài) 說明 當設置為True 時,Break 屬性就發(fā)送一個斷開信號。斷開信號將停止字符發(fā)送,將發(fā)送線置為斷開狀態(tài),直到 將Break屬性置為False。 通常,為短時間區(qū)以及只有當用于通信的設備需要設置斷開狀態(tài)時才設置斷開狀態(tài)。 數(shù)據(jù)類型 Boolean。 示例 下面的例子演示了如何發(fā)送十分之一秒的斷開信號。 Set the Break condition. MSComm1.Break = True Set duration to 1/10 second. Duration! = Timer + .1 Wait for the duration to pass. Do Until Timer Duration! Dummy = DoEvents() Loop Clear the Break condition. MSComm1.Break = False CDHolding屬性 通過檢查CD 線的狀態(tài)來查詢是否有載波。CD(Carrier Detect,載波檢測)是調(diào)制解調(diào)器發(fā)送給連接計算機的 指示調(diào)制解調(diào)器在線的信號。該屬性在設計時不可用,在運行時是只讀的。 語法 object.CDHolding CDHolding屬性的語法有如下幾個部分: 部分描述 object 對象表達式,其值是“應用于”列表中的一個對象 設置 CDHolding屬性的設置如下: 設置描述 True CD線高 False CD線低 說明 當CD線高(CDHolding = True)并超時,MSComm控件就將CommEvent屬性設置為commEventCDTO(Carrier Detect Timeout Error),并產(chǎn)生一個OnComm事件。CD也稱為RLSD(Receive Line Singal Detect,接收線信 號檢測)。 注意:尤其要注意的是,在主機應用程序比如電子公告板中要偵測載波信號的丟失問題,因為呼叫者隨時都有 可能掛起。 數(shù)據(jù)類型: Boolean。 CommEvent 屬性 返回最近的通信事件或錯誤。該屬性在設計時不可用,在運行時是只讀的。 語法 object.CommEvent CommEvent屬性的語法有如下幾個部分: 部分描述 object 對象表達式,其值是“應用于”列表中的一個對象 說明 盡管通信事件或錯誤都產(chǎn)生OnComm 事件,但CommEvent 屬性中包含了事件或錯誤的代碼。要確定導致OnComm 事件的實際錯誤或事件,必須引用CommEvent屬性。 CommEvent 屬性為通信事件或錯誤返回下列值之一。在該控件的對象庫中也可以找到這些常量。 通信錯誤包含了下面的設置: 常量值描述 ComEventBreak 1001 收到了斷開信號 ComEventCTST O 1002 Clear To Send Timeout。在發(fā)送字符時,在系統(tǒng)指定的事件內(nèi),CTS(Clear To Send)線是低電平 ComEventDSRT O 1003 Data Set Ready Timeout。在發(fā)送字符時,在系統(tǒng)指定的事件內(nèi),DSR(Data Set Ready)線是低電平 ComEventFrame 1004 數(shù)據(jù)幀錯誤。硬件檢測到一個數(shù)據(jù)幀錯誤 ComEventOverru n 1006 端口溢出。硬件中的字符尚未讀,下一個字符又到達, 并且丟失 ComEventCDTO 1007 Carrier Detect Time。在發(fā)送字符時,在系統(tǒng)指定的事件內(nèi),CD(Carrier Detect)線是 低電平。CD也稱為RLSD(Receive Line Singal Detect,接收線信號檢測) ComEventRxOve r 1008 接收緩沖區(qū)溢出。在接收緩沖區(qū)中沒有空間 ComEventRxPari ty 1009 奇偶校驗錯。硬件檢測到奇偶校驗錯誤 續(xù)表 ComEventTxFull 1010 發(fā)送緩沖區(qū)滿。在對發(fā)送字符排隊時,發(fā)送緩沖區(qū)滿ComEventDCB 1011 檢取端口DCB( Device Control Blick)時發(fā)生了沒有預料到的錯誤 通信事件包含了下面的設置: 常量值描述 ComEvSend 1 發(fā)送緩沖區(qū)中的字符數(shù)比Sthreshold值低 ComEvRecei ve 2 接收到了Rthreshold 個字符。持續(xù)產(chǎn)生該事件,直到使用了Input屬性刪除了接收緩沖區(qū)中的數(shù)據(jù) ComEvCTS 3 CTS(Clear To Send)線改變 ComEvDSR 4 DSR(Data Set Ready)線改變。當DSR 從1 到0 改變時,該事件發(fā)生 ComEvCD 5 CD(Carrier Detect)線改變 ComEvRing 6 檢測到響鈴信號。一些URAT(Universal Asynchronous Reciver-Transmitters通用異步收發(fā)器)不支持該事件 ComEvEOF 7 收到了EOF字符(ASCII字符26) 數(shù)據(jù)類型 Integer。 CommID屬性 返回標識通信設備的句柄。該屬性在設計時不可用,在運行時是只讀的。 語法 object.CommID CommID屬性的語法有如下幾個部分: 部分描述 object 對象表達式,其值是“應用于”列表中的一個對象 說明 該值與Windows API 函數(shù)CreateFile 返回值是一樣的。在Windows API 中調(diào)用任何通信例程都使用該值。 數(shù)據(jù)類型 Long CommPort屬性 返回或設置通信端口號。 語法 object.CommPort [=value] CommPort屬性的語法有如下幾個部分: 部分描述 object 對象表達式,其值是“應用于”列表中的一個對象 value 指定端口號的整數(shù) 說明 在設計時,可以將value 置為1 到16 之間的整數(shù)(缺省為1)。然而,當試圖使用PortOpen 屬性打開一個不存 在的端口號時,MSComm 控件就產(chǎn)生68 錯誤(Device unavilable)。 警告:必須在打開端口前設置CommPort屬性。 數(shù)據(jù)類型 Integer。 CTSHolding屬性 檢查CTS(Clear To Send)線的狀態(tài),確定是否可以發(fā)送數(shù)據(jù)。通常,調(diào)制解調(diào)器給連接的計算機發(fā)送CTS 信 號,指明正在處理發(fā)送過程。該屬性在設計時不可用,在運行時是只讀的。 語法 object.CTSHolding CTSHolding屬性的語法有如下幾個部分: 部分描述 object 對象表達式,其值是“應用于”列表中的一個對象 CTSHolding屬性的設置如下表所示: 設置描述 True CTS(Clear To Send)線高 False CTS(Clear To Send)線低 說明 當CTS線低(CTSHolding = False)并超時,MSComm控件就設置CommEvent 屬性為comEventCTSTO(Clear To Send Timout)并激活OnComm事件。 在RTS/CTS( Request To Send / Clear To Send)硬件握手中使用CTS線。如果需要確定CTS線的狀態(tài),可以使用 CTSHolding屬性手動查詢。 要獲取更多信息或握手協(xié)議,請參閱Handshaking屬性。 數(shù)據(jù)類型 Boolean DSRHolding屬性 確定DSR(Data Set Ready)線的狀態(tài)。通常,調(diào)制解調(diào)器給連接的計算機發(fā)送CTS信號,指明準備就緒。該屬 性在設計時不可用,在運行時是只讀的。 語法 object.DSRHolding object置換元表示一個對象表達式,其值為“應用于”列表中的一個對象。 DSRHolding屬性返回如下值: 值描述 True DSR(DataSetReady)線高 False DSR(DataSetReady)線低 說明 當DSR線高(DSRHolding = False)并超時,MSComm控件設置CommEvent 屬性為comEventDTSTO(Data Set Ready Timeout)并激活OnComm事件。 在為DTE(Data Terminal Equipment)計算機編寫DSR/DTR(Data Set Ready / Data Terminal Equipment ) |