vb 串口通訊

MSComm控件提供了兩種處理通信的方式:一種爲事件驅動方式,該方式相當於一般程序設計中的中斷方式。當串口發生事件或錯誤時,MSComm控件會產生OnComm事件,用戶程序可以捕獲該事件進行相應處理。本文的兩個例子均採用該方式。另一種爲查詢方式,在用戶程序中設計定時或不定時查詢 MSComm控件的某些屬性是否發生變化,從而確定相應處理。在程序空閒時間較多時可以採用該方式。
常用屬性和方法
利用MSComm控件實現計算機通信的關鍵是理解並正確設置MSComm控件衆多屬性和方法。以下是MSComm控件的常用屬性和方法:
●Commport:設置或返回串口號。
●Settings:以字符串的形式設置或返回串口通信參數。
●Portopen:設置或返回串口狀態。
●InputMode:設置或返回接收數據的類型。
●Inputlen:設置或返回一次從接收緩衝區中讀取字節數。
●InBufferSize:設置或返回接收緩衝區的大小,缺省值爲1024字節。
●InBufferCount:設置或返回接收緩衝區中等待計算機接收的字符數。
●Input:從接收緩衝區中讀取數據並清空該緩衝區,該屬性設計時無效,運行時只讀。
●OutBufferSize:設置或返回發送緩衝區的大小,缺省值爲512字節。
●OutBufferCount:設置或返回發送緩衝區中等待計算機發送的字符數。
●Output:向發送緩衝區發送數據,該屬性設計時無效,運行時只讀。
●Rthreshold:該屬性爲一閥值。當接收緩衝區中字符數達到該值時,MSComm控件設置Commevent屬性爲ComEvReceive,併產生OnComm事件。用戶可在OnComm事件處理程序中進行相應處理。若Rthreshold屬性設置爲0,則不產生OnComm事件。例如用戶希望接收緩衝區中達到一個字符就接收一個字符,可將Rthreshold設置爲1。這樣接收緩衝區中接收到一個字符,就產生一次OnComm事件。
●Sthreshold:該屬性亦爲一閥值。當發送緩衝區中字符數小於該值時,MSComm控件設置Commevent屬性爲ComEvSend,併產生 OnComm事件。若Sthreshold屬性設置爲0,則不產生OnComm事件。要特別注意的是僅當發送緩衝區中字符數小於該值的瞬間才產生 OnComm事件,其後就不再產生OnComm事件。例如Sthreshold設置爲3,僅當發送緩衝區中字符數從3降爲2時,MSComm控件設置 Commevent屬性爲ComEvSend,同時產生OnComm事件,如發送緩衝區中字符始終爲2,則不會再產生OnComm事件。這就避免了發送緩衝區中數據未發送完就反覆發生OnComm事件。
●CommEvent:這是一個非常重要的屬性。該屬性設計時無效,運行時只讀。一旦串口發生通信事件或產生錯誤,依據產生的事件和錯誤,MSComm控件爲CommEvent屬性賦不同的代碼,同時產生OnComm事件。用戶程序就可在OnComm事件處理程序中針對不同的代碼,進行相應的處理。 CommEvent屬性的代碼、常數及含義參見表1及表2。
表1 CommEvent通信事件 代碼 常數 含義
1 ComEvReceive 接受到Rthreshold個字符。該事件將持續產生,直到用Input屬性從接受緩衝區中讀取並刪除字符。
2 ComEvSend 發送緩衝區中數據少於Sthreshold個,說明串口已經發送了一些數據,程序可以用Output屬性繼續發送數據。
3 ComEvCTS Clear To Send信號線狀態發生變化。
4 ComEvDSR Data Set Ready信號線狀態從1變到0。
5 ComEvCD Carrier Detect信號線狀態發生變化。
6 ComEvRing 檢測到振鈴信號。
7 ComEvEOF 接受到文件結束符。


表2 CommEvent通信錯誤 代碼 常數 含義
1001 ComEvntBreak 接受到一箇中斷信號。
1002 ComEvntCTSTO Clear To Send信號超時。
1003 ComEvntDSRTO Data Set Ready信號超時。
1004 ComEvntFrame 幀錯誤。
1006 ComEvntOverrun 串口超速。
1007 ComEvntCDTO 載波檢測超時。
1008 ComEvntRxOver 接受緩衝區溢出,緩衝區中已沒有空間。
1009 ComEvntRxParity 奇偶校驗錯。
1010 ComEvntTxFull 發送緩衝區溢出,緩衝區中已沒有空間。
1011 ComEvntDCB 檢索串口的設備控制塊時發生錯誤。

實例1:計算機撥號
在一些實際應用中經常需要使用計算機撥號。下面這個例子利用MSComm控件操作Modem進行撥號,實現串口通信。
實現步驟:
1.建窗體
●添加一個MSComm控件,用來建立與串口的連接;
●添加一個Text控件,Name屬性爲Txttel,用來輸入電話號碼;
●添加3個CommandButton控件,Name屬性分別爲DialButton、CancellButton、QuitButton,分別用來實現撥號、中止撥號、中止程序;
●添加一個Label控件,用來顯示所有與撥號有關的信息。窗體見圖1。
2.設置MSComm控件屬性
●InBufferSize=1024;
●Inputlen=0;
●InputMode=0;
●Rthreshold=2;
●RTSEnable=True;
●Settings=“9600,N,8,1”;
●Sthreshold=0。
因爲每一臺計算機的串口使用狀態都不會一樣。爲使程序具有通用性,在窗體的Load方法中首先進行串口測試,找到第一個可用串口後再進行設置。

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 控件讀取接收緩衝區中全部的內容。

若接收緩衝區中 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 字符。


錯誤消息(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章