版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、VB串口通信目前,Visual Basic (簡稱VB) 已成為WINDOWS 系統(tǒng)開發(fā)的主要語言,以其高效、簡單易學(xué)及功能強大的特點越來越為廣大程序設(shè)計人員及用戶所青睞。VB 支持面向?qū)ο蟮某绦蛟O(shè)計,具有結(jié)構(gòu)化的事件驅(qū)動編程模式并可以使用無限擴增的控件。在VB 應(yīng)用程序可以方便地調(diào)用WINDOWS API函數(shù),使得編程效率提高,應(yīng)用功能增強。利用VB 提供的這些功能,我們可以有三種方法完成串口通信。一種是用VB 提供的具有強大功能的通信控件;另一種方法是調(diào)用WINDOWS API 函數(shù),使用WINDOWS 提供的通信函數(shù)編寫移植性強的應(yīng)用程序;第三是利用文件的輸入/ 輸出完成,該方法簡便易行
2、,但有一定的局限性。一、利用通信控件(MSCOMM) 完成串口通信VB 提供了通信控件MSCOMM,文件名為MSCOMM. VBX。該控件可設(shè)置串行通信的數(shù)據(jù)發(fā)送和接收,對串口狀態(tài)及串行通信的信息格式和協(xié)議進行設(shè)置。在通信過程中可以觸發(fā)OnComm事件,在該事件過程進行數(shù)據(jù)檢驗處理及檢錯,還可以通過編程訪問CommEvent 屬性來了解通信的情況,進行收發(fā)數(shù)據(jù)的處理。每個通信控件對應(yīng)一個串口,如果要訪問多個通信口,則要設(shè)計多個通信控件。1、通信控件的事件及基本屬性(1)事件OnComm:通信控件只提供了一個事件,該事件的觸發(fā)可以對串口的通信事件及錯誤進行處理。通過對CommEvent 屬性的判
3、斷可知當(dāng)前的通信錯誤和事件,分別對每個CommEvent 值進行編程就完成了對各個錯誤和事件的處理。如:CommEvent = MSCOMMEVSEND 表示發(fā)送事件。這些信息可從VB 提供的常量文件CONSTANT. TXT中查出。(2)屬性CommPort :設(shè)置通信控件與哪個串口相連接,設(shè)置并返回通信口號。Setting :設(shè)置通信的信息格式,為字符型。順序為:波特率、校驗、數(shù)據(jù)位、停止位。PortOpen :布爾型、開關(guān)通信口。InputLen :從接收緩沖區(qū)讀取字符個數(shù)。Input ,Output :讀取接收緩沖區(qū)或?qū)懭氚l(fā)送緩沖區(qū)字符。以上五種屬性對串口完成基本的設(shè)置和操作,下面的三
4、種屬性是描述如何利用VB 提供的事件驅(qū)動機制來實現(xiàn)通信。CommEvent :返回通信過程中產(chǎn)生的錯誤信息及事件,了解通信狀況。SThreshold :設(shè)置并返回不觸發(fā)OnComm事件時發(fā)送緩沖區(qū)被允許的最少字符數(shù)。當(dāng)緩沖區(qū)的字符少于設(shè)置的值時,則觸發(fā)OnComm事件,并把CommEvent 設(shè)為MSCOMMMEVSEND。當(dāng)SThreshold = 0 則禁止發(fā)送觸發(fā)OnComm 事件,當(dāng)SThreshold = 1 則發(fā)送緩沖區(qū)為空時就觸發(fā)OnComm事件。利用這一屬性,就可完成發(fā)送數(shù)據(jù)后的一系列操作。如:對剛發(fā)送的數(shù)據(jù)進行處理,當(dāng)串口是和MODEM通信時,發(fā)送完數(shù)據(jù)后可進行拆除線路聯(lián)接、
5、掛機等操作。RThreshold :設(shè)置并返回不觸發(fā)OnComm事件時接收緩沖區(qū)被允許的最多字符數(shù)。當(dāng)緩沖區(qū)的字符多于設(shè)置的值時,則觸發(fā)OnComm 事件,并把CommEvent 設(shè)為MSCOMMEVRECEIVE,當(dāng)RThreshold = 0 則禁止接收觸發(fā)OnComm 事件,當(dāng)RThreshold = 1 則接收緩沖區(qū)有一個或更多字符時就觸發(fā)OnComm事件。利用這一屬性,就可完成對串口接收數(shù)據(jù)的處理。2、利用通信控件的實例Sub Form1 load ()form1. show設(shè)置COM1comm1. commport = 1comm1. Setting = " 9600 ,
6、o ,8 ,1" 波特率:9600 奇校驗,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. RThreshold = 1 每一個字符到接收緩沖區(qū)都觸發(fā)接收事件設(shè)置COM2comm2. commport = 2comm2. Setting = "2400 ,e ,8 ,1" 波特率:2400 偶驗,8
7、 位數(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 ,COM2comm1. Portopen = Truecomm2. Portopen = TrueTimer1. interval = 5000End SubSub Comm1 OnComm()Dim Inbuff
8、 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 &HFFprint fNext iEnd SelectEnd SubSub Comm2 OnComm()Select Case Comm2. CommEventCase MSCOMMEVSENDPrint timeEn
9、d SelectEnd SubSub Timer1Timer ()Comm2. output = Second (Now)End sub二、通過調(diào)用API 函數(shù)實現(xiàn)通信以上說明了用VB 提供的控件實現(xiàn)通信的方法,只要理解了VB 控件的機制就很容易完成對串口的操作,但可移植性差。但VB 可以很容易調(diào)用API 函數(shù)實現(xiàn)通信。1、VB 對API 的調(diào)用VB 使用動態(tài)鏈接庫DLL(Dynamic Link Libraries) 的能力,大大擴展了其功能。WINDOWS 本身提供了API 函數(shù)包括三大動態(tài)鏈接庫: KERNEL 庫、GDI 庫、USER 庫,通過VB 用戶可以直接調(diào)用這些庫中的函數(shù)。調(diào)用
10、之前,必須首先在VB 中聲明。該聲明可為模塊級或窗體級,當(dāng)作為模塊級聲明時,其作用域為所有FORM和MODULE,而作為窗體級聲明時其作用域為該聲明所在的FORM。VB 調(diào)用DLL 的格式:Declare Sub 過程名Lib庫名Alias別名 ( ByVal 參數(shù)As 類型)Declare Function 函數(shù)名Lib庫名Alias別名 ( ByVal參數(shù)As 類型) As 類型在聲明中:DECLARE 表示聲明DLL 中的函數(shù),當(dāng)聲明是不具有返回值的過程時用SUB 關(guān)鍵字,而如果調(diào)用的函數(shù)具有返回值,則必須用FUNCTION 關(guān)鍵字將其聲明為函數(shù)并在聲明語句的最后用AS 指明函數(shù)返回值的
11、類型。LIB 關(guān)鍵字表示當(dāng)前聲明的過程或函數(shù)是庫名所指定的庫中函數(shù)而非VB本身的函數(shù)。庫名,就是對應(yīng)動態(tài)鏈接庫的名稱,其中通信函數(shù)在USER 庫中。ByVal 關(guān)鍵字將原參數(shù)數(shù)據(jù)類型一一對應(yīng)到VB 類型中。WINDOWS 的HELP 文件WINSDK. HLP 中包含了完整的WINDOWS API 函數(shù)信息,可用該文件查看聯(lián)機函數(shù)、數(shù)據(jù)結(jié)構(gòu)及錯誤信息。2、API 提供的通信函數(shù)為了方便說明,我們將有關(guān)通信的函數(shù)及相關(guān)的數(shù)據(jù)結(jié)構(gòu)放在全局模塊中,文件名為COMM.BAS(見API 編程函數(shù)實例) 。以下是這些函數(shù)的基本介紹:(1)OpenComm( IpComName As String ,wIn
12、Queue As Inte-ger ,wOutQueue As Integer)IpComName :設(shè)備名,以“COMn”的形式來說明,n 為設(shè)備號;wInQueue 、wOutQueue :分別以字節(jié)為單位說明發(fā)送、接收緩沖區(qū)的大小。該函數(shù)調(diào)用成功返回打開的設(shè)備號,否則返回一負數(shù)代表錯誤信息碼。(2)SetCommState ( IpDCB As DCB)IpDCB :是DCB 結(jié)構(gòu)存放設(shè)備所希望的通信設(shè)置(DCB 結(jié)構(gòu)如COMM.BAS 中所示) ,其中DCB 的ID 成員必須標(biāo)識該設(shè)備。如果函數(shù)調(diào)用成功返回0 ;否則,返回值小于0。(3)ReadComm(nCid As Integer
13、 , IpBuf As String ,nSize As Integer)WriteComm(nCid As Integer , IpBuf As String ,nSize As In-teger)這是用來對通信設(shè)備進行讀寫的函數(shù),nCid :說明要讀寫的通信設(shè)備號, IpBuf :為讀寫緩沖區(qū),nSize :為要讀寫的字節(jié)數(shù)。如果讀寫成功,返回讀寫的字節(jié)數(shù),否則是小于0 的值,并且其絕對值為讀寫的字節(jié)數(shù)。(4)Closecomm(nCid As Integer)該函數(shù)關(guān)閉nCid 所指定的通信設(shè)備,并且釋放分配給設(shè)備的發(fā)送,接收緩沖存儲器,調(diào)用成功返回0 ;否則,返回值小于0。(5)Bui
14、ldCommDCB( 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 As COMSTAT)該函數(shù)檢取nCid 指定的設(shè)備最近的錯誤值和當(dāng)前狀態(tài),IpStat :是COMSTAT結(jié)構(gòu),具體形式如COMM.BAS 中所定義的。返回值為COMM.BAS 中帶CE- 的常量的某種組合。3. 用API 函數(shù)
15、編程實例這個例子是一仿真發(fā)送機,將從鍵盤輸入的字符發(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 IntegerCtsTimeout As IntegerDsrTimeout As IntegerBits1 As String 3 1Bits2 As String 3 1XonChar As String 3 1XoffChar As
16、 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 IntegercbOutQue As IntegerEnd TypeDeclare Function OpenComm Lib User(ByVal IpComName AsString , ByVal wInQueue As Integer , B
17、yVal 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 , ByVal nSize As Integer) As IntegerDeclare Function WriteComm Lib User(ByVal nCid As Integer , ByVal IpBuf As String
18、, 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 IntegerDeclare Function GetCommError Lib User (ByVal nCid AsInteger , IpStat As COMSTAT) As IntegerGlobal IpDCB As
19、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 處理錯誤MsgBox“不能打開COM:" + Str (nCid) +“Error Num2ber :" + Str (nCid) ,16endend ifCommand1. Caption =“關(guān)閉通信口" 設(shè)置串口DCB 設(shè)備控制塊comset =
20、“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)" ,16endendifEnd SubSub Form1-keyPress (keyAscii As Integer)Dim nsend As integer ,x As integerDim Lpstate As COMS
21、TAT 通信狀態(tài)塊Static inbuff as stringinbuff = imbuff + Chr ( KeyAscii)x = GetCommError (ncid ,Lpstate) 讀取當(dāng)前串口錯誤或狀態(tài)if lpstate. cbOutQue < 512 Then 送緩沖區(qū)有空間否?Nsend = WriteComm(nCid ,inbuff ,Len (inbuff) ) 發(fā)送inbuffif Nsend < = 0 then Nsend = - Nsend 忽略錯誤inbuff = Mid (inbuff ,Nsend + 1) 清除已發(fā)送的字符end ifen
22、d 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)付各種串行通信的問題。另外還可以用文件輸入/ 輸出的方法完成簡單的通信應(yīng)用程序,如撥號。它用我們非常熟悉的BASIC 輸入/ 輸出指令,如:OPEN、CLOSE、GET、PUT(PRINT、WRITE) 、ERR 來完成打開、關(guān)閉、讀、寫和檢錯通信口的功能。由于
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度新能源儲能項目農(nóng)民工勞務(wù)合同規(guī)范4篇
- 二零二五版年薪制勞動合同:大數(shù)據(jù)分析行業(yè)專家協(xié)議4篇
- 2025年度農(nóng)行房貸利率調(diào)整專項合同書2篇
- 二零二五白蟻滅治與老舊建筑改造服務(wù)合同3篇
- 二零二五年度建筑工程合同履行補充協(xié)議范本3篇
- 個人承包旅游景區(qū)開發(fā)與經(jīng)營合同(2024版)3篇
- 二零二五年度節(jié)能環(huán)保門窗定制采購合同2篇
- 二手住宅買賣合同(2024版)范例2篇
- 二零二五版木托盤租賃與物流信息化建設(shè)合同4篇
- 管理決策知到智慧樹章節(jié)測試課后答案2024年秋山西財經(jīng)大學(xué)
- 飛鼠養(yǎng)殖技術(shù)指導(dǎo)
- 壞死性筋膜炎
- 2024輸血相關(guān)知識培訓(xùn)
- 整式的加減單元測試題6套
- 股權(quán)架構(gòu)完整
- 山東省泰安市2022年初中學(xué)業(yè)水平考試生物試題
- 注塑部質(zhì)量控制標(biāo)準(zhǔn)全套
- 人教A版高中數(shù)學(xué)選擇性必修第一冊第二章直線和圓的方程-經(jīng)典例題及配套練習(xí)題含答案解析
- 銀行網(wǎng)點服務(wù)禮儀標(biāo)準(zhǔn)培訓(xùn)課件
- 二年級下冊數(shù)學(xué)教案 -《數(shù)一數(shù)(二)》 北師大版
- 晶體三極管資料
評論
0/150
提交評論