|
VB6.0環(huán)境下利用Mscomm控件實(shí)現(xiàn)串行通信 摘 要: 本文簡(jiǎn)要介紹了VB6.0中Mscomm通信控件的屬性和使用方法,并結(jié)合具體實(shí)例給出了基本的通信程序。 Abstract: This paper briefly introduces the principle and
method of Mscomm object of Visual basic 6.0, and with a real example
basic program codes are given. Visual Basic 6.0以其強(qiáng)大的功能、使用簡(jiǎn)單、能在短時(shí)間內(nèi)開發(fā)出高效的通信程序而成為Windows系統(tǒng)開發(fā)的主要編程語(yǔ)言。首先表現(xiàn)在VB可直接使用戶自定義控件VBX或OCX文件;其次表現(xiàn)在VB可通過調(diào)用動(dòng)態(tài)鏈接庫(kù)(DLL,dynamic link library)來加快應(yīng)用程序關(guān)鍵部分的執(zhí)行速度。利用VB提供的這些功能可方便地完成程序設(shè)計(jì),如串行編程等,本文將介紹VB6.0通信控件Mscomm .vbx及其編程方法,并結(jié)合實(shí)例給出計(jì)算機(jī)與單片機(jī)進(jìn)行數(shù)據(jù)通信的基本程序。 1 VB6.0實(shí)現(xiàn)串行通信方法 VB提供的通信控件Mscomm32.ocx,使用前只需從Project菜單下的Components中選擇Microsoft Comm Control6.0把Mscomm32.ocx控件調(diào)入工具框中即可使用。利用該控件可對(duì)串行通信的數(shù)據(jù)發(fā)送和接收進(jìn)行 設(shè)置,還可對(duì)串口狀態(tài)及串行通信的信息格式和協(xié)議進(jìn)行設(shè)置。在通信過程中可以通過觸發(fā)OnComm事件來追蹤、處理通信和錯(cuò)誤事件的發(fā)生。由于每個(gè)通信控件對(duì)應(yīng)一個(gè)串口,如果要訪問多個(gè)通信口,則要設(shè)計(jì)多個(gè)通信控 件。 1通信方式 (1) 事件驅(qū)動(dòng)方式 它是一種功能很強(qiáng)的處理串行通信問題的方法,在實(shí)際工作中,往往要處理許多通信中的相關(guān)事件,可通過 對(duì)OnComm屬性值進(jìn)行編程來處理,它也包括檢 測(cè)和處理通信錯(cuò)誤等方面的問題,CommEvent值返回最近的通信事件或錯(cuò)誤的數(shù) 字代碼。 (2) 查詢方式 在每個(gè)重要的程序功能之后檢查CommEvent屬性值來檢測(cè)事件和通信錯(cuò)誤。這種方式常用于應(yīng)用程序較簡(jiǎn)單和相對(duì)獨(dú)立的應(yīng)用程序設(shè)計(jì)中。 2 通信控件的基本屬性 為支持串行通信的實(shí)現(xiàn),VB6.0中Mscomm控件提供了眾多的串行通信屬性, 主要有: CommPort:設(shè)置和返回PC機(jī)串行端口號(hào); Settings:初始化傳輸波特率、奇偶校驗(yàn)位、數(shù)據(jù)位寬度和停止位寬度; Input:從輸入緩沖區(qū)中讀取數(shù)據(jù); InputLen:輸入緩沖區(qū)數(shù)據(jù)長(zhǎng)度; InputMode:輸入模式,ASCII字符或二進(jìn)制數(shù)據(jù); Output:將數(shù)據(jù)寫入輸出緩沖區(qū); InBufferSize:設(shè)置并返回接收緩沖區(qū)的字節(jié)數(shù); OutBufferSize:設(shè)置并返回輸出緩沖區(qū)的字節(jié)數(shù); PortOpen:布爾型,用于打開或關(guān)閉串行通信端口; OnComm:在發(fā)生通訊事件或錯(cuò)誤時(shí),將觸發(fā)OnComm事件,CommEvent屬性值將被改變; Rthreshold:引發(fā)接收事件的字節(jié)數(shù),為0時(shí)不引發(fā)接收事件; Sthreshold:引發(fā)發(fā)送事件的字節(jié)數(shù),為0時(shí)不引發(fā)發(fā)送事件; …… …… 2 實(shí)例 本例主要介紹以MCS-51系列單片機(jī)為基礎(chǔ)的智能化儀表與微機(jī)的數(shù)據(jù)通信軟件的設(shè)計(jì)方法。系統(tǒng)主站為一臺(tái)微機(jī), 子站為16個(gè)以單片機(jī)為主并利用串口可收發(fā)數(shù) 據(jù)的智能儀器組成,采用RS-232通信標(biāo)準(zhǔn)的半雙工通信模式。主站 與子站之間為總線型網(wǎng)絡(luò)結(jié)構(gòu),以主站輪詢子站的方式進(jìn)行數(shù)據(jù)通信。由于16個(gè)子站與主站的同一串口連接,為 了避免爭(zhēng)奪通信權(quán)現(xiàn)象,通信時(shí),由上位機(jī)首先發(fā)一地址幀(1),建立連接,接著發(fā)出數(shù)據(jù)幀(0),下位機(jī)在接收到上位機(jī)發(fā)來的數(shù)據(jù)后,進(jìn)行糾錯(cuò)后,回發(fā)數(shù)據(jù)(0),如果在規(guī)定的時(shí)間內(nèi)上位機(jī)收不到應(yīng)答數(shù)據(jù),即認(rèn)為本次通信失敗。 在系統(tǒng)軟件窗體(Form)中加入一個(gè)通信控件(Mscomm)和二個(gè)定時(shí)器控件(Timer)。通信控件用于發(fā)送和接收數(shù)據(jù),定時(shí)器控件(Timer1)用于控制主站定時(shí)向每個(gè)子站發(fā)送下行命令,定時(shí)器控件(Timer2)用于主站接收子站數(shù)據(jù)超時(shí)控制。 1 控件的初始化 在窗體事件中對(duì)Mscomm的一些屬性進(jìn)行設(shè)置 Mscomm.Commport=2 '利用串口COM2進(jìn)行通訊 Mscomm.InputLen=0 '讀取接收緩沖區(qū)的所有字符 Mscomm.OutBuffersize=1024 '設(shè)置發(fā)送緩沖區(qū)為512字節(jié) Mscomm.InBufferSize=1024 '設(shè)置接收緩沖區(qū)為2048字節(jié) Mscomm.OutBufferCount=0 '清除發(fā)送緩沖區(qū) Mscomm.InBufferCount=0 '清除接收緩沖區(qū) Mscomm.InputMode=comInputModeBinary '數(shù)據(jù)傳輸設(shè)置為二進(jìn)制格式 Mscomm.Rthreshold=Receive_byte '設(shè)置為主站每次接收Receive_Byte字節(jié), '可觸發(fā)On_Comm Mscomm.PortOpen=True '打開通信口COM2 Timer1.Inteval=2000 '設(shè)置2秒發(fā)送定時(shí)時(shí)間間隔 Timer2.Enabled=False '在發(fā)送下行命令后啟動(dòng)Timer2超時(shí)定時(shí) '數(shù)據(jù)發(fā)送尚未開始 Mscomm_send=False '下行命令傳輸尚未開始 Mscomm_Receive=False '接收數(shù)據(jù)尚未開始 2 數(shù)據(jù)的發(fā)送和接收 MSComm控件支持以文本和二進(jìn)制格式傳輸數(shù)據(jù),由于下位機(jī)為單片機(jī),處理二進(jìn)制數(shù)據(jù)方便快速, 因此本例以二進(jìn)制格式發(fā)送和接收數(shù)據(jù)。為此,先定義三個(gè)用來存放發(fā)送和接收數(shù)據(jù)的Byte類型數(shù)組OutAa(2),OutBb(n),InAa()(n依所發(fā)數(shù)據(jù)長(zhǎng)度而定),還要定義三個(gè)用來發(fā)送和接收數(shù)據(jù)的Variant類型變量OutA,OutB,InA。在接收數(shù)據(jù)時(shí)采用事件驅(qū)動(dòng)法, 當(dāng)接收緩沖區(qū)有RTHreshold個(gè)數(shù)據(jù)時(shí),CommEvent屬性被置為comEvReceive,并觸發(fā)OnComm事件,因此,RTHreshold的值即為要接收的數(shù)據(jù)。如果在規(guī)定時(shí)間內(nèi)上位機(jī)得不到應(yīng)答信息,將觸發(fā)時(shí) 鐘控件的定時(shí)事件報(bào)錯(cuò)。 (1) 數(shù)據(jù)發(fā)送程序 Mscomm .RTSEnable=False '置為發(fā)送狀態(tài) Mscomm .Setting="9600,m,8,1" '設(shè)置波特率、校驗(yàn)位(1)、數(shù)據(jù)位、停止位 Mscomm .OutBufferCount=0 '清除發(fā)送緩沖區(qū) OutA=OutAa ' Mscomm .Output=OutA '發(fā)送地址幀數(shù)據(jù) Do DoEAvents '轉(zhuǎn)交控制權(quán) Loop Until Mscomm .OutBufferCount=0 '發(fā)送緩沖區(qū)清空 Mscomm .Setting="9600,s,8,1" '設(shè)置校驗(yàn)位(0) OutB=OutBb ' Mscomm .Output=OutB '發(fā)送數(shù)據(jù) Do DoEvents '轉(zhuǎn)交控制權(quán) Loop Until Mscomm .OutBufferCount=0 ' Mscomm .InBufferCount=0 '清除接收緩沖區(qū) Mscomm .RTHreshold=8 '所要接收的數(shù)據(jù)長(zhǎng)度 Mscomm .RTSEnabled=True '轉(zhuǎn)為接收狀態(tài) Timer.Enabled=True '啟動(dòng)定時(shí)器 (2)數(shù)據(jù)接收程序 Sub Mscomm_OnComm() Select Case Mscomm .CommEvent Case comEventBreak Case comEventCDTO Case comEventCTSTO Case comEventDSRTO Case comEventFrame Case comEventOverrun Case comEventRxOver Case comEventRxParity Case comEventTxFull Case comEventDCB Case comEvCD Case comEvCTS Case comEvDSR Case comEvRing Case comEvEOF Case comEvReceive InA=Mscomm.Input InAa=InA Mscomm .PortOpen=False Timer.Enabled=False Call process Case comEvSend End Select End Sub Private Sub Timer.Timer() Timer.Enabled=False Mscomm .PortOpen=False MsgBox "超時(shí)!通信失?。?/span>" End Sub |
|
|