VB串口通信程序設(shè)計典型實例_第1頁
VB串口通信程序設(shè)計典型實例_第2頁
VB串口通信程序設(shè)計典型實例_第3頁
VB串口通信程序設(shè)計典型實例_第4頁
VB串口通信程序設(shè)計典型實例_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第6章VB串口通信程序設(shè)計典型實例利用VB開發(fā)串口通信程序既可以使用MSComm控件也可以調(diào)用WindowsAPI函數(shù)實現(xiàn)。不過,只要MSComm控件可以被選用,我們推薦選擇此控件實現(xiàn),因為MSComm控件的功能和API調(diào)用一樣強,甚至比它還好且使用起來更加簡單。在本章提供的串口通信程序設(shè)計中,除了PC與PC串口通信外,PC與單片機、PC與智能儀表、PC與PLC、PC與GSM短信模塊等串口通信任務(wù)的實現(xiàn)均采用MSComm控件。PC與PC串口通信程序設(shè)計當兩臺串口設(shè)備通信距離較近時,可以直接連接,最簡單的情況,在通信中只需3根線發(fā)送線、接收線、信號地線)便可實現(xiàn)全雙工異步串行通信。本設(shè)計通過兩臺

2、PC串口3線連接,介紹了利用API函數(shù)和MSComm控件設(shè)計串口通信程序的方法,包括字符與文件的發(fā)送與接收。PC與PC串口通信程序設(shè)計目的(1)掌握PC與PC串口通信的線路連接方法。(2)利用MSComm控件和API函數(shù)實現(xiàn)PC與PC串口通信的程序設(shè)計方法。PC與PC串口通信程序設(shè)計用軟、硬件本設(shè)計用到的硬件和軟件清單如表6-1所示。表6-1設(shè)計用軟硬件序號名稱數(shù)量1PC或IPC22串口通信線(三線制)13VisualBasic6.016.1.3PC與PC串口通信程序硬件線路圖線路說明,在計算機通電前,按圖6-1所示將兩臺PC通過串口線連接起來:計算機A串口COM1端口的TXD與計算機B串口C

3、OM1端口的RXD相連,計算機A串口COM1端口的RXD與計算機B串口COM1端口的TXD相連,計算機A串口COM1端口的GND與計算機B串口COM1端口的GND相連。VisualBasic數(shù)據(jù)采集與串口通信測控應(yīng)用實戰(zhàn)第6章VB串口通信程序設(shè)計典型實例 圖6-1PC與PC串口通信線路6.1.4設(shè)計任務(wù)利用MSComm控件和VBAPI函數(shù)編寫程序?qū)崿F(xiàn)PC與PC串口通信。任務(wù)要求,兩臺計算機互發(fā)字符并自動接收,如一臺計算機輸入字符串“Pleasereturnabcl23”,單擊“發(fā)送字符”命令,另一臺計算機若收到,就輸入字符串a(chǎn)bcl23”,單擊“發(fā)送字符”命令,信息返回到第一組的計算機。實際上

4、就是編寫一個簡單的雙機聊天程序。6.l.5任務(wù)實現(xiàn)利用MSComm控件實現(xiàn)字符型數(shù)據(jù)發(fā)送與接收1建立新工程VB使用“工程”來管理每一個應(yīng)用程序要使用的所有文件,每建立一個新程序,就要新建一個工程。一個工程由窗體、標準模塊、控件及應(yīng)用所需的開發(fā)環(huán)境設(shè)置等組成。運行VB程序,出現(xiàn)“新建工程”對話框,選擇“標準EXE”,單擊“打開”命令按鈕,進入VB工程集成開發(fā)環(huán)境,窗體設(shè)計器中自動出現(xiàn)一個名為Forml的空白窗體。2程序界面設(shè)計向空白窗體添加各種控件,以完成預(yù)定的各種功能。開始一個項目的設(shè)計時,VB的工具箱中會有許多默認的控件讓設(shè)計者予以選用,這些原本就出現(xiàn)在工具箱中的控件是內(nèi)置控件,它提供了一些

5、基本的系統(tǒng)設(shè)計組件給設(shè)計者,但功能比較特別的控件就不會出現(xiàn)在其中,如用來設(shè)計串口通信功能的控件MSComm就不在其中。(1)添加串口通信控件MSComm。由于VB的串行通信組件并不會主動出現(xiàn)在工具箱里中,當我們需要MSComm控件時,首先要把它加入到工具箱中。讓MSComm控件出現(xiàn)在工具箱中的步驟如下。選擇“工程”菜單下的“部件.”子菜單,在彈出的“部件”對話框中,在“控件”選項卡屬性中選中“MicrosoftCommControl6.0”復(fù)選框,單擊“確定”按鈕后,在工具箱中就出現(xiàn)了一個形似“電話”的圖標,它就是MSComm控件。工具箱中有了MSComm控件,就可以選擇MSComm控件的圖標

6、后將其添加到程序窗體上,利用該控件編程,PC就可以通過VB實現(xiàn)與串口設(shè)備的串口通信了。由于每個使用的MSComm控件對應(yīng)著一個串行端口,如果應(yīng)用程序需要訪問多個串行圖6-2程序窗體界面端口,必須添加多個MSComm控件。(2)為了實現(xiàn)連續(xù)的自動接收,將工具箱中的Timer控件添加到程序窗體上。(3)添加兩個文本框控件:Textl和Text2,用于輸入要發(fā)送的字符和顯示要接收的字符。(4)添加兩個標簽控件:Labell和Label2,作為發(fā)送和接收字符區(qū)的標簽。(5)添加一個按鈕控件:Commandl執(zhí)行發(fā)送字符命令。程序設(shè)計界面如圖6-2所示。3屬性設(shè)置從屬性窗口設(shè)置屬性時,只需從對象列表框中

7、選擇待設(shè)置屬性的對象,然后從屬性列表的左列選擇屬性,最后在屬性列表的右列中輸入或選擇新的屬性值。程序窗體、控件對象的主要屬性設(shè)置如表6-2所示。表6-2窗體、控件對象的主要屬性設(shè)置控件類型主要屬性功能Form(名稱)=COMForm窗體控件BorderStyle=3運行時窗體固定大小Caption=PC與PC串口通信窗體標題欄顯示程序名稱Label(名稱)=Label1標簽控件Caption=顯示接收字符區(qū):標簽文本Label(名稱)=Label2標簽控件Caption=輸入發(fā)送字符區(qū):標簽文本TextBox(名稱)=Textsend文本框控件MultiLine=True允許多行顯示Scrol

8、lBars=2-Vertical垂直滾動條可用TextBox(名稱)=TextReceive文本框控件MultiLine=True允許多行顯示ScrollBars=2-Vertical垂直滾動條可用CommandButton(名稱)=Cmdsend按鈕控件Caption=發(fā)送字符手動發(fā)送字符MSComm(名稱)=MSComm1串口通信控件其他屬性在程序中設(shè)置Timer(名稱)=Timer1時鐘控件Enabled=True時鐘初始可用Interval=500設(shè)置發(fā)送周期(ms).兩臺計算機中VB程序界面及屬性設(shè)置應(yīng)完全相同,尤其MSComm控件的InputMode和Settings屬性值應(yīng)相同。

9、4程序代碼設(shè)計程序要實現(xiàn)自動發(fā)送或讀取,在VB程序中有兩個方式可以達到,一是查詢方式,利用查詢事件是否發(fā)生,當發(fā)生時,去執(zhí)行默認的程序代碼??梢允褂糜嫊r器控件(Timer),該控件屬性中的Interval可以控制計時器被啟動的時間間隔,當時間間隔一到,便會執(zhí)行原先放在計時器中的程序代碼。下面是利用查詢方式編寫的PC與PC串口通信的參考程序,代碼如下所示:串口初始化PrivateSubForm_Load()設(shè)置通信端口號為COM1設(shè)置串口1參數(shù)接收文本型數(shù)據(jù)打開通信端口1MSComm1.CommPort=1MSComm1.Settings=9600,n,&1MSComm1.InputMode=0

10、MSComm1.PortOpen=TrueEndSub把字符通過串口發(fā)送出去PrivateSubCmdsend_Click()IfTextsend.Text=Thenpp=MsgBox(發(fā)送的數(shù)據(jù)不能為空!,16)ExitSubEndIfMSComm1.Output=Trim(Textsend.Text)Fori=1To20000000NextiEndSub通過時鐘控制來自動接收字符PrivateSubTimer1_Timer()將緩沖區(qū)內(nèi)的數(shù)據(jù)讀入buf變量中判斷緩沖區(qū)內(nèi)是否存在數(shù)據(jù)Dimbuf$buf=Trim(MSComm1.Input)IfLen(buf)0ThenTextReceiv

11、e.Text=TextReceive.Text+Chr(13)+Chr(10)+buf回車換行EndIfEndSub關(guān)閉通信端口,停止程序運行PrivateSubCmdquit_Click()MSComm1.PortOpen=FalseUnloadMeEndSub在Windows系統(tǒng)環(huán)境下,串口是系統(tǒng)資源的一部分。應(yīng)用程序要使用串口進行通信,必須在使用之前向操作系統(tǒng)提出資源申請要求(打開串口),通信完成后必須釋放資源(關(guān)閉串口)。在Windows系統(tǒng)的系統(tǒng)函數(shù)中,均包含了支持通信中斷的功能。二是使用事件方式。MSComm控件提供事件回應(yīng)功能,可以利用此功能達到自動發(fā)送/接收的目的。下面是利用事

12、件方式編寫的PC與PC串口通信的參考程序,界面設(shè)計與圖6-2基本相同,區(qū)別是事件方式不需要時間控件。串口初始化PrivateSubForm_Load()設(shè)置通信端口號為COM1MSComml.CommPort=1MSComml.Settings=9600,n,&1設(shè)置串口參數(shù)MSComml.InputMode=0接收文本型數(shù)據(jù)MSComml.RThreshold=1接收緩沖區(qū)每收到一個字符都會使MSComm控件觸發(fā)OnComm事件MSComm1.PortOpen=True打開通信端口1EndSub把字符通過串口發(fā)送出去啟動定時器PrivateSubCmdsend_Click()IfTextse

13、nd.Text=Thenpp=MsgBox(發(fā)送的數(shù)據(jù)不能為空!,16)ExitSubEndIfMSComm1.Output=Trim(Textsend.Text)EndSubMSComm的OnComm事件程序由CommEvent屬性值的不同,將各自的程序代碼寫入相關(guān)的子程序中只要RThresold中的設(shè)定字符數(shù)到達時便會使得CommEvent屬性值變成comEvReceive因此接收的子程序便會被執(zhí)行PrivateSubMSComm1_OnComm()Dimbuf$SelectCaseMSComm1.CommEvent通過取代每一個case表達式來處理每個事件與錯誤CasecomEvCDCD

14、線的狀態(tài)發(fā)生變化CasecomEvCTSCTS線的狀態(tài)發(fā)生變化CasecomEvDSRDSR線的狀態(tài)發(fā)生變化CasecomEvReceivebuf=Trim(MSComm1.Input)將緩沖區(qū)內(nèi)的數(shù)據(jù)讀入buf變量中CasecomEvSendEndSelectTextReceive.Text=TextReceive.Text&bufEndSub停止程序運行PrivateSubCmdquit_Click()UnloadMeEndSub關(guān)閉通信端口,PrivateSubForm_Unload(CancelAsInteger)MSComm1.PortOpen=FalseEndSub5.運行程序程序

15、設(shè)計、調(diào)試完畢,單擊工具欄快捷按鈕“啟動”運行程序。兩臺計算機同時運行本程序。注意首先在一臺計算機程序窗體中發(fā)送字符區(qū)輸入要發(fā)送的字符,如“我是第一組,收到請回話!”,單擊“發(fā)送字符”按鈕,發(fā)送區(qū)的字符串通過COM1口發(fā)送出去。如果聯(lián)網(wǎng)通信的另一臺計算機程序收到字符,則返回字符串,如“收到,我是第2組!”如果通信正常該字符串將顯示在接收區(qū)中。程序運行界面如圖6-3所示。圖6-3程序運行界面利用API函數(shù)實現(xiàn)字符型數(shù)據(jù)發(fā)送與接收1建立新工程運行VB,創(chuàng)建標準的工程項目文件,圖6-4程序窗體界面添加兩個TextBox控件,用于輸入要發(fā)送的字符和顯示需接收的字符。添加兩個Label控件,作為發(fā)送和接

16、收字符區(qū)的標簽。添加一個Timer控件,用于周期性地讀取串口數(shù)據(jù)。添加兩個CommandButton控件,分別執(zhí)行發(fā)送字符、關(guān)閉程序等命令。設(shè)計的程序界面如圖6-4所示。2屬性設(shè)置程序窗體、控件對象的主要屬性設(shè)置如表6-3窗體、控件對象的主要屬性設(shè)置控件類型名稱主要屬性功能FormCOMFormBorderStyle=3運行時窗體固定大小Caption=API串口通訊窗體標題欄顯示程序名稱LabelLabellCaption=發(fā)送數(shù)據(jù)區(qū):標簽LabelLabel2Caption=接收數(shù)據(jù)區(qū):標簽TextBoxTextsendMultiLine=True允許多行顯示ScrollBars=2-Ve

17、rtical垂直滾動條可用TextBoxTextReceiveMultiLine=True允許多行顯示ScrollBars=2-Vertical垂直滾動條可用CommandButtonBTNSendCaption=發(fā)送數(shù)據(jù)手動間斷發(fā)送字符CommandButtonBTNCloseComCaption=關(guān)閉程序關(guān)閉程序TimerTMRCommInterval=500設(shè)置發(fā)送周期(ms)3程序代碼設(shè)計在程序標準模塊SerialPort.bas的說明部分放置使用的API函數(shù)聲明及所用的結(jié)構(gòu)、常數(shù)的聲明:OptionExplicitGlobalComNumAsLongGlobalbRead(255)A

18、sByteTypeCOMSTATfCtsHoldAsLongfDsrHoldAsLongfRlsdHoldAsLongfXoffHoldAsLongfXoffSentAsLongfEofAsLongfTximAsLongfReservedAsLongcbInQueAsLongcbOutQueAsLongEndTypeTypeCOMMTIMEOUTSReadIntervalTimeoutAsLongReadTotalTimeoutMultiplierAsLongReadTotalTimeoutConstantAsLongWriteTotalTimeoutMultiplierAsLongWrite

19、TotalTimeoutConstantAsLongEndTypeTypeDCBDCBlengthAsLongBaudRateAsLongfBinaryAsLongfParityAsLongfOutxCtsFlowAsLongfOutxDsrFlowAsLongfDtrControlAsLongfDsrSensitivityAsLongfTXContinueOnXoffAsLongfOutXAsLongfInXAsLongfErrorCharAsLongfNullAsLongfRtsControlAsLongfAbortOnErrorAsLongfDummy2AsLongwReservedAs

20、IntegerXonLimAsIntegerXoffLimAsIntegerByteSizeAsByteParityAsByteStopBitsAsByteXonCharAsByteXoffCharAsByteErrorCharAsByteEofCharAsByteEvtCharAsByteEndTypeTypeOVERLAPPEDInternalAsLongInternalHighAsLongoffsetAsLongOffsetHighAsLonghEventAsLongEndTypeTypeSECURITY_ATTRIBUTESnLengthAsLonglpSecurityDescript

21、orAsLongbInheritHandleAsLongEndTypeDeclareFunctionCloseHandleLibkernel32(ByValhObjectAsLong)AsLongDeclareFunctionGetLastErrorLibkernel32()AsLongDeclareFunctionReadFileLibkernel32(ByValhFileAsLong,lpBufferAsAny,ByValnNumberOfBytesToReadAsLong,lpNumberOfBytesReadAsLong,lpOverlappedAsLong)AsLongDeclare

22、FunctionWriteFileLibkernel32(ByValhFileAsLong,lpBufferAsAny,ByValnNumberOfBytesToWriteAsLong,lpNumberOfBytesWrittenAsLong,lpOverlappedAsLong)AsLongDeclareFunctionSetCommTimeoutsLibkernel32(ByValhFileAsLong,lpCommTimeoutsAsCOMMTIMEOUTS)AsLongDeclareFunctionGetCommTimeoutsLibkernel32(ByValhFileAsLong,

23、lpCommTimeoutsAsCOMMTIMEOUTS)AsLongDeclareFunctionBuildCommDCBLibkernel32AliasBuildCommDCBA(ByVallpDefAsString,lpDCBAsDCB)AsLongDeclareFunctionSetCommStateLibkernel32(ByValhCommDevAsLong,lpDCBAsDCB)AsLongDeclareFunctionCreateFileLibkernel32AliasCreateFileA(ByVallpFileNameAsString,ByValdwDesiredAcces

24、sAsLong,ByValdwShareModeAsLong,ByVallpSecurityAttributesAsLong,ByValdwCreationDispositionAsLong,ByValdwFlagsAndAttributesAsLong,ByValhTemplateFileAsLong)AsLongDeclareFunctionFlushFileBuffersLibkernel32(ByValhFileAsLong)AsLong窗體模塊程序如下:初始化串口PrivateSubForm_Load()IfNotInit_Com(COMl:,9600,n,&l)ThenMsgBox

25、端口&”無效!ExitSubEndIfEndSub發(fā)送字符PrivateSubBTNSend_Click()IfWriteCOM32(txt(2)&vbCrLen(txt(2)ThenMsgBox寫入錯誤ExitSubEndIfEndSub向串口寫數(shù)據(jù)FunctionWriteCOM32(COMStringAsString)AsIntegerOnErrorGoTohandelwritelptDimRetBytesAsLong,LenValAsLongDimretvalAsLongIfLen(COMString)255ThenWriteCOM32Left$(COMString,255)Write

26、COM32Right$(COMString,Len(COMString)-255)ExitFunctionEndIfForLenVal=0ToLen(COMString)-1bRead(LenVal)=Asc(Mid$(COMString,LenVal+1,1)NextLenValretval=WriteFile(ComNum,bRead(O),Len(COMString),RetBytes,0)WriteCOM32=RetByteshandelwritelpt:ExitFunctionEndFunction讀取數(shù)據(jù)PrivateSubTMRComm_Timer()DimAnsAsString

27、,iAsInteger,RtnStrAsStringAns=ReadCommPure()IfAns=ThenExitSubRtnStr=RtnStr&CleanStr(Ans)txtRec.Text=RtnStrFlushCommEndSub從串口讀取數(shù)據(jù)FunctionReadCommPure()AsStringOnErrorGoTohandelpurecomDimRetBytesAsLong,iAsInteger,ReadStrAsString,retvalAsLongDimCheckTotalAsInteger,CheckDigitLCAsIntegerretval=ReadFile(C

28、omNum,bRead(O),255,RetBytes,0)ReadStr=If(RetBytes0)ThenFori=0ToRetBytes-1ReadStr=ReadStr&Chr(bRead(i)NextiElseFlushCommEndIfReadCommPure=ReadStrhandelpurecom:ExitFunctionEndFunctionFunctionCleanStr(TextLineAsString)AsStringDimiAsInteger,RtnStrAsStringRtnStr=Fori=1ToLen(TextLine)SelectCaseAsc(Mid$(Te

29、xtLine,i,1)Case&H5DRtnStr=RtnStr&Case&H5BRtnStr=RtnStr&CaseIs=&H30RtnStr=RtnStr&Mid$(TextLine,i,1)Case13RtnStr=RtnStr&Case10RtnStr=RtnStr&CaseElseRtnStr=RtnStr&EndSelectNextiCleanStr=RtnStrEndFunction清空文件緩沖區(qū)FunctionFlushComm()FlushFileBuffers(ComNum)EndFunction初始化端口FunctionInit_Com(ComNumberAsString

30、,ComsettingsAsString)AsBooleanOnErrorGoTohandelinitcomDimComSetupAsDCB,Answer,StatAsCOMSTAT,RetBytesAsLongDimretvalAsLongDimCtimeOutAsCOMMTIMEOUTS,BarDCBAsDCB打開通訊口讀/寫(&HC0000000).必須指定存在的文件(3).ComNum=CreateFile(ComNumber,&HC0000000,0,0&,&H3,0,0)IfComNum=-1ThenMsgBox端口&ComNumber&無效.請設(shè)置正確.,48Init_Com=F

31、alseExitFunctionEndIf超時CtimeOut.ReadIntervalTimeout=20CtimeOut.ReadTotalTimeoutConstant=1CtimeOut.ReadTotalTimeoutMultiplier=1CtimeOut.WriteTotalTimeoutConstant=10CtimeOut.WriteTotalTimeoutMultiplier=1retval=SetCommTimeouts(ComNum,CtimeOut)Ifretval=-1Thenretval=GetLastError()MsgBox端口超時設(shè)定無效&ComNumber

32、&錯誤:&retvalretval=CloseHandle(ComNum)Init_Com=FalseExitFunctionEndIfretval=BuildCommDCB(Comsettings,BarDCB)Ifretval=-1Thenretval=GetLastError()MsgBox無效設(shè)備DCB塊&Comsettings&錯誤:&retvalretval=CloseHandle(ComNum)Init_Com=FalseExitFunctionEndIfretval=SetCommState(ComNum,BarDCB)Ifretval=-1Thenretval=GetLast

33、Error()MsgBox無效設(shè)備DCB塊&Comsettings&錯誤:&retvalretval=CloseHandle(ComNum)Init_Com=FalseExitFunctionEndIfInit_Com=Truehandelinitcom:ExitFunctionEndFunction關(guān)閉程序PrivateSubBTNCloseCom_Click()UnloadMeEndSub關(guān)閉端口PrivateSubForm_Unload(CancelAsInteger)CloseHandle(ComNum)EndSub圖6-5程序運行界面4運行程序程序設(shè)計、調(diào)試完畢,執(zhí)行菜單“運行/啟動

34、”命令或單擊工具欄快捷按鈕“啟動”,運行程序。首先在程序窗體中發(fā)送字符區(qū)輸入要發(fā)送的字符,單擊“發(fā)送數(shù)據(jù)”按鈕,發(fā)送區(qū)的字符串通過C0M1口發(fā)送出去。另一臺計算機發(fā)送數(shù)據(jù),本計算機自動讀入并顯示在接收數(shù)據(jù)區(qū)中。程序運行界面如圖6-5所示。禾U用MSComm控件實現(xiàn)PC雙串口互通信如果一臺計算機有兩個串口,可通過串口線將兩個串口連接起來:COM1端口的TXD與COM2端口的RXD相連,COM1端口的RXD與COM2端口的TXD相連,COM1端口的GND與COM2端口的GND相連,如圖6-6(a)所示,這是串口通信設(shè)備之間的最簡單連接即三線連接),圖中的2號接收腳與3號發(fā)送腳交叉連接是因為在直連方

35、式時,把通信雙方都當作數(shù)據(jù)終端設(shè)備看待,雙方都可以發(fā)送也可以接收。5(4牡615:4貯電:9876(b)圖6-6串口設(shè)備最簡單連接如果一臺計算機只有一個串行通信端口可以使用,那么將第2腳與第3管腳短路,如圖6-6(b)所示,那么第3腳的輸出信號就會被傳送到第2腳,用以發(fā)送到同一串行端口的輸入緩沖區(qū),程序只要再由相同的串行端口上作讀取的操作,即可將數(shù)據(jù)讀入,一樣可以形成一個測試環(huán)境設(shè)計的參考代碼如下:串口初始化串口1與串口2的通信參數(shù)應(yīng)一致PrivateSubForm_Load()設(shè)置通信端口號為C0M1設(shè)置串口1參數(shù)接收文本型數(shù)據(jù)打開通信端口1設(shè)置通信端口號為COM2設(shè)置串口2參數(shù)接收文本型數(shù)

36、據(jù)打開通信端口2MSComm1.CommPort=1MSComm1.Settings=9600,n,&1MSComm1.InputMode=0MSComm1.PortOpen=TrueMSComm2.CommPort=2MSComm2.Settings=9600,n,&1MSComm2.InputMode=0MSComm2.PortOpen=TrueEndSub把字符通過串口發(fā)送出去啟動定時器PrivateSubCmdsend_Click()MSComm1.Output=Trim(Textsend.Text)Timer1.Enabled=TrueEndSub接收字符PrivateSubTime

37、r1_Timer()Dimbuf$Timer1.Enabled=False將緩沖區(qū)內(nèi)的數(shù)據(jù)讀入buf變量中判斷緩沖區(qū)內(nèi)是否存在數(shù)據(jù)buf=Trim(MSComm2.Input)IfLen(buf)=0ThenTextReceive.Text=ElseTextReceive.Text=bufEndIfEndSub停止程序運行PrivateSubCmdquit_Click()UnloadMeEndSub關(guān)閉通信端口,PrivateSubForm_Unload(CancelAsInteger)MSComm1.PortOpen=FalseMSComm2.PortOpen=FalseEndSub程序運行

38、界面如圖6-7所示。圖6-7程序運行界面6.2PC與單片機串口通信程序設(shè)計目前,在許多單片機應(yīng)用系統(tǒng)中,上、下位機分工明確,作為下位機核心器件的單片機往往只負責數(shù)據(jù)的采集和通信,而上位機通常以基于圖形界面的Windows系統(tǒng)為操作平臺。L8.B圖6-8單片機實驗板為便于查詢和保存數(shù)據(jù),還需要數(shù)據(jù)庫的支持,這種應(yīng)用的核心是數(shù)據(jù)通信,它包括單片機和上位機之間、客戶端和服務(wù)器之間以及客戶端和客戶端之間的通信,而單片機和上位機之間數(shù)據(jù)通信則是整個系統(tǒng)的基礎(chǔ)。單片機和PC的通信是通過單片機的串口和PC串口之間的硬件連接實現(xiàn)的。圖6-8是本設(shè)計使用的單片機實驗板。有關(guān)單片機實驗板的詳細信息請查詢電子開發(fā)網(wǎng)

39、 HYPERLINK /%e3%80%82 /。PC與單片機串口通信程序?qū)嵱?xùn)目的(1)掌握PC與單片機串口通信的線路連接方法。(2)掌握PC與單片機串口通信的KeilC51和VB程序設(shè)計方法。PC與單片機串口通信程序設(shè)計用軟、硬件本設(shè)計用到的硬件和軟件清單如表6-4所示。表6-4設(shè)計用軟硬件序號名稱數(shù)量1PC(計算機)12單片機實驗板(AT89C51、MAX232等)13串口通信線(三線制)14VB6.016.2.3PC與單片機串口通信程序硬件線路圖線路說明,如圖6-9所示,數(shù)據(jù)通信的硬件上采用三線制,將單片機和PC串口的3個引腳(RXD、TXD、GND)分別連在一起,即將PC和單片機的發(fā)送數(shù)

40、據(jù)線TXD與接收數(shù)據(jù)RXD交叉連接,兩者的地線GND直接相連,而其他信號線如握手信號線均不用,采用軟件握手的方式,這樣既可以實現(xiàn)預(yù)定的任務(wù)又可以簡化電路設(shè)計。但由于單片機的TTL邏輯電平和RS-232C的電氣特性完全不同,RS-232C的邏輯0電平規(guī)定為+3+15V之間,邏輯1電平為-3-15V之間,因此,在將PC和單片機的RXD和TXD交叉連接時必須進行電平轉(zhuǎn)換,這里使用的是MAX232電平轉(zhuǎn)換芯片。圖6-9PC與單片機串口通信線路單片機系統(tǒng)有LED顯示器模塊、繼電器輸出模塊、蜂鳴器模塊等。6.2.4設(shè)計任務(wù)利用KeilC51和VB編寫程序?qū)崿F(xiàn)PC與單片機串口通信。任務(wù)要求。1設(shè)計任務(wù)1PC

41、通過串行口將數(shù)字(00,01,02,03.,FF,十六進制)發(fā)送給單片機,單片機收到后回傳這個數(shù)字,PC接收到回傳數(shù)據(jù)后顯示出來,若發(fā)送的數(shù)據(jù)和接收到的數(shù)據(jù)相等,則串行通信正確,否則有錯誤。啟始符是數(shù)字00,結(jié)束符是數(shù)字FF。2設(shè)計任務(wù)2(1)測試通信狀態(tài)。先在文本框中輸入字符串“Hello”,單擊“測試”按鈕,將字符串“Hello”發(fā)送到單片機,若PC與單片機通信正常,在PC程序的文本框中顯示字符串“OK!”;否則,顯示字符串“ERROR!”。(2)循環(huán)計數(shù)。單擊“開始”按鈕,文本框中數(shù)字從)開始累加,0、1、2、3,并將此數(shù)發(fā)送到單片機的顯示器上顯示。當累加到10時,回到0重新開始累加,依

42、次循環(huán)。任何時候,單擊“停止”按鈕,PC程序中和單片機顯示器都停止累加,再單擊“開始”按鈕,接著停下的數(shù)繼續(xù)累加。(3)控制指示燈。在單片機繼電器接線端子的兩個通道上分別接上兩個指示燈,在PC程序界面上選擇指示燈號,如1號燈,單擊界面“打開”按鈕,單片機上1號燈亮,同時蜂鳴器響;單擊界面關(guān)閉”按鈕,1號燈滅,蜂鳴器停止響;同樣控制2號燈的亮滅(蜂鳴器同時動作)。6.2.5任務(wù)實現(xiàn)單片機和PC通信,在程序設(shè)計上涉及兩個部分的內(nèi)容。一是單片機的C51程序,二是PC的串口通信程序和界面的編制。625.1利用KeilC51實現(xiàn)單片機與PC串口通信任務(wù)1網(wǎng)絡(luò)詳細地址為: HYPERLINK /51161

43、 /51161625.2利用VB實現(xiàn)PC與單片機串口通信任務(wù)11程序界面設(shè)計設(shè)計的程序界面如圖6-11所示。圖6-11程序窗體界面運行VB,創(chuàng)建標準的工程項目文件,設(shè)計程序窗體。(1)添加一個MSComm控件:默認的工具箱中沒有MSComm串口通信控件,因此,首先要把它添加到工具箱中,再將MSComm控件添加到程序窗體上。(2)添加兩個按鈕控件CommandButton,用于發(fā)送數(shù)字和關(guān)閉程序。(3)添加一個框架控件Frame,用于功能顯示。(4)添加一個文本控件TextBox,用于輸入數(shù)字。(5)添加一個標簽控件Label,用于顯示通信狀態(tài)。2屬性設(shè)置程序窗體、控件對象的主要屬性設(shè)置如表6-

44、5所示表6-5窗體、控件對象的主要屬性設(shè)置控件類型名稱主要屬性功能FormMainFormBorderStyle=3運行時窗體固定大小Caption=PC與單片機串口通信窗體標題欄顯示程序名稱FrameFrame1Caption=輸入數(shù)據(jù)測試功能區(qū)TextBoxnumTextText=0數(shù)據(jù)輸入框LabelLabel1Caption=通信狀態(tài)?顯示串口通信狀態(tài)CommandButtonCmdsendCaption=發(fā)送發(fā)送數(shù)據(jù)命令CommandButtonCmdquitCaption=關(guān)閉關(guān)閉程序命令MSCommMSComm1在程序中設(shè)置串口參數(shù)設(shè)置網(wǎng)絡(luò)詳細地址為: HYPERLINK /51

45、161 /51161禾U用KeilC51實現(xiàn)單片機與PC串口通信任務(wù)2(方法1)網(wǎng)絡(luò)詳細地址為: HYPERLINK /51161 /51161禾I用VB實現(xiàn)PC與單片機串口通信任務(wù)2(方法1)1程序界面設(shè)計運行VB,創(chuàng)建標準的工程項目文件,設(shè)計程序窗體。添加一個MSComm控件。默認的工具箱中沒有MSComm串口通信控件,因此,首圖6-13程序窗體界面先要把它添加到工具箱中,再將MSComm控件添加到程序窗體上。為了實現(xiàn)連續(xù)的字符發(fā)送和循環(huán)計數(shù),添加兩個Timer控件。為了功能分類,添加3個Frame控件。為了選擇指示燈號添加兩個OptionButton控件。添加其他控件。兩個文本控件Tex

46、tBox,6個按鈕控件CommandButton。設(shè)計的程序界面如圖6-13所示。2屬性設(shè)置程序窗體、控件對象的主要屬性設(shè)置見表6-6。表6-6窗體、控件對象的主要屬性設(shè)置控件類型名稱主要屬性功能FormMainFormBorderStyle=3運行時窗體固定大小Caption=PC機與單片機串口通信窗體標題欄顯示程序名稱FrameFrame1Caption=測試通信狀態(tài)測試功能區(qū)FrameFrame2Caption=循環(huán)計數(shù)循環(huán)計數(shù)功能區(qū)Enabled=False初始不可用FrameFrame3Caption=控制指示燈控制指示燈功能區(qū)Enabled=False初始不可用TextBoxRet

47、urnTextText=Hello測試信息顯示框TextBoxNumTextText=0循環(huán)計數(shù)顯示框OptionButtonOption1Caption=1號燈Value=True1號指示燈,初始選擇OptionButtonOption2Caption=2號燈2號指示燈CommandButtonCmdTestCaption=測試測試單片機命令CommandButtonCmdStartCaption=開始開始計數(shù)命令CommandButtonCmdStopCaption=停止停止計數(shù)命令CommandButtonCmdOpenCaption=打開打開指定指示燈命令CommandButtonCm

48、dCloseCaption=關(guān)閉關(guān)閉指定指示燈命令CommandButtonCmdquitCaption=退出關(guān)閉程序命令MSCommMSComm1在程序中設(shè)置串口參數(shù)設(shè)置TimerTimer1Enabled=False時鐘初始不可用Interval=1000循環(huán)計數(shù)周期3編寫程序代碼以下是實現(xiàn)PC與單片機串口通信任務(wù)2(方法1)的參考程序網(wǎng)絡(luò)詳細地址為: HYPERLINK /51161 /51161625.5禾U用KeilC51實現(xiàn)單片機與PC串口通信任務(wù)2(方法2)以下是完成單片機與PC串口通信任務(wù)2(方法2)的C51參考程序:網(wǎng)絡(luò)詳細地址為: HYPERLINK /51161 /511

49、61禾U用VB實現(xiàn)PC與單片機串口通信任務(wù)2(方法2)程序界面設(shè)計如同方法1,如圖6-13所示。以下是實現(xiàn)PC與單片機串口通信任務(wù)2(方法1)的參考程序:網(wǎng)絡(luò)詳細地址為: HYPERLINK /51161 /511616.3PC與智能儀器串口通信程序設(shè)計目前儀器儀表的智能化程度越來越高,大量的智能儀器都配備了RS-232通信接口,并圖6-15智能儀器示意圖提供了相應(yīng)的通信協(xié)議,能夠?qū)y試、采集的數(shù)據(jù)傳輸給計算機等設(shè)備,以便進行大量數(shù)據(jù)的儲存、處理、查詢和分析。圖6-15是某型號智能儀器示意圖。通常個人計算機(PC)或工控機(IPC)是智能儀器上位機的最佳選擇,因為PC或IPC不僅能解決智能儀器

50、(作為下位機)所不能解決的問題,如數(shù)值運算、曲線顯示、數(shù)據(jù)查詢、報表打印等;而且具有豐富和強大的軟件開發(fā)環(huán)境。PC與智能儀器串口通信程序設(shè)計目的(1)掌握PC與智能儀器串口通信的線路連接方法。(2)掌握PC與智能儀器串口通信的VB程序設(shè)計方法。PC與智能儀器串口通信程序設(shè)計用軟、硬件本設(shè)計用到的硬件和軟件清單如表6-7所示。表6-7設(shè)計用軟硬件序號名稱數(shù)量1PC(計算機)12XMT-3000A型智能儀表(需配置RS-232通信,上、下限報警繼電器,DC24V電源等模塊)13串口通信線(三線制)1VisualBasic數(shù)據(jù)采集與串口通信測控應(yīng)用實戰(zhàn)第6章VB串口通信程序設(shè)計典型實例第6章VB串口

51、通信程序設(shè)計典型實例4熱電阻傳感器(Cu50) 指示燈(DC24V)VisualBasic6.06.3.3PC與智能儀器串口通信程序硬件線路圖1線路說明觀察所用計算機主機箱后RS-232C串口的數(shù)量、位置和幾何特征;查看計算機與智能儀器的串口連接線及其端口。在計算機與智能儀器通電前,按圖6-16所示將傳感器Cu50、上、下限報警指示燈與XMT-3000A智能儀器連接。通過串口線將計算機與智能儀器連接起來:智能儀器的14端子(RXD)與計算機串口COM1的3腳(TXD)相連,智能儀器的15端子(TXD)與計算機串口COM1的2腳(RXD)相連,智能儀器的16端子(GND)與計算機串口COM1的5

52、腳(GND)相連。連接儀器與計算機串口線時,儀器與計算機嚴禁通電,否則極易燒毀串口。2.XMT-3000A智能儀器的參數(shù)設(shè)置XMT-3000A智能儀器在使用前應(yīng)對其輸入/輸出參數(shù)進行正確設(shè)置,設(shè)置好的儀器才能投入正常使用。關(guān)于XMT-3000A智能儀器的通信協(xié)議參見第5.6.2節(jié)。請按表6-8所示設(shè)置儀器的主要參數(shù)。表6-8儀器的主要參數(shù)設(shè)置參數(shù)含義HiAL上限絕對值報警值LoAL下限絕對值報警值Sn輸入規(guī)格diP小數(shù)點位置ALPAddrbAud儀器功能定義通信地址通信波特率設(shè)置值3020傳感器為:Cu50,則Sn=20要求顯示一位小數(shù),則diP=lALP=1014800有關(guān)XMT-3000A

53、智能儀表的詳細信息請查詢網(wǎng)站 HYPERLINK /%e3%80%82 /。6.3.4設(shè)計任務(wù)編寫VB程序?qū)崿F(xiàn)PC與智能儀表串口通信。任務(wù)要求。(1)自動連續(xù)讀取并顯示智能儀器溫度測量值(十進制)(2)統(tǒng)計測量溫度的平均值、最大值、最小值等。(3)繪制溫度實時變化曲線。6.3.5任務(wù)實現(xiàn)網(wǎng)絡(luò)詳細地址為: HYPERLINK /51161 /511616.4PC與PLC串口通信程序設(shè)計可編程序邏輯控制器(簡稱PLC)主要是為現(xiàn)場控制而設(shè)計的,其人機界面主要是開關(guān)、按鈕、指示燈等。其良好的適應(yīng)性和可擴展能力而得到越來越廣泛的應(yīng)用。采用PLC的控制系統(tǒng)或裝置具有可靠性高、易于控制、系統(tǒng)設(shè)計靈活、能模

54、擬現(xiàn)場調(diào)試、編程使用簡單、性價比高、有良好的抗干擾能力等特點。但是,PLC也有不易顯示各種實時圖表/曲線(趨勢線)和漢字、無良好的用戶界面、不便于監(jiān)控等缺陷。圖6-19PLC產(chǎn)品示意圖二十世紀90年代后,許多的PLC都配備有計算機通信接口,通過總線將一臺或多臺PLC相連接。計算機作為上位機可以提供良好的人機界面,進行系統(tǒng)的監(jiān)控和管理,進行程序編制、參數(shù)設(shè)定和修改、數(shù)據(jù)采集等,既能保證系統(tǒng)性能,又能使系統(tǒng)操作簡便,便于生產(chǎn)過程的有效監(jiān)督。而PLC作為下位機,執(zhí)行可靠有效的分散控制。用一臺計算機(上位機)去監(jiān)控下位機(PLC),這就要求PC與PLC之間穩(wěn)定、可靠的數(shù)據(jù)通信。圖6-19是某型號PLC

55、示意圖。6.4.1PC與PLC串口通信程序設(shè)計目的(1)掌握PC與PLC串口通信的線路連接方法。(2)掌握PC與PLC串口通信的VB程序設(shè)計方法。6.4.2PC與PLC串口通信程序設(shè)計用軟、硬件本設(shè)計用到的硬件和軟件清單如表6-10所示。表6-10設(shè)計用軟、硬件序號名稱數(shù)量1PC(計算機)12PLC(西門子:S7-200,CPU224)13PLC(三菱:FX2N-32MR)14SC-09編程電纜,PC/PPI電纜各15開關(guān),指示燈(DC24V)各106直流電源(0UT:DC24V)17VisualBasic6.016.4.3PC與PLC串口通信程序設(shè)計硬件線路圖線路說明:西門子S7-200PL

56、C系統(tǒng)為用戶提供了靈活的通信功能。集成在7-200中的點對點接口(PPI)可用普通的雙絞線作波特率高達9600bit/s的數(shù)據(jù)通信,用RS-485接口實現(xiàn)高速用戶可編程接口,可使用專用位通信協(xié)議(如ASCII)做波特率高達38.4kbit/s的高速通信并可按步調(diào)整。而PC的接口為RS-232,兩者之間需要進行電平轉(zhuǎn)換。利用西門子公司的C/PPI電纜,可將S7-200CPU與計算機連接起來組成?C/PPI網(wǎng)絡(luò),實現(xiàn)點對點通信,如圖6-20所示。FX2PLC可以通過自身的編程口和PC通信,也可以通過通信口和PC通信。通過編程口,PC只能和一臺PLC通信,實現(xiàn)對PLC中軟元件的間接訪問(每個軟元件具

57、有惟一的地址映射);通過通信口,一臺PC可以和多臺PLC通信,并實現(xiàn)對PLC中軟元件的直接訪問,兩者使用不同的通信協(xié)議。PC通過FX2N的編程口構(gòu)成的二級控制系統(tǒng)如圖6-21所示,按鈕、行程開關(guān)等的常開觸點接PLC開關(guān)量輸入1通道,PLC開關(guān)量輸出1通道接指示燈。6.4.4設(shè)計任務(wù)利用VB編寫程序?qū)崿F(xiàn)PC與PLC串口通信。任務(wù)要求。(1)開關(guān)量輸入。利用繼電器開關(guān)改變某個輸入端口的狀態(tài),程序讀取該端口的輸入狀態(tài)(打開/關(guān)閉),并在程序中顯示。(2)開關(guān)量輸出。程序運行界面中指定元件地址,單擊置位/復(fù)位命令按鈕,設(shè)置指定地址的元件端口(繼電器)狀態(tài)為ON或OFF,使線路中指示燈亮/滅。6.4.5

58、任務(wù)實現(xiàn)PC與西門子S7-200PLC串口通信網(wǎng)絡(luò)詳細地址為: HYPERLINK /51161 /51161PC與三菱FX2N-32MRPLC串口通信1PLC端(下位機)程序為了保證FX2N-32MR型PLC能夠正常與PC進行通信,需要在PLC中運行如圖6-24所示的一段程序。其功能是設(shè)置PLC的通信參數(shù):波特率為9600b/s,7位數(shù)據(jù)位,1位停止位,偶校驗,站號為0。圖6-24PLC通信參數(shù)設(shè)置程序2.PC端(上位機)VB程序1)程序界面設(shè)計。圖6-25程序窗體界面運行VB,創(chuàng)建標準的工程項目文件,設(shè)計程序窗體。添加串口通信控件MSComm和時鐘控件Timer。添加其他控件。兩個Fram

59、e控件,4個Label控件,兩個ComboBox控件,兩個Shape控件,4個CommandButton控件。設(shè)計的程序界面如圖6-25所示。2)屬性設(shè)置。程序窗體、控件對象的主要屬性設(shè)置如表6-12所示。表6-12窗體控件對象的主要屬性設(shè)置控件類型名稱主要屬性功能FormfrmMainCaption=PC與PLC串口通信窗體標題欄顯示程序名稱FrameFrame1Caption=開關(guān)量輸入顯示輸入地址、端口狀態(tài)信息FrameFrame2Caption=開關(guān)量輸出顯示輸出地址、端口狀態(tài)信息ComboBoxListlnAddrStyle=0列出元件所有輸入地址ComboBoxListOutAdd

60、rStyle=0列出元件所有輸出地址Shape1InAlarmFillStyle=0-Solid填充樣式,實線Shape=3-Circle圓形,輸入端口信號指示Shape2OutAlarmFillStyle=0-Solid填充樣式,實線Shape=3-Circle圓形,輸出端口信號指示LabelLabel1Caption=地址:地址輸入框標簽LabelLabel2Caption=狀態(tài):端口信號指示燈標簽CommandButtonCmdsetCaption=置位置指定地址端口為ONCommandButtonCmdresetCaption=復(fù)位置指定地址端口為OFFCommandButtonCmd

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論