C#串口通訊:MSComm控制項使用詳解

來源:互聯網
上載者:User
轉載:來源:http://www.cnblogs.com/yan0837/articles/304355.html

摘要:本文詳細介紹了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 控制項讀取接收緩衝區中全部的內容。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.