MSCOMM32控件的基本屬性
MSComm 控件經過串行端口傳輸和接收數據,爲應用程序提供串行通信功能。MSComm控件在串口編程時很是方便,程序員沒必要去花時間去了解較爲複雜的API函數, 並且在VC、VB、Delphi等語言中都可使用。 Microsoft Communications Control(如下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通訊編程的ActiveX控件,它爲應用程序提供了經過 串行接口收發數據的簡便方法。具體的來講,它提供了兩種處理通訊問題的方法:一是事件驅動(Event-driven)方法,一是查詢法。 html
MSComm控件提供下列兩種處理通信的方式:事件驅動方式和查詢方式。 程序員
事件驅動通信是處理串行端口交互做用的一種很是有效的方法。在許多狀況下,在事件發生時須要獲得通知,例如,在串口接收緩衝區中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個字符到達或一個變化發生時。在這些狀況下,能夠利用 MSComm 控件的 OnComm 事件捕獲並處理這些通信事件。OnComm 事件還能夠檢查和處理通信錯誤。全部通信事件和通信錯誤的列表,參閱 CommEvent 屬性。在編程過程當中,就能夠在OnComm事件處理函數中加入本身的處理代碼。這種方法的優勢是程序響應及時,可靠性高。每一個MSComm 控件對應着一個串行端口。若是應用程序須要訪問多個串行端口,必須使用多個 MSComm 控件。 編程
查詢方式實質上仍是事件驅動,但在有些狀況下,這種方式顯得更爲便捷。在程序的每一個關鍵功能以後,能夠經過檢查 CommEvent 屬性的值來查詢事件和錯誤。若是應用程序較小,而且是自保持的,這種方法多是更可取的。例如,若是寫一個簡單的電話撥號程序,則沒有必要對每接收一個字符都產生事件,由於惟一等待接收的字符是調制解調器的「肯定」響應。 數組
MSComm 控件有不少重要的屬性,但首先必須熟悉幾個屬性。
CommPort 設置並返回通信端口號。
Settings 以字符串的形式設置並返回波特率、奇偶校驗、數據位、中止位。
PortOpen 設置並返回通信端口的狀態。也能夠打開和關閉端口。
Input 從接收緩衝區返回和刪除字符。
Output 向傳輸緩衝區寫一個字符串。
下面分別描述: 異步
設置並返回通信端口號。語法 object.CommPort[value ] (value 一整型值,說明端口號。)
說明 在設計時,value 能夠設置成從 1 到 16 的任何數(缺省值爲 1)。可是若是用 PortOpen 屬性打開一個並不存在的端口時,MSComm 控件會產生錯誤 68(設備無效)。
注意:必須在打開端口以前設置 CommPort 屬性。 函數
在 MSComm 控件設置 CommEvent 屬性爲 comEvReceive 併產生 OnComm 以前,設置並返回的要接收的字符數。
語法 object.Rthreshold [ = value ](value 整型表達式,說明在產生 OnComm 事件以前要接收的字符數。 )
說明 當接收字符後,若 Rthreshold 屬性設置爲 0(缺省值)則不產生 OnComm 事件。例如,設置 Rthreshold 爲 1,接收緩衝區收到每個字符都會使 MSComm 控件產生 OnComm 事件。 ui
肯定是否可經過查詢 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 屬性。 url
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 事件將毫不會發生。 spa
常數 值 描述
comNone 0 無握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-send/clear-to-send 握手。
comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
comEVENT的值在產生事件時,將會是下面的這些值:表明不一樣的事件發生。 設計
常數 值 描述
comEvSend 1 發送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 線變化。
comEvDSR 4 data-set ready 線變化。
comEvCD 5 carrier detect 線變化。
comEvRing 6 振鈴檢測。
comEvEOF 7 文件結束。
常數 值 描述
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) 時的意外錯誤
常數 值 描述
comInputModeText 0 (缺省)經過 Input 屬性以文本方式取回數據。
comInputModeBinary 1 經過 Input 屬性以二進制方式檢取回數據。
經過查詢 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
肯定 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
設置並返回波特率、奇偶校驗、數據位、中止位參數。
語法: object.Settings[ = value]
說明:當端口打開時,若是 value 非法,則 MSComm 控件產生錯誤 380(非法屬性值)。
value 由四個設置值組成,有以下的格式:
"BBBB,P,D,S"
BBBB 爲波特率,P 爲奇偶校驗,D 爲數據位數,S 爲中止位數。value 的缺省值是:
"9600,N,8,1"
設置並返回 Input 屬性從接收緩衝區讀取的字符數。
語法 object.InputLen [ = value]
InputLen 屬性語法包括下列部分:
value 整型表達式,說明 Input 屬性從接收緩衝區中讀取的字符數。
說明:InputLen 屬性的缺省值是 0。設置 InputLen 爲 0 時,使用 Input 將使 MSComm 控件讀取接收緩衝區中所有的內容。
若接收緩衝區中 InputLen 字符無效,Input 屬性返回一個零長度字符串 ("")。在使用 Input 前,用戶能夠選擇檢查 InBufferCount 屬性來肯定緩衝區中是否已有須要數目的字符。該屬性在從輸出格式爲定長數據的機器讀取數據時很是有用。
肯定在輸入過程當中 MSComm 控件是否尋找文件結尾 (EOF) 字符。若是找到 EOF 字符,將中止輸入並激活 OnComm 事件,此時 CommEvent 屬性設置爲 comEvEOF,
語法:object.EOFEnable [ = value ]
EOFEnable 屬性語法包括下列部分:
value 布爾表達式,肯定當找到 EOF 字符時,OnComm 事件是否被激活,如「設置值」中所描述。
value 的設置值:
True 當 EOF 字符找到時 OnComm 事件被激活。
False (缺省)當 EOF 字符找到時 OnComm 事件不被激活。
說明:當 EOFEnable 屬性設置爲 False,OnComm 控件將不在輸入流中尋找 EOF 字符。
下表列出 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
補充,若是是偶校驗則將ole_1.object.settings="1200,n,8,1" 中的n改成e,奇校驗爲o
w1 = asc(ole_1.object.input)
//若是讀入的是7位的acs碼,則將w1 – 48 既爲所要的值,48的16進制是30H,是十進制的0
若是ole_1.object.commevent的返回值爲3 :clear-to-send 線變化,則是由於設備與電腦的鏈接線有問題,須要將標準rc-232線進行調線,即將2線和3線進行交換。即將設備的發送接到電腦的接收上,將設備的接收接到電腦的發送上。
下面兩張圖 是一個 利用MsCom進行串口通信(中斷方式)的程序框圖和回調VI的程序框圖
使用RTThrsehold屬性設置觸發接收中斷事件的觸發條件,本程序設置爲1,當緩衝器接收到一個字符 時,就會發生中斷事件——oncomm事件中斷,不少條件均可以產生oncomm事件,區分產生中斷的緣由有Comevent的屬性值來肯定,當 conevent爲2時,表示是因爲接收到字符產生的中斷,由此進入接受中斷處理程序。
而中斷處理程序,接收到的數據是變體數據,轉換爲數組型數據,發送數組中,最後送到返回變量中,供顯示和繪製實時圖使用。
commevent的參數 對比表!
根據應用程序的用途和功能,在鏈接到其它設備過程當中,以及接收或發送數據過程當中,可能須要監視並響應一些事件和錯誤。 |
||
常數 |
值 |
描述 |
ComEvSend |
1 |
發送緩衝區中的字符數少於 SThreshold。 |
ComEvReceive |
2 |
接收到 Rthreshold 個字符。在使用 Input 屬性移去接收緩衝區中的數據以前,該事件將持續產生。 |
ComEvCTS |
3 |
CTS 信號發生變化。 |
ComEvDSR |
4 |
DSR 信號發生變化。該事件僅在 DSR 由 1 變爲 0 時觸發。 |
ComEvCD |
5 |
CD 信號發生變化。 |
ComEvRing |
6 |
檢測到電話振鈴。某些 UART(通用異步收發器)可能不支持本事件。 |
ComEvEOF |
7 |
收到文件結束符(ASCII 字符 26)。 |
下列錯誤一樣會觸發 OnComm 事件,而且在 CommEvent 屬性中寫入相應的值。 |
||
|
||
設置值 |
值 |
描述 |
ComEventBreak |
1001 |
收到 Break 信號。 |
ComEventFrame |
1004 |
幀錯誤。硬件檢測到幀錯誤。 |
ComEventOverrun |
1006 |
端口超限。在下一個字符到達端口以前,前一字符尚未從硬件中讀走,於是丟失。 |
ComEventRxOver |
1008 |
接收緩衝區溢出。接收緩衝區已沒有空間。 |
ComEventRxParity |
1009 |
奇偶校驗錯誤。硬件檢測到奇偶校驗錯誤。 |
comEventTxFull |
1010 |
發送緩衝區滿。在試圖將字符傳入發送緩衝區時,該緩衝區已滿。 |
ComEventDCB |
1011 |
在爲端口獲取設備控制塊 (DCB) 時,發生不可預料的錯誤。 |
另外: 須要注意的是 給output屬性賦值輸出時,有兩種可用的形式:1是字符串 2是字節型數值 數組,就是佔一個字節的數值組成的數組。而後轉化爲變體數據類型。
以下圖所示:
————————————————————————————————————————————————
關於RTThrsehold 和 inputlen 的設置,我一直搞不明白,因此在實際應用中出現過這樣那樣的問題。
例如 接收到的數據遠遠小於發送的數據了,接收到的數據出現亂碼了,等等。
通過反覆的實驗
我發現 若是將inputlen設置的太小(如1),同時呢,發送的波特率太高,就會出現接受到的數據小於實際發送出的數據。
由於將RTHrsehold設置爲1的時候,每收到一個字符就會產生一次中斷,此次中斷會提取 inputlen個數的字符。
若是波特率太高,就會致使,中斷不可以及時發生(每次中斷只讀取一個字符,而產生的中斷數目小於實際發送的字符數),不少數據到最後積累在緩衝區內。
(這是我經過程序最後讀取緩衝區的數據大小進行的判斷)
所以必要時,能夠將RTHrsehold和inputlen的值都設大一些,纔可以正常。(使得中斷處理函數的時間遠遠小於產生中斷的時間便可)