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 屬性。在編程過(guò)程中,就可以在OnComm事件處理函數(shù)中加入自己的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。每個(gè)MSComm 控件對(duì)應(yīng)著一個(gè)串行端口。如果應(yīng)用程序需要訪問(wèn)多個(gè)串行端口,必須使用多個(gè) MSComm 控件。
1.2 查詢方式
查詢方式實(shí)質(zhì)上還是事件驅(qū)動(dòng),但在有些情況下,這種方式顯得更為便捷。在程序的每個(gè)關(guān)鍵功能之后,可以通過(guò)檢查 CommEvent 屬性的值來(lái)查詢事件和錯(cuò)誤。如果應(yīng)用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個(gè)簡(jiǎn)單的電話撥號(hào)程序,則沒(méi)有必要對(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)。
語(yǔ)法 object.CommPort[value ] (value 一整型值,說(shuō)明端口號(hào)。)
說(shuō)明 在設(shè)計(jì)時(shí),value 可以設(shè)置成從 1 到 16 的任何數(shù)(缺省值為 1)。但是如果用 PortOpen 屬性打開一個(gè)并不存在的端口時(shí),MSComm 控件會(huì)產(chǎn)生錯(cuò)誤 68(設(shè)備無(wú)效)。
注意:必須在打開端口之前設(shè)置 CommPort 屬性。
RThreshold 屬性:在 MSComm 控件設(shè)置 CommEvent 屬性為 comEvReceive 并產(chǎn)生 OnComm 之前,設(shè)置并返回的要接收的字符數(shù)。
語(yǔ)法:object.Rthreshold [ = value ](value 整型表達(dá)式,說(shuō)明在產(chǎn)生 OnComm 事件之前要接收的字符數(shù)。 )
說(shuō)明:當(dāng)接收字符后,若 Rthreshold 屬性設(shè)置為 0(缺省值)則不產(chǎn)生 OnComm 事件。例如,設(shè)置 Rthreshold 為 1,接收緩沖區(qū)收到每一個(gè)字符都會(huì)使 MSComm 控件產(chǎn)生 OnComm 事件。
CTSHolding 屬性:確定是否可通過(guò)查詢 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í)無(wú)效,在運(yùn)行時(shí)為只讀。
語(yǔ)法: object.CTSHolding(Boolean)
Mscomm 控件的 CTSHolding 屬性設(shè)置值:
True Clear To Send 線為高電平。
False Clear To Send 線為低電平。
說(shuō)明:如果 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ù)。
語(yǔ)法 object.SThreshold [ = value ]
value 整形表達(dá)式,代表在 OnComm 事件產(chǎn)生之前在傳輸緩沖區(qū)中的最小字符數(shù)。
說(shuō)明:若設(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ì)列中從沒(méi)有比 Sthreshold 多的字符,comEvSend 事件將絕不會(huì)發(fā)生?!andshake 常數(shù) 常數(shù) 值 描述
comNone 0 無(wú)握手。
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è)。
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 (缺?。?通過(guò) Input 屬性以文本方式取回?cái)?shù)據(jù)。
comInputModeBinary 1 通過(guò) Input 屬性以二進(jìn)制方式檢取回?cái)?shù)據(jù)。
CDHolding 屬性:通過(guò)查詢 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í)無(wú)效,在運(yùn)行時(shí)為只讀。
語(yǔ)法 object.CDHolding
設(shè)置值:CDHolding 屬性的設(shè)置值為: 設(shè)置 描述
True Carrier Detect 線為高電平
False Carrier Detect 線為低電平
說(shuō)明:注意當(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í)掛起(放棄傳輸)。
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 屬性。在編程過(guò)程中,就可以在OnComm事件處理函數(shù)中加入自己的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。每個(gè)MSComm 控件對(duì)應(yīng)著一個(gè)串行端口。如果應(yīng)用程序需要訪問(wèn)多個(gè)串行端口,必須使用多個(gè) MSComm 控件。
1.2 查詢方式
查詢方式實(shí)質(zhì)上還是事件驅(qū)動(dòng),但在有些情況下,這種方式顯得更為便捷。在程序的每個(gè)關(guān)鍵功能之后,可以通過(guò)檢查 CommEvent 屬性的值來(lái)查詢事件和錯(cuò)誤。如果應(yīng)用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個(gè)簡(jiǎn)單的電話撥號(hào)程序,則沒(méi)有必要對(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)。
語(yǔ)法 object.CommPort[value ] (value 一整型值,說(shuō)明端口號(hào)。)
說(shuō)明 在設(shè)計(jì)時(shí),value 可以設(shè)置成從 1 到 16 的任何數(shù)(缺省值為 1)。但是如果用 PortOpen 屬性打開一個(gè)并不存在的端口時(shí),MSComm 控件會(huì)產(chǎn)生錯(cuò)誤 68(設(shè)備無(wú)效)。
注意:必須在打開端口之前設(shè)置 CommPort 屬性。
RThreshold 屬性:在 MSComm 控件設(shè)置 CommEvent 屬性為 comEvReceive 并產(chǎn)生 OnComm 之前,設(shè)置并返回的要接收的字符數(shù)。
語(yǔ)法:object.Rthreshold [ = value ](value 整型表達(dá)式,說(shuō)明在產(chǎn)生 OnComm 事件之前要接收的字符數(shù)。 )
說(shuō)明:當(dāng)接收字符后,若 Rthreshold 屬性設(shè)置為 0(缺省值)則不產(chǎn)生 OnComm 事件。例如,設(shè)置 Rthreshold 為 1,接收緩沖區(qū)收到每一個(gè)字符都會(huì)使 MSComm 控件產(chǎn)生 OnComm 事件。
CTSHolding 屬性:確定是否可通過(guò)查詢 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í)無(wú)效,在運(yùn)行時(shí)為只讀。
語(yǔ)法: object.CTSHolding(Boolean)
Mscomm 控件的 CTSHolding 屬性設(shè)置值:
True Clear To Send 線為高電平。
False Clear To Send 線為低電平。
說(shuō)明:如果 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ù)。
語(yǔ)法 object.SThreshold [ = value ]
value 整形表達(dá)式,代表在 OnComm 事件產(chǎn)生之前在傳輸緩沖區(qū)中的最小字符數(shù)。
說(shuō)明:若設(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ì)列中從沒(méi)有比 Sthreshold 多的字符,comEvSend 事件將絕不會(huì)發(fā)生?!andshake 常數(shù) 常數(shù) 值 描述
comNone 0 無(wú)握手。
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è)。
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 (缺?。?通過(guò) Input 屬性以文本方式取回?cái)?shù)據(jù)。
comInputModeBinary 1 通過(guò) Input 屬性以二進(jìn)制方式檢取回?cái)?shù)據(jù)。
CDHolding 屬性:通過(guò)查詢 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í)無(wú)效,在運(yùn)行時(shí)為只讀。
語(yǔ)法 object.CDHolding
設(shè)置值:CDHolding 屬性的設(shè)置值為: 設(shè)置 描述
True Carrier Detect 線為高電平
False Carrier Detect 線為低電平
說(shuō)明:注意當(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í)掛起(放棄傳輸)。