![VB串口通信詳解WORD_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/fd876d8c-34f7-4486-b895-372bbd708d68/fd876d8c-34f7-4486-b895-372bbd708d681.gif)
![VB串口通信詳解WORD_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/fd876d8c-34f7-4486-b895-372bbd708d68/fd876d8c-34f7-4486-b895-372bbd708d682.gif)
![VB串口通信詳解WORD_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/fd876d8c-34f7-4486-b895-372bbd708d68/fd876d8c-34f7-4486-b895-372bbd708d683.gif)
![VB串口通信詳解WORD_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/fd876d8c-34f7-4486-b895-372bbd708d68/fd876d8c-34f7-4486-b895-372bbd708d684.gif)
![VB串口通信詳解WORD_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/fd876d8c-34f7-4486-b895-372bbd708d68/fd876d8c-34f7-4486-b895-372bbd708d685.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、文檔可能無(wú)法思考全面,請(qǐng)瀏覽后下載! VB串口通信目前,Visual Basic (簡(jiǎn)稱VB) 已成為WINDOWS 系統(tǒng)開(kāi)發(fā)的主要語(yǔ)言,以其高效、簡(jiǎn)單易學(xué)及功能強(qiáng)大的特點(diǎn)越來(lái)越為廣大程序設(shè)計(jì)人員及用戶所青睞。VB 支持面向?qū)ο蟮某绦蛟O(shè)計(jì),具有結(jié)構(gòu)化的事件驅(qū)動(dòng)編程模式并可以使用無(wú)限擴(kuò)增的控件。在VB 應(yīng)用程序可以方便地調(diào)用WINDOWS API函數(shù),使得編程效率提高,應(yīng)用功能增強(qiáng)。利用VB 提供的這些功能,我們可以有三種方法完成串口通信。一種是用VB 提供的具有強(qiáng)大功能的通信控件;另一種方法是調(diào)用WINDOWS API 函數(shù),使用WINDOWS 提供的通信函數(shù)編寫移植性強(qiáng)的應(yīng)用程序;第三是利用
2、文件的輸入/ 輸出完成,該方法簡(jiǎn)便易行,但有一定的局限性。一、利用通信控件(MSCOMM) 完成串口通信VB 提供了通信控件MSCOMM,文件名為MSCOMM. VBX。該控件可設(shè)置串行通信的數(shù)據(jù)發(fā)送和接收,對(duì)串口狀態(tài)及串行通信的信息格式和協(xié)議進(jìn)行設(shè)置。在通信過(guò)程中可以觸發(fā)OnComm事件,在該事件過(guò)程進(jìn)行數(shù)據(jù)檢驗(yàn)處理及檢錯(cuò),還可以通過(guò)編程訪問(wèn)CommEvent 屬性來(lái)了解通信的情況,進(jìn)行收發(fā)數(shù)據(jù)的處理。每個(gè)通信控件對(duì)應(yīng)一個(gè)串口,如果要訪問(wèn)多個(gè)通信口,則要設(shè)計(jì)多個(gè)通信控件。1、通信控件的事件及基本屬性(1)事件OnComm:通信控件只提供了一個(gè)事件,該事件的觸發(fā)可以對(duì)串口的通信事件及錯(cuò)誤進(jìn)行處
3、理。通過(guò)對(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)、數(shù)據(jù)位、停止位。PortOpen :布爾型、開(kāi)關(guān)通信口。InputLen :從接收緩沖區(qū)讀取字符個(gè)數(shù)。Input ,Output :讀取接收緩沖區(qū)或?qū)懭氚l(fā)送緩沖區(qū)字符。以上五種屬
4、性對(duì)串口完成基本的設(shè)置和操作,下面的三種屬性是描述如何利用VB 提供的事件驅(qū)動(dòng)機(jī)制來(lái)實(shí)現(xiàn)通信。CommEvent :返回通信過(guò)程中產(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 事件,當(dāng)SThreshold = 1 則發(fā)送緩沖區(qū)為空時(shí)就觸發(fā)OnComm事件。利用這一屬性,就可完成發(fā)送數(shù)據(jù)后的一系列操作。如:對(duì)剛發(fā)送的數(shù)據(jù)進(jìn)行處理,當(dāng)串口是和MODEM通
5、信時(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事件。利用這一屬性,就可完成對(duì)串口接收數(shù)據(jù)的處理。2、利用通信控件的實(shí)例Sub Form1 load ()6 / 8form1. show設(shè)置COM1comm1. commport = 1comm1.
6、 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. RThreshold = 1 每一個(gè)字符到接收緩沖區(qū)都觸發(fā)接收事件設(shè)置COM2comm2. commport = 2comm2. Setting = "2400 ,e ,
7、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 禁止接收事件打開(kāi)COM1 ,COM2comm1. Portopen = Truecomm2. Portopen = TrueTimer1. interval = 5000End SubSub
8、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 &HFFprint fNext iEnd SelectEnd SubSub Comm2 OnComm()Select Case Comm2. CommEventCase
9、MSCOMMEVSENDPrint timeEnd SelectEnd SubSub Timer1Timer ()Comm2. output = Second (Now)End sub二、通過(guò)調(diào)用API 函數(shù)實(shí)現(xiàn)通信以上說(shuō)明了用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)鏈接庫(kù)DLL(Dynamic Link Libraries) 的能力,大大擴(kuò)展了其功能。WINDOWS 本身提供了API 函數(shù)包括三大動(dòng)態(tài)鏈接庫(kù): KERNEL 庫(kù)、GDI 庫(kù)、USER 庫(kù)
10、,通過(guò)VB 用戶可以直接調(diào)用這些庫(kù)中的函數(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 過(guò)程名Lib庫(kù)名Alias別名 ( ByVal 參數(shù)As 類型)Declare Function 函數(shù)名Lib庫(kù)名Alias別名 ( ByVal參數(shù)As 類型) As 類型在聲明中:DECLARE 表示聲明DLL 中的函數(shù),當(dāng)聲明是不具有返回值的過(guò)程時(shí)用SUB 關(guān)鍵字,而如果調(diào)用的函數(shù)具有返回值,則必須用FUNCTION 關(guān)鍵字將其聲明
11、為函數(shù)并在聲明語(yǔ)句的最后用AS 指明函數(shù)返回值的類型。LIB 關(guān)鍵字表示當(dāng)前聲明的過(guò)程或函數(shù)是庫(kù)名所指定的庫(kù)中函數(shù)而非VB本身的函數(shù)。庫(kù)名,就是對(duì)應(yīng)動(dòng)態(tài)鏈接庫(kù)的名稱,其中通信函數(shù)在USER 庫(kù)中。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 提供的通信函數(shù)為了方便說(shuō)明,我們將有關(guān)通信的函數(shù)及相關(guān)的數(shù)據(jù)結(jié)構(gòu)放在全局模塊中,文件名為COMM.BAS(見(jiàn)API 編程函數(shù)實(shí)例) 。以下是這些函數(shù)的基本介紹:(1)OpenComm(
12、IpComName As String ,wInQueue As Inte-ger ,wOutQueue As Integer)IpComName :設(shè)備名,以“COMn”的形式來(lái)說(shuō)明,n 為設(shè)備號(hào);wInQueue 、wOutQueue :分別以字節(jié)為單位說(shuō)明發(fā)送、接收緩沖區(qū)的大小。該函數(shù)調(diào)用成功返回打開(kāi)的設(shè)備號(hào),否則返回一負(fù)數(shù)代表錯(cuò)誤信息碼。(2)SetCommState ( IpDCB As DCB)IpDCB :是DCB 結(jié)構(gòu)存放設(shè)備所希望的通信設(shè)置(DCB 結(jié)構(gòu)如COMM.BAS 中所示) ,其中DCB 的ID 成員必須標(biāo)識(shí)該設(shè)備。如果函數(shù)調(diào)用成功返回0 ;否則,返回值小于0。(3)
13、ReadComm(nCid As Integer , IpBuf As String ,nSize As Integer)WriteComm(nCid As Integer , IpBuf As String ,nSize As In-teger)這是用來(lái)對(duì)通信設(shè)備進(jìn)行讀寫的函數(shù),nCid :說(shuō)明要讀寫的通信設(shè)備號(hào), IpBuf :為讀寫緩沖區(qū),nSize :為要讀寫的字節(jié)數(shù)。如果讀寫成功,返回讀寫的字節(jié)數(shù),否則是小于0 的值,并且其絕對(duì)值為讀寫的字節(jié)數(shù)。(4)Closecomm(nCid As Integer)該函數(shù)關(guān)閉nCid 所指定的通信設(shè)備,并且釋放分配給設(shè)備的發(fā)送,接收緩沖存儲(chǔ)器,調(diào)
14、用成功返回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 As COMSTAT)該函數(shù)檢取nCid 指定的設(shè)備最近的錯(cuò)誤值和當(dāng)前狀態(tài),IpStat :是COMSTAT結(jié)構(gòu),具體形式如COMM.BAS 中所定義的。返回值為COMM.BAS 中
15、帶CE- 的常量的某種組合。3. 用API 函數(shù)編程實(shí)例這個(gè)例子是一仿真發(fā)送機(jī),將從鍵盤輸入的字符發(fā)送給COM端口。在FORM中加一按鈕COMMAND1 來(lái)關(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
16、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 IntegercbOutQue As IntegerEnd TypeDeclare Function OpenComm Lib User(ByVal IpComName AsString , ByVal
17、 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 , ByVal nSize As Integer) As IntegerDeclare Function WriteComm Lib User(ByVal nCid As Integer
18、, 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 IntegerDeclare Function GetCommError Lib User (ByVal nCid AsInteger , IpStat As COMSTAT) As
19、 IntegerGlobal IpDCB As DCBGlobal nCid As IntegerSub Form1 load ()Dim comset As Stringcomset =“COM2"nCid = OpenComm(comset ,512 ,512) 打開(kāi)COM2 設(shè)置接收,發(fā)送緩沖區(qū)為512 字節(jié)If nCid < 0 Then 處理錯(cuò)誤MsgBox“不能打開(kāi)COM:" + Str (nCid) +“Error Num2ber :" + Str (nCid) ,16endend ifCommand1. Caption =“關(guān)閉通信口&quo
20、t; 設(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)" ,16endendifEnd SubSub Form1-keyPress (keyAscii As Integer)Dim nsend As integer ,x As in
21、tegerDim 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 ,Len (inbuff) ) 發(fā)送inbuffif Nsend < = 0 then Nsend = - Nsend 忽略錯(cuò)誤inbuff = Mid (inbuff ,Nse
22、nd + 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)付各種串行通信的問(wèn)題。另外還可以用文件輸入/ 輸出的方法完成簡(jiǎn)單的通信應(yīng)用程序,如撥號(hào)。它用我們非常熟悉的BASIC 輸入/ 輸出指令,如:OPEN、CLOSE、GET、PUT(PRINT、WRITE) 、ERR 來(lái)完成打開(kāi)、關(guān)閉、讀、寫和檢錯(cuò)通信口的功能。由于以上指令常在BASIC 中使用,所以不在
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Module2 Unit1 Whats your name(說(shuō)課稿)-2024-2025學(xué)年外研版(一起)英語(yǔ)一年級(jí)上冊(cè)
- 2《吃水不忘挖井人》(說(shuō)課稿)-2024-2025學(xué)年統(tǒng)編版(2024)語(yǔ)文一年級(jí)下冊(cè)
- 15《搭船的鳥(niǎo)》說(shuō)課稿-2024-2025學(xué)年統(tǒng)編版語(yǔ)文三年級(jí)上冊(cè)
- 2023八年級(jí)數(shù)學(xué)上冊(cè) 第三章 位置與坐標(biāo)2 平面直角坐標(biāo)系第3課時(shí) 建立適當(dāng)?shù)钠矫嬷苯亲鴺?biāo)系求點(diǎn)的坐標(biāo)說(shuō)課稿 (新版)北師大版
- 15堅(jiān)持才會(huì)有收獲(說(shuō)課稿)-部編版道德與法治二年級(jí)下冊(cè)
- 2023七年級(jí)道德與法治上冊(cè) 第二單元 友誼的天空 第五課 交友的智慧 第2框 網(wǎng)上交友新時(shí)空說(shuō)課稿 新人教版
- 1假期有收獲 說(shuō)課稿-2023-2024學(xué)年道德與法治二年級(jí)上冊(cè) 統(tǒng)編版
- 2025外墻紙皮磚合同
- 6的乘法口訣(說(shuō)課稿)-2024-2025學(xué)年人教版數(shù)學(xué)二年級(jí)上冊(cè)
- Unit 3 Fascinating Parks Discover useful structures 說(shuō)課稿-2024-2025學(xué)年高中英語(yǔ)人教版(2019)選擇性必修第一冊(cè)
- 大型活動(dòng)中的風(fēng)險(xiǎn)管理與安全保障
- 課題申報(bào)書:個(gè)體衰老差異視角下社區(qū)交往空間特征識(shí)別與優(yōu)化
- 江蘇省招標(biāo)中心有限公司招聘筆試沖刺題2025
- 綜采工作面過(guò)空巷安全技術(shù)措施
- 云南省麗江市2025屆高三上學(xué)期復(fù)習(xí)統(tǒng)一檢測(cè)試題 物理 含解析
- 建材材料合作合同范例
- 2025年集體經(jīng)濟(jì)發(fā)展計(jì)劃
- 2024-2025學(xué)年人教版八年級(jí)上冊(cè)地理期末測(cè)試卷(二)(含答案)
- 雙方共同買車合同范例
- 醫(yī)務(wù)從業(yè)人員行為規(guī)范培訓(xùn)
- 中小學(xué)校食品安全管理現(xiàn)狀與膳食經(jīng)費(fèi)優(yōu)化方案
評(píng)論
0/150
提交評(píng)論