VB Mscomm控件應(yīng)用
Visual Basic 6.0(以下簡(jiǎn)稱(chēng)VB) 是一種功能強(qiáng)大、簡(jiǎn)單易學(xué)的程序設(shè)計(jì)語(yǔ)言。它不但保留了原先Basic語(yǔ)言的全部功能,而且還增加了面向?qū)ο蟪绦蛟O(shè)計(jì)功能。它不僅可以方便快捷地編制適用于數(shù)據(jù)處理、多媒體等方面的程序,而且利用ActiveX控件MSComm還能十分方便地開(kāi)發(fā)出使用計(jì)算機(jī)串口的計(jì)算機(jī)通信程序。本文結(jié)合計(jì)算機(jī)通信的兩個(gè)例子,詳細(xì)介紹如何在VB中使用MSComm控件。
處理方式
MSComm控件提供了兩種處理通信的方式:一種為事件驅(qū)動(dòng)方式,該方式相當(dāng)于一般程序設(shè)計(jì)中的中斷方式。當(dāng)串口發(fā)生事件或錯(cuò)誤時(shí),MSComm控件會(huì)產(chǎn)生OnComm事件,用戶(hù)程序可以捕獲該事件進(jìn)行相應(yīng)處理。本文的兩個(gè)例子均采用該方式。另一種為查詢(xún)方式,在用戶(hù)程序中設(shè)計(jì)定時(shí)或不定時(shí)查詢(xún)MSComm控件的某些屬性是否發(fā)生變化,從而確定相應(yīng)處理。在程序空閑時(shí)間較多時(shí)可以采用該方式。
常用屬性和方法
利用MSComm控件實(shí)現(xiàn)計(jì)算機(jī)通信的關(guān)鍵是理解并正確設(shè)置MSComm控件眾多屬性和方法。以下是MSComm控件的常用屬性和方法:
●Commport:設(shè)置或返回串口號(hào)。
●Settings:以字符串的形式設(shè)置或返回串口通信參數(shù)。
●Portopen:設(shè)置或返回串口狀態(tài)。
●InputMode:設(shè)置或返回接收數(shù)據(jù)的類(lèi)型。
●Inputlen:設(shè)置或返回一次從接收緩沖區(qū)中讀取字節(jié)數(shù)。
●InBufferSize:設(shè)置或返回接收緩沖區(qū)的大小,缺省值為1024字節(jié)。
●InBufferCount:設(shè)置或返回接收緩沖區(qū)中等待計(jì)算機(jī)接收的字符數(shù)。
●Input:從接收緩沖區(qū)中讀取數(shù)據(jù)并清空該緩沖區(qū),該屬性設(shè)計(jì)時(shí)無(wú)效,運(yùn)行時(shí)只讀。
●OutBufferSize:設(shè)置或返回發(fā)送緩沖區(qū)的大小,缺省值為512字節(jié)。
●OutBufferCount:設(shè)置或返回發(fā)送緩沖區(qū)中等待計(jì)算機(jī)發(fā)送的字符數(shù)。
●Output:向發(fā)送緩沖區(qū)發(fā)送數(shù)據(jù),該屬性設(shè)計(jì)時(shí)無(wú)效,運(yùn)行時(shí)只讀。
●Rthreshold:該屬性為一閥值。當(dāng)接收緩沖區(qū)中字符數(shù)達(dá)到該值時(shí),MSComm控件設(shè)置Commevent屬性為ComEvReceive,并產(chǎn)生OnComm事件。用戶(hù)可在OnComm事件處理程序中進(jìn)行相應(yīng)處理。若Rthreshold屬性設(shè)置為0,則不產(chǎn)生OnComm事件。例如用戶(hù)希望接收緩沖區(qū)中達(dá)到一個(gè)字符就接收一個(gè)字符,可將Rthreshold設(shè)置為1。這樣接收緩沖區(qū)中接收到一個(gè)字符,就產(chǎn)生一次OnComm事件。
●Sthreshold:該屬性亦為一閥值。當(dāng)發(fā)送緩沖區(qū)中字符數(shù)小于該值時(shí),MSComm控件設(shè)置Commevent屬性為ComEvSend,并產(chǎn)生OnComm事件。若Sthreshold屬性設(shè)置為0,則不產(chǎn)生OnComm事件。要特別注意的是僅當(dāng)發(fā)送緩沖區(qū)中字符數(shù)小于該值的瞬間才產(chǎn)生OnComm事件,其后就不再產(chǎn)生OnComm事件。例如Sthreshold設(shè)置為3,僅當(dāng)發(fā)送緩沖區(qū)中字符數(shù)從3降為2時(shí),MSComm控件設(shè)置Commevent屬性為ComEvSend,同時(shí)產(chǎn)生OnComm事件,如發(fā)送緩沖區(qū)中字符始終為2,則不會(huì)再產(chǎn)生OnComm事件。這就避免了發(fā)送緩沖區(qū)中數(shù)據(jù)未發(fā)送完就反復(fù)發(fā)生OnComm事件。
●CommEvent:這是一個(gè)非常重要的屬性。該屬性設(shè)計(jì)時(shí)無(wú)效,運(yùn)行時(shí)只讀。一旦串口發(fā)生通信事件或產(chǎn)生錯(cuò)誤,依據(jù)產(chǎn)生的事件和錯(cuò)誤,MSComm控件為CommEvent屬性賦不同的代碼,同時(shí)產(chǎn)生OnComm事件。用戶(hù)程序就可在OnComm事件處理程序中針對(duì)不同的代碼,進(jìn)行相應(yīng)的處理。CommEvent屬性的代碼、常數(shù)及含義參見(jiàn)表1及表2。
表1 CommEvent通信事件
代碼 常數(shù) 含義
1 ComEvReceive 接受到Rthreshold個(gè)字符。該事件將持續(xù)產(chǎn)生,直到用Input屬性從接受緩沖區(qū)中讀取并刪除字符。
2 ComEvSend 發(fā)送緩沖區(qū)中數(shù)據(jù)少于Sthreshold個(gè),說(shuō)明串口已經(jīng)發(fā)送了一些數(shù)據(jù),程序可以用Output屬性繼續(xù)發(fā)送數(shù)據(jù)。
3 ComEvCTS Clear To Send信號(hào)線(xiàn)狀態(tài)發(fā)生變化。
4 ComEvDSR Data Set Ready信號(hào)線(xiàn)狀態(tài)從1變到0。
5 ComEvCD Carrier Detect信號(hào)線(xiàn)狀態(tài)發(fā)生變化。
6 ComEvRing 檢測(cè)到振鈴信號(hào)。
7 ComEvEOF 接受到文件結(jié)束符。
表2 CommEvent通信錯(cuò)誤
代碼 常數(shù) 含義
1001 ComEvntBreak 接受到一個(gè)中斷信號(hào)。
1002 ComEvntCTSTO Clear To Send信號(hào)超時(shí)。
1003 ComEvntDSRTO Data Set Ready信號(hào)超時(shí)。
1004 ComEvntFrame 幀錯(cuò)誤。
1006 ComEvntOverrun 串口超速。
1007 ComEvntCDTO 載波檢測(cè)超時(shí)。
1008 ComEvntRxOver 接受緩沖區(qū)溢出,緩沖區(qū)中已沒(méi)有空間。
1009 ComEvntRxParity 奇偶校驗(yàn)錯(cuò)。
1010 ComEvntTxFull 發(fā)送緩沖區(qū)溢出,緩沖區(qū)中已沒(méi)有空間。
1011 ComEvntDCB 檢索串口的設(shè)備控制塊時(shí)發(fā)生錯(cuò)誤。