




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VB 完成串口通信。一種是用VB 提供的具有強(qiáng)大功能的通信控件;另一種方法是調(diào)用WINDOWS API 函數(shù),使用WINDOWS 提供的通信函數(shù)編寫移植性強(qiáng)的應(yīng)用程序;第三是利用文件的輸入/ 輸出完成,該方法簡(jiǎn)便易行,但有一定的局限性。一、利用通信控件(MSCOMM) 完成串口通信VB 提供了通信控件MSCOMM,文件名為MSCOMM. VBX。該控件可設(shè)置串行通信的數(shù)據(jù)發(fā)送和接收,對(duì)串口狀態(tài)及串行通信的信息格式和協(xié)議進(jìn)行設(shè)置。在通信過程中可以觸發(fā)OnComm事件,在該事件過程進(jìn)行數(shù)據(jù)檢驗(yàn)處理及檢錯(cuò),還可以通過編程訪問CommEvent 屬性來了解通信的情況,進(jìn)行收發(fā)數(shù)據(jù)的處理。每個(gè)通信控件對(duì)
2、應(yīng)一個(gè)串口,如果要訪問多個(gè)通信口,則要設(shè)計(jì)多個(gè)通信控件。1、通信控件的事件及基本屬性(1)事件OnComm:通信控件只提供了一個(gè)事件,該事件的觸發(fā)可以對(duì)串口的通信事件及錯(cuò)誤進(jìn)行處理。通過對(duì)CommEvent 屬性的判斷可知當(dāng)前的通信錯(cuò)誤和事件,分別對(duì)每個(gè)CommEvent 值進(jìn)行編程就完成了對(duì)各個(gè)錯(cuò)誤和事件的處理。如:CommEvent = MSCOMMEVSEND 表示發(fā)送事件。這些信息可從VB 提供的常量文件CONSTANT. TXT中查出。(2)屬性CommPort :設(shè)置通信控件與哪個(gè)串口相連接,設(shè)置并返回通信口號(hào)。Setting :設(shè)置通信的信息格式,為字符型。順序?yàn)椋翰ㄌ芈?、校?yàn)、
3、數(shù)據(jù)位、停止位。PortOpen :布爾型、開關(guān)通信口。InputLen :從接收緩沖區(qū)讀取字符個(gè)數(shù)。Input ,Output :讀取接收緩沖區(qū)或?qū)懭氚l(fā)送緩沖區(qū)字符。以上五種屬性對(duì)串口完成基本的設(shè)置和操作,下面的三種屬性是描述如何利用VB 提供的事件驅(qū)動(dòng)機(jī)制來實(shí)現(xiàn)通信。CommEvent :返回通信過程中產(chǎn)生的錯(cuò)誤信息及事件,了解通信狀況。SThreshold :設(shè)置并返回不觸發(fā)OnComm事件時(shí)發(fā)送緩沖區(qū)被允許的最少字符數(shù)。當(dāng)緩沖區(qū)的字符少于設(shè)置的值時(shí),則觸發(fā)OnComm事件,并把CommEvent 設(shè)為MSCOMMMEVSEND。當(dāng)SThreshold = 0 則禁止發(fā)送觸發(fā)OnComm
4、 事件,當(dāng)SThreshold = 1 則發(fā)送緩沖區(qū)為空時(shí)就觸發(fā)OnComm事件。利用這一屬性,就可完成發(fā)送數(shù)據(jù)后的一系列操作。如:對(duì)剛發(fā)送的數(shù)據(jù)進(jìn)行處理,當(dāng)串口是和MODEM通信時(shí),發(fā)送完數(shù)據(jù)后可進(jìn)行拆除線路聯(lián)接、掛機(jī)等操作。RThreshold :設(shè)置并返回不觸發(fā)OnComm事件時(shí)接收緩沖區(qū)被允許的最多字符數(shù)。當(dāng)緩沖區(qū)的字符多于設(shè)置的值時(shí),則觸發(fā)OnComm 事件,并把CommEvent 設(shè)為MSCOMMEVRECEIVE,當(dāng)RThreshold = 0 則禁止接收觸發(fā)OnComm 事件,當(dāng)RThreshold = 1 則接收緩沖區(qū)有一個(gè)或更多字符時(shí)就觸發(fā)OnComm事件。利用這一屬性,就
5、可完成對(duì)串口接收數(shù)據(jù)的處理。2、利用通信控件的實(shí)例Sub Form1 load ()form1. show設(shè)置COM1comm1. commport = 1comm1. Setting = " 9600 ,o ,8 ,1" 波特率:9600 奇校驗(yàn),8位數(shù)據(jù),1 位停止位comm1. Inputlen = 0 讀取接收緩沖區(qū)的所有字符comm1. OutBufferSize = 512 設(shè)置發(fā)送緩沖區(qū)為512 字節(jié)comm1. InBufferSize = 512 設(shè)置接收緩沖區(qū)為512 字節(jié)comm1. SThreshold = 0 禁止發(fā)送事件comm1. RThres
6、hold = 1 每一個(gè)字符到接收緩沖區(qū)都觸發(fā)接收事件設(shè)置COM2comm2. commport = 2comm2. Setting = "2400 ,e ,8 ,1" 波特率:2400 偶驗(yàn),8 位數(shù)據(jù),1 位停止位comm2. Inputlen = 0 讀取接收緩沖區(qū)的所有字符comm2. OutBufferSize = 512 設(shè)置發(fā)送緩沖區(qū)為512 字節(jié)comm2. InBufferSize = 512 設(shè)置接收緩沖區(qū)為512 字節(jié)comm2. SThreshold = 1 發(fā)送緩沖區(qū)空觸發(fā)發(fā)送事件comm2. RThreshold = 0 禁止接收事件打開COM1
7、 ,COM2comm1. Portopen = Truecomm2. Portopen = TrueTimer1. interval = 5000End SubSub Comm1 OnComm()Dim Inbuff as stringDim i as integer ,n as integer ,t as integerSelect Case Comm1. CommEvencase MSCOMMEVRECEIVEInbuff = Comm1. Inputn = len ( Inbuff)For i = 1 to nt = Asc (Mid ( Inbuff ,i ,1) ) or &
8、HFFprint fNext iEnd SelectEnd SubSub Comm2 OnComm()Select Case Comm2. CommEventCase MSCOMMEVSENDPrint timeEnd SelectEnd SubSub Timer1Timer ()Comm2. output = Second (Now)End sub 二、通過調(diào)用API 函數(shù)實(shí)現(xiàn)通信以上說明了用VB 提供的控件實(shí)現(xiàn)通信的方法,只要理解了VB 控件的機(jī)制就很容易完成對(duì)串口的操作,但可移植性差。但VB 可以很容易調(diào)用API 函數(shù)實(shí)現(xiàn)通信。1、VB 對(duì)API 的調(diào)用VB 使用動(dòng)態(tài)鏈接庫DL
9、L(Dynamic Link Libraries) 的能力,大大擴(kuò)展了其功能。WINDOWS 本身提供了API 函數(shù)包括三大動(dòng)態(tài)鏈接庫: KERNEL 庫、GDI 庫、USER 庫,通過VB 用戶可以直接調(diào)用這些庫中的函數(shù)。調(diào)用之前,必須首先在VB 中聲明。該聲明可為模塊級(jí)或窗體級(jí),當(dāng)作為模塊級(jí)聲明時(shí),其作用域?yàn)樗蠪ORM和MODULE,而作為窗體級(jí)聲明時(shí)其作用域?yàn)樵撀暶魉诘腇ORM。VB 調(diào)用DLL 的格式:Declare Sub 過程名Lib庫名Alias別名 ( ByVal 參數(shù)As 類型)Declare Function 函數(shù)名Lib庫名Alias別名 ( ByVal參數(shù)As 類型
10、) As 類型在聲明中:DECLARE 表示聲明DLL 中的函數(shù),當(dāng)聲明是不具有返回值的過程時(shí)用SUB 關(guān)鍵字,而如果調(diào)用的函數(shù)具有返回值,則必須用FUNCTION 關(guān)鍵字將其聲明為函數(shù)并在聲明語句的最后用AS 指明函數(shù)返回值的類型。LIB 關(guān)鍵字表示當(dāng)前聲明的過程或函數(shù)是庫名所指定的庫中函數(shù)而非VB本身的函數(shù)。庫名,就是對(duì)應(yīng)動(dòng)態(tài)鏈接庫的名稱,其中通信函數(shù)在USER 庫中。ByVal 關(guān)鍵字將原參數(shù)數(shù)據(jù)類型一一對(duì)應(yīng)到VB 類型中。WINDOWS 的HELP 文件WINSDK. HLP 中包含了完整的WINDOWS API 函數(shù)信息,可用該文件查看聯(lián)機(jī)函數(shù)、數(shù)據(jù)結(jié)構(gòu)及錯(cuò)誤信息。2、API 提供的
11、通信函數(shù)為了方便說明,我們將有關(guān)通信的函數(shù)及相關(guān)的數(shù)據(jù)結(jié)構(gòu)放在全局模塊中,文件名為COMM.BAS(見API 編程函數(shù)實(shí)例) 。以下是這些函數(shù)的基本介紹:(1)OpenComm( IpComName As String ,wInQueue As Inte-ger ,wOutQueue As Integer)IpComName :設(shè)備名,以“COMn”的形式來說明,n 為設(shè)備號(hào);wInQueue 、wOutQueue :分別以字節(jié)為單位說明發(fā)送、接收緩沖區(qū)的大小。該函數(shù)調(diào)用成功返回打開的設(shè)備號(hào),否則返回一負(fù)數(shù)代表錯(cuò)誤信息碼。(2)SetCommState ( IpDCB As DCB)IpDCB
12、 :是DCB 結(jié)構(gòu)存放設(shè)備所希望的通信設(shè)置(DCB 結(jié)構(gòu)如COMM.BAS 中所示) ,其中DCB 的ID 成員必須標(biāo)識(shí)該設(shè)備。如果函數(shù)調(diào)用成功返回0 ;否則,返回值小于0。(3)ReadComm(nCid As Integer , IpBuf As String ,nSize As Integer)WriteComm(nCid As Integer , IpBuf As String ,nSize As In-teger)這是用來對(duì)通信設(shè)備進(jìn)行讀寫的函數(shù),nCid :說明要讀寫的通信設(shè)備號(hào), IpBuf :為讀寫緩沖區(qū),nSize :為要讀寫的字節(jié)數(shù)。如果讀寫成功,返回讀寫的字節(jié)數(shù),否則是小
13、于0 的值,并且其絕對(duì)值為讀寫的字節(jié)數(shù)。(4)Closecomm(nCid As Integer)該函數(shù)關(guān)閉nCid 所指定的通信設(shè)備,并且釋放分配給設(shè)備的發(fā)送,接收緩沖存儲(chǔ)器,調(diào)用成功返回0 ;否則,返回值小于0。(5)BuildCommDCB( IpDef As String , IpDCB As DCB)lpDef : 為一字符串指定設(shè)備控制信息,此字符串具有MS-DOS 中MODE 命令所使用的參數(shù)形式。IpDCB :為一DCB數(shù)據(jù)結(jié)構(gòu)。該函數(shù)將IpDef 字符串轉(zhuǎn)換成串行設(shè)備控制塊(DCB) 代碼。(6)GetCommError (nCid As Integer , IpStat A
14、s COMSTAT)該函數(shù)檢取nCid 指定的設(shè)備最近的錯(cuò)誤值和當(dāng)前狀態(tài),IpStat :是COMSTAT結(jié)構(gòu),具體形式如COMM.BAS 中所定義的。返回值為COMM.BAS 中帶CE- 的常量的某種組合。3. 用API 函數(shù)編程實(shí)例這個(gè)例子是一仿真發(fā)送機(jī),將從鍵盤輸入的字符發(fā)送給COM端口。在FORM中加一按鈕COMMAND1 來關(guān)閉通信口。Type DCBId As String 3 1BaudRate As IntegerByteSize As String 3 1Parity As String 3 1StopBits As String 3 1RlsTimeout As Integ
15、erCtsTimeout As IntegerDsrTimeout As IntegerBits1 As String 3 1Bits2 As String 3 1XonChar As String 3 1XoffChar As String 3 1XonLim As IntegerXoffLim As IntegerPeChar As String 3 1EofChar As String 3 1EvtChar As String 3 1TxDelay As IntegerEnd TypeType COMSTATBits As String 3 1cbInQue As IntegercbOu
16、tQue As IntegerEnd TypeDeclare Function OpenComm Lib User(ByVal IpComName AsString , ByVal wInQueue As Integer , ByVal wOutQueue As Integer) As IntegerDeclare Function SetCommState Lib User ( IpDCB As DCB)As IntegerDeclare Function ReadComm Lib User(ByVal nCid As Integer , ByVal IpBuf As String , By
17、Val nSize As Integer) As IntegerDeclare Function WriteComm Lib User(ByVal nCid As Integer , ByVal IpBuf As String , ByVal nSize As Integer) As IntegerDeclare Function Closecomm Lib User(ByVal nCid As Integer) As IntegerDeclare Function BuildCommDCB Lib User (ByVal IpDef AsString , IpDCB As DCB) As I
18、ntegerDeclare Function GetCommError Lib User (ByVal nCid AsInteger , IpStat As COMSTAT) As IntegerGlobal IpDCB As DCBGlobal nCid As IntegerSub Form1 load ()Dim comset As Stringcomset =“COM2"nCid = OpenComm(comset ,512 ,512) 打開COM2 設(shè)置接收,發(fā)送緩沖區(qū)為512 字節(jié)If nCid < 0 Then 處理錯(cuò)誤MsgBox“不能打開COM:" +
19、 Str (nCid) +“Error Num2ber :" + Str (nCid) ,16endend ifCommand1. Caption =“關(guān)閉通信口" 設(shè)置串口DCB 設(shè)備控制塊comset =“COM2 :9600 ,n ,8 ,1"If (BuildCommDCB(comset ,LpDCB) ) ThenMsgBox“不能建立COMM DCB" ,16endend ifLpDCB. Id = Chr (nCid)If (SetCommState (LpDCB) ) Then 設(shè)置串口狀態(tài)MsgBox"不能設(shè)置串口狀態(tài)&quo
20、t; ,16endendifEnd SubSub Form1-keyPress (keyAscii As Integer)Dim nsend As integer ,x As integerDim Lpstate As COMSTAT 通信狀態(tài)塊Static inbuff as stringinbuff = imbuff + Chr ( KeyAscii)x = GetCommError (ncid ,Lpstate) 讀取當(dāng)前串口錯(cuò)誤或狀態(tài)if lpstate. cbOutQue < 512 Then 送緩沖區(qū)有空間否?Nsend = WriteComm(nCid ,inbuff ,L
21、en (inbuff) ) 發(fā)送inbuffif Nsend < = 0 then Nsend = - Nsend 忽略錯(cuò)誤inbuff = Mid (inbuff ,Nsend + 1) 清除已發(fā)送的字符end ifend ifEnd SubSub Command1-Click()Dim Nclose As integerNclose = CloseComm(nCid)If Nclose < 0 ThenMsgBox“不能關(guān)閉COMM口:" + Str (nCid) ,16endelsencid = 0end ifCmmand1. Caption =“通信已關(guān)閉”End Sub 三、用文件輸入/ 輸出技術(shù)完成通信用VB 提供的以上兩種方法已足以應(yīng)付各種串行通信的問題。另外還可以用文件輸入/ 輸出的方法完成簡(jiǎn)單的通信應(yīng)用程序,如撥號(hào)。它用我們非常熟悉的BASIC 輸入/ 輸出指令,如:OPEN、CLOSE、GET、PUT(PRINT、WRITE) 、ERR 來完成打開、關(guān)閉、讀、寫和檢錯(cuò)通信口的功能。由于以上指令常在BASIC 中使用,所以不在本文中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全國(guó)人教版初中信息技術(shù)七年級(jí)上冊(cè)第一單元第2課一、《從網(wǎng)上下載圖片》教學(xué)設(shè)計(jì)
- 人教版八年級(jí)地理上冊(cè)第三章第一節(jié)自然資源的基本特征教學(xué)設(shè)計(jì)
- 人教版初中化學(xué)九年級(jí)下冊(cè)9.1溶液的形成 教學(xué)設(shè)計(jì)
- 人教部編版七年級(jí)道德與法治下冊(cè)教學(xué)設(shè)計(jì):1.2成長(zhǎng)的不僅僅是身體
- 人教部編版三年級(jí)下冊(cè)第一單元1 古詩三首惠崇春江晚景教案設(shè)計(jì)
- 一年級(jí)道德與法治下冊(cè) 第一單元 我的好習(xí)慣《4 不做“小馬虎”》教學(xué)設(shè)計(jì) 新人教版
- 二年級(jí)數(shù)學(xué)上冊(cè) 六 測(cè)量練習(xí)四配套教學(xué)設(shè)計(jì) 北師大版
- 人教版九年級(jí)全冊(cè)第4節(jié) 焦耳定律教學(xué)設(shè)計(jì)
- 三年級(jí)數(shù)學(xué)上冊(cè) 6 多位數(shù)乘一位數(shù)(數(shù)字編碼)教學(xué)設(shè)計(jì) 新人教版
- 人教部編版八下歷史第6課艱辛探索與建設(shè)成就教學(xué)設(shè)計(jì)
- 2023年赤峰龍韻城市建設(shè)有限公司招聘筆試題庫及答案解析
- (人工智能導(dǎo)論)課件
- 專利申請(qǐng)培訓(xùn)課件
- DPtechIPS2000系列入侵防御系統(tǒng)培訓(xùn)膠片課件
- 競(jìng)爭(zhēng)性談判二次報(bào)價(jià)單
- 危大工程巡視檢查記錄
- (房屋建筑部分)工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文2023年版
- 空氣自動(dòng)監(jiān)測(cè)站運(yùn)維技術(shù)服務(wù)合同模版
- (完整)康復(fù)醫(yī)學(xué)考試題(含答案)
- 延期還款申請(qǐng)表
- 江蘇省地圖矢量PPT模板(可編輯)
評(píng)論
0/150
提交評(píng)論