第6章VisualC++串口通信程序設(shè)計(jì)典型實(shí)例_第1頁(yè)
第6章VisualC++串口通信程序設(shè)計(jì)典型實(shí)例_第2頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余43頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、第6章VisualC+串口通信程序設(shè)計(jì)典型實(shí)例利用VisualC+開(kāi)發(fā)串口通信程序既可以使用MSComm控件也可以調(diào)用WindowsAPI函數(shù)。不過(guò),只要MSComm可以被選用,它幾乎總是我們推薦的選擇。在本章提供的串口通信程序設(shè)計(jì)中,PC與單片機(jī)、PC與智能儀表、PC與PLC、PC與GSM短信模塊等串口通信任務(wù)的實(shí)現(xiàn)均采用MSComm控件。6.1 PC與PC串口通信程序設(shè)計(jì)當(dāng)兩臺(tái)串口設(shè)備通信距離較近時(shí),可以直接連接,最簡(jiǎn)單的情況,在通信中只需3根線(發(fā)送線、接收線、信號(hào)地線)便可實(shí)現(xiàn)全雙工異步串行通信。本設(shè)計(jì)通過(guò)兩臺(tái)PC串口三線連接,介紹了利用API函數(shù)和MSComm控件設(shè)計(jì)串口通信程序的方

2、法,包括字符與文件的發(fā)送與接收。6.1.1 PC與PC串口通信程序設(shè)計(jì)目的設(shè)計(jì)目的有以下兩個(gè)方面。(1)掌握pc與pc串口通信的線路連接方法。(2)利用VisualC+API函數(shù)和MSComm控件實(shí)現(xiàn)PC與PC串口通信的程序設(shè)計(jì)方法。6.1.2 PC與PC串口通信程序設(shè)計(jì)用軟、硬件本設(shè)計(jì)用到的硬件和軟件清單見(jiàn)表6-1。表6-1設(shè)計(jì)用軟、硬件序號(hào)名稱(chēng)數(shù)旦里1PC或IPC12串口通信線(三線制)13VisualC+6.016.1.3 PC與PC串口通信程序硬件線路線路說(shuō)明:在計(jì)算機(jī)通電前,如圖6-1所示,將兩臺(tái)PC通過(guò)串口線連接起來(lái):PC中A串口COM1端口的TXD與PC中B串口COM1端口的RX

3、D相連;PC中A串口COM1端口的RXD與PC中B串口COM1端口的TXD相連;PC中A串口COM1端口的GND與PC中B串口COM1端口的GND相連。6.1.4 PC與PC串口通信程序設(shè)計(jì)任務(wù)利用VisualC+API函數(shù)和MSComm控件編寫(xiě)程序?qū)崿F(xiàn)PC與PC串口通信。(1) 兩臺(tái)計(jì)算機(jī)互發(fā)字符并自動(dòng)接收,如一臺(tái)計(jì)算機(jī)輸入字符串"Pleasereturnabc123”執(zhí)行“發(fā)送字符”命令,另一臺(tái)計(jì)算機(jī)若收到,就輸入字符串“abc123”執(zhí)行“發(fā)送字符”命令,信息返回到第一組的計(jì)算機(jī)。實(shí)際上就是編寫(xiě)一個(gè)簡(jiǎn)單的雙機(jī)聊天程序。(2) 將文本文件或二進(jìn)制文件通過(guò)串口從一臺(tái)計(jì)算機(jī)傳送到另一

4、臺(tái)計(jì)算機(jī)。圖6-1PC與PC串口通信線路6.1.5任務(wù)實(shí)現(xiàn)6.1.5.1 利用API函數(shù)實(shí)現(xiàn)字符發(fā)送與接收1 .建立工程(1) 啟動(dòng)VisualC+6.0,執(zhí)行“文件”菜單中的“新建”命令,顯示新建對(duì)話(huà)框,選擇"MFCAppWizard(exe)"工程類(lèi)型,輸入需要?jiǎng)?chuàng)建工程的名稱(chēng)“pc_pc_api"和目錄。(2) 按照彈出的應(yīng)用向?qū)?duì)話(huà)框依次填寫(xiě),第1步選擇基于對(duì)話(huà)框,其他均采用默認(rèn)。(3) 單擊“完成”,將會(huì)彈出一個(gè)關(guān)于新工程信息的對(duì)話(huà)框。單擊“確定”按鈕。這樣MFC向?qū)П阕詣?dòng)生成了一個(gè)名稱(chēng)為pc_pc_api的工程。2 .資源創(chuàng)建圖6-2程序界面(1)應(yīng)用程

5、序中添加了一個(gè)對(duì)話(huà)框資源IDD_PC_PC_API_DIALOG,打開(kāi)屬性對(duì)話(huà)框,將對(duì)話(huà)框標(biāo)題改為“PC與PC串口通信API”。(2)刪除對(duì)話(huà)框中原來(lái)的Static文本,用面板為對(duì)話(huà)框添加如表6-2所示的控件,并按照?qǐng)D6-2所示放置。表6-2對(duì)話(huà)框的控件類(lèi)型、ID及相關(guān)屬性控件類(lèi)型ID號(hào)標(biāo)題屬性功能靜態(tài)文本默認(rèn)顯示接收字符區(qū)默認(rèn)標(biāo)簽靜態(tài)文本默認(rèn)輸入發(fā)送字符區(qū)默認(rèn)標(biāo)簽編輯框IDC_receiveHorizontalscroll(V)顯示接收字符區(qū)Mutiline(V)編輯框IDC_sendHorizontalscroll(V)顯示發(fā)送字符區(qū)Mutiline(V)按鈕IDOK發(fā)送默認(rèn)發(fā)送字符命令按

6、鈕IDCANCEL退岀程序默認(rèn)關(guān)閉程序命令(3) 添加成員變量,在"查看”菜單中或在對(duì)話(huà)框上單擊鼠標(biāo)右鍵,打開(kāi)“ClassWizard”對(duì)話(huà)框中的"MemberVariables”標(biāo)簽,選中所需的控件ID號(hào),雙擊鼠標(biāo)左鍵或單擊AddVariables按鈕,依次為表6-3中所列控件增加成員變量。表6-3成員變量控件ID號(hào)變量類(lèi)型變量名IDCreceiveCStringmstrReceiveIDCsendCStringmstrSend(4) 切換到ClassWizard的MessageMaps標(biāo)簽頁(yè)或在對(duì)話(huà)框中雙擊每一個(gè)按鈕,為"發(fā)送”、“退出”按鈕分別添加ON_BN

7、_CLICKED消息響應(yīng)函數(shù)On0K(),0nCancel()。3 程序代碼設(shè)計(jì)窗體模塊程序如下:(1) 在pc_pc_文件的開(kāi)始處,增加全局變量、消息和線程函數(shù),代碼如下:constCM_RECEIVE=WMJJSER+100;OVERLAPPEDtOverLaped=0;OVERLAPPEDwOverLaped=0;OVERLAPPEDrOverLaped=0;BOOLIsFun=True;BOOLIsStop=False;DWORDThreadFunction(LPVOIDpParam)DWORDdwEvtMask,dwResult;t=CreateEvent(NULL,True,Fal

8、se,NULL);while(IsFun)/自定義一個(gè)消息/線程函數(shù)使用的OVERLAPPED結(jié)構(gòu)/寫(xiě)操作使用的OVERLAPPED結(jié)構(gòu)/讀操作使用的OVERLAPPED結(jié)構(gòu)/線程是否運(yùn)行/數(shù)據(jù)是否發(fā)送完畢/線程函數(shù)/創(chuàng)建一個(gè)事件WaitCommEvent(CPc_pc_apiDlg*)AfxGetMainWnd()->hCom,&dwEvtMask,&tOverLaped);如果事件沒(méi)有信號(hào),延時(shí)0.1s等待窗口事件dwResult=WaitForSingleObject(t,100);switch(dwResult)caseWAIT_OBJECT_0:事件對(duì)象有信號(hào)s

9、witch(dwEvtMask)caseEV_RXCHAR:/接收到數(shù)據(jù)if(IsStop)/發(fā)送停止IsStop=False;發(fā)送消息,由消息處理函數(shù)接收數(shù)據(jù):PostMessage(AfxGetMainWnd()->m_hWnd,CM_RECEIVE,0,(LPARAM)EV_RXCHAR);break;break;return0;(2) 在BEGIN_MESSAGE_MAP消息映射代碼中,添加自定義消息映射,代碼如下:BEGIN_MESSAGE_MAP(CPc_pc_apiDlg,CDialog)AFX_MSG_MAP(CPc_pc_apiDlg)ON_WM_SYSCOMMAND(

10、)ON_WM_PAINT()ON_MESSAGE(CM_RECEIVE,OnRecieveData)/添加自定義消息ON_WM_QUERYDRAGICON()AFX_MSG_MAPEND_MESSAGE_MAP()(3) 設(shè)置初始化函數(shù)OnlnitDialog(),添加代碼實(shí)現(xiàn)對(duì)話(huà)框串口通信的初始化工作,如下:BOOLCPc_pcDlg:OnInitDialog()/VC自動(dòng)生成的代碼/TODO:AddextrainitializationhereCSeriesPort();returnTrue;/returnTrueunlessyousetthefocustoacontrol(4) 實(shí)現(xiàn)發(fā)送

11、按鈕、退出按鈕相應(yīng)的消息響應(yīng)函數(shù)On0K(),0nCancel()。代碼如下:voidCPc_pc_apiDlg:OnOK()/TODO:AddextravalidationhereUpdateData(True);DWORDres;DWORDfactdata=0;t=CreateEvent(NULL,True,False,NULL);創(chuàng)建一個(gè)事件對(duì)象IsStop=False;if(WriteFile(hCom,m_strSend,m_ngth(),&factdata,&wOverLaped)開(kāi)始發(fā)送數(shù)據(jù)IsStop=True;elseres=WaitForSingleObje

12、ct(t,5000);/延時(shí)5秒,等待數(shù)據(jù)發(fā)送if(WAIT_OBJECT_0=res)/如果事件處于有信號(hào)狀態(tài),表示發(fā)送完成IsStop=True;elseIsStop=False;Sleep(500);/延時(shí)500毫秒voidCPc_pc_apiDlg:OnCancel()/TODO:AddextracleanuphereCloseHandle(hCom);CDialog:OnCancel();具體代碼如下:(5) 為了實(shí)現(xiàn)API函數(shù)配置串口并打開(kāi)串口,在pc_pc_中增加成員函數(shù),voidCPc_pc_apiDlg:CSeriesPort()/配置并打開(kāi)串口hCom=CreateFile

13、("COM1",打開(kāi)串口1GENERIC_READ|GENERIC_WRITE,/允許讀和寫(xiě)操作0,/獨(dú)占方式NULL,OPEN_EXISTING,/打開(kāi)一個(gè)存在的串口FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,/異步方式打開(kāi)NULL);if(hCom=INVALID_HANDLE_VALUE)MessageBox("端口打開(kāi)失敗.");return;SetupComm(hCom,1024,1024);/設(shè)置發(fā)送和接收緩沖區(qū)大小設(shè)置串口信息DCBdcb;GetCommState(hCom,&dcb);at

14、e=9600;ry=True;ty=True;ize=8;y=ODDPARITY;its=ONESTOPBIT;if(!SetCommState(hCom,&dcb)MessageBox("掩碼設(shè)置失敗.","提示");return;if(!SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY)MessageBox("掩碼設(shè)置失敗.","提示");return;DWORDparam;hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)

15、ThreadFunction,&param,0,&dwThreadlD);if(hThread=INVALID_HANDLE_VALUE)MessageBox("線程創(chuàng)建失敗.","提示",64);return;IsFun=True;(6) 為了實(shí)現(xiàn)API函數(shù)自定義消息處理,用于接收消息,在pc_pc_中增加成員函數(shù),具體代碼如下:自定義消息處理函數(shù),用于接收消息voidCPc_pc_apiDlg:OnRecieveData(WPARAMwParam,LPARAMIParam)DWORDres,factbyte;memset(DataBu

16、ffer,0,1024);/初始化數(shù)據(jù)緩沖區(qū)COMSTATrst;ClearCommError(hCom,&res,&rst);清空串口錯(cuò)誤標(biāo)志,記錄當(dāng)前通信狀態(tài)t=CreateEvent(NULL,True,False,NULL);創(chuàng)建一個(gè)事件對(duì)象if(ReadFile(hCom,DataBuffer,ue,&factbyte,&rOverLaped)/讀取數(shù)據(jù)到緩沖區(qū)中DataBufferue=0;IsStop=False;elseres=WaitForSingleObject(t,5000);IsStop=False;m_strReceive+=DataB

17、uffer;UpdateData(false);4編譯運(yùn)行程序程序設(shè)計(jì)、調(diào)試完畢,執(zhí)行菜單中的“啟動(dòng)”命令或單擊工具欄中的“啟動(dòng)”快捷按鈕,運(yùn)行程序。(1) 首先在程序窗體中發(fā)送字符區(qū)輸入要發(fā)送的字符,單擊“發(fā)送數(shù)據(jù)”按鈕,發(fā)送區(qū)的字符串通過(guò)COM1口發(fā)送出去。(2) 另一臺(tái)計(jì)算機(jī)發(fā)送數(shù)據(jù),本計(jì)算機(jī)自動(dòng)讀入并顯示在接收數(shù)據(jù)區(qū)中。程序運(yùn)行界面如圖6-3所示。圖6-3程序運(yùn)行界面6.1.5.2 利用MSComm控件實(shí)現(xiàn)文件發(fā)送與接收1 .建立工程(1) 啟動(dòng)VisualC+6.0,執(zhí)行“文件”菜單中的“新建”命令,顯示新建對(duì)話(huà)框,選擇“MFCAppWizard(exe)”工程類(lèi)型,輸入需要?jiǎng)?chuàng)建工程

18、的名稱(chēng)“pc_pc”和目錄。(2) 按照彈出的應(yīng)用向?qū)?duì)話(huà)框依次填寫(xiě),第1步選擇基于對(duì)話(huà)框,其他均采用默認(rèn)。(3) 單擊“完成”按鈕,將會(huì)彈出一個(gè)關(guān)于新工程信息的對(duì)話(huà)框,如圖6-4所示。單擊“確定”按鈕。這樣MFC向?qū)П阕詣?dòng)生成了一個(gè)名稱(chēng)為pc_pc的工程。圖6-4新建工程信息2 .資源創(chuàng)建(1) 應(yīng)用程序中添加了一個(gè)對(duì)話(huà)框資源IDD_pc_pc_DIALOG,打開(kāi)屬性對(duì)話(huà)框,將對(duì)話(huà)框標(biāo)題改為“基于MFC的串口通信”。(2) 為了實(shí)現(xiàn)計(jì)算機(jī)與計(jì)算機(jī)的串口通信,添加MScomm控件。選擇“工程”菜單中的"添加工程”下的“ComponentsandControls"選項(xiàng),在彈出

19、的對(duì)話(huà)框中雙擊“RegisteredActiveXControls”項(xiàng),選擇“MicrosoftCommunicationsControl,version6.0”項(xiàng),單擊“Insert”按鈕,在彈出的對(duì)話(huà)框中單擊“OK”按鈕,再在彈出的對(duì)話(huà)框中單擊“結(jié)束”按鈕關(guān)閉對(duì)話(huà)框,所選擇的控件就會(huì)出現(xiàn)在“控件面板”中,然后將其添加到對(duì)話(huà)框中相應(yīng)位置。(3) 刪除對(duì)話(huà)框中原來(lái)的Static文本,用面板為對(duì)話(huà)框添加如表6-4所示的控件,并按照?qǐng)D6-5所示放置。表6-4對(duì)話(huà)框的控件類(lèi)型、ID及相關(guān)屬性控件類(lèi)型ID號(hào)標(biāo)題屬性功能靜態(tài)文本默認(rèn)顯示接受字符區(qū)默認(rèn)標(biāo)簽靜態(tài)文本默認(rèn)輸入發(fā)送字符區(qū)默認(rèn)標(biāo)簽編輯框IDC_r

20、eceiveHorizontalscroll(V)Mutiline(V)顯示接受字符區(qū)編輯框IDC_sendHorizontalscroll(V)Mutiline(V)Wantreturn(V)顯示發(fā)送字符區(qū)MSCommIDCMSCOMM1在程序中設(shè)置默認(rèn)串口參數(shù)設(shè)置按鈕IDOK發(fā)送默認(rèn)發(fā)送字符命令按鈕IDC_BUTTON1保存發(fā)送字符默認(rèn)保存發(fā)送字符命令按鈕IDC_BUTTON2選擇發(fā)送文件默認(rèn)選擇發(fā)送文件命令按鈕IDCANCEL退岀程序默認(rèn)關(guān)閉程序命令圖6-5程序界面(4) 添加成員變量,在“查看”菜單中或在對(duì)話(huà)框上單擊鼠標(biāo)右鍵,打開(kāi)“ClassWizard”對(duì)話(huà)框中的“MemberVar

21、iables”標(biāo)簽,選中所需的控件ID號(hào),雙擊鼠標(biāo)左鍵或單擊AddVariables按鈕,依次為表6-5中所列控件增加成員變量。表6-5成員變量控件ID號(hào)變量類(lèi)型變量名IDC_MSCOMM1CMSCommm_ctrlCommIDC_receiveCStringm_strReceiveIDCsendCStringmstrSendIDC_sendCEditm_ctrlSend(5) 切換到ClassWizard的MessageMaps標(biāo)簽頁(yè)或在對(duì)話(huà)框中雙擊每一個(gè)按鈕,為"發(fā)送”,“退出”按鈕分別添加ON_BN_CLICKED消息響應(yīng)函數(shù)On0K(),0nCancel()。(6) 在對(duì)話(huà)框

22、中雙擊MSComm控件,為MSComm控件添加OnComm消息響應(yīng)函數(shù)OnOnCommMscomm1()。3 函數(shù)代碼實(shí)現(xiàn)(1) 在pc_文件的開(kāi)始處,增加全局變量,代碼如下:CStringstrDirFile;/保存文件路徑的變量(2) 在pc_文件中,設(shè)置初始化函數(shù)OnlnitDialog(),添加代碼實(shí)現(xiàn)對(duì)話(huà)框各控件的初始化工作,如下:BOOLCPc_pcDlg:OnlnitDialog()/VC自動(dòng)生成的代碼/TODO:Addextrainitializationherem_mmPort(1);選擇COM1m_putMode(1);/輸入方式為二進(jìn)制方式m_BufferSize(102

23、4);/設(shè)置輸入緩沖區(qū)大小m_tBufferSize(512);設(shè)置輸出緩沖區(qū)大小,波特率9600,無(wú)校驗(yàn),8個(gè)數(shù)據(jù)位,1個(gè)停止位m_ttings("9600,n,8,1");if(!m_rtOpen()m_rtOpen(True);/打開(kāi)串口m_hreshold(1);參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的OnComm事件m_putLen(0);設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為0m_put();/先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)returnTrue;/returnTrueunlessyousetthefocustoacontrol(3) 實(shí)現(xiàn)保存發(fā)送字

24、符按鈕、選擇發(fā)送文件按鈕、發(fā)送按鈕、退出按鈕相應(yīng)的消息響應(yīng)函數(shù)OnOK(),OnCancel()。代碼如下:voidCPc_pcDlg:OnButton1()/保存發(fā)送字符/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(true);if(m_strSend!="")CFileDialogdlg(false,"txt",_T(""),NULL,"Text(*.txt)|*.txt|AIIFiles(*.*)|*.*|",NULL);dlg.m_Tit

25、le=_T("請(qǐng)選擇保存路徑:");if(al()=IDOK)strDirFile=thName();CFilefile(strDirFile,CFile:modeCreate|CFile:modeReadWrite|CFile:shareExclusive);(m_strSend,m_ngth();UpdateData(true);();elseMessageBox("請(qǐng)輸入您要發(fā)送的字符串!","保存為文件");m_cus();voidCPc_pcDlg:OnButton2()/選擇發(fā)送文件/TODO:Addyourcontrol

26、notificationhandlercodehereCStringstrf;strf="TxtFiles(*.txt)|*.txt|"CFileDialogdlg(True,NULL,NULL,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_ENABLESIZING|OFN_FILEMUSTEXIST,strf);dlg.m_ctSize=sizeof(OPENFILENAME);if(al()=IDOK)strDirFile=thName();elsereturn;UpdateData(false);CFilefile(strDirFile,CFil

27、e:modeReadWrite|CFile:shareExclusive);UpdateData(true);oEnd();unsignedlongfileLength=ngth();char*fileBuff;fileBuff=newcharfileLength;oBegin();if(fileBuff,fileLength)<1)/如果讀的文件長(zhǎng)度小于1,則退出();return;elsefileBufffileLength='O'm_strSend=fileBuff;();UpdateData(false);voidCPc_pcDlg:OnOK()/發(fā)送按鈕/TOD

28、O:AddextravalidationhereUpdateData(True);/讀取編輯框內(nèi)容m_tput(COIeVariant(m_strSend);發(fā)送數(shù)據(jù)voidCPc_pcDlg:OnCancel()/退出按鈕/TODO:Addextracleanupherem_rtOpen(0);CDialog:OnCancel();(4) 實(shí)現(xiàn)MSComm控件相應(yīng)的消息響應(yīng)函數(shù)OnOnCommMscomm1()。代碼如下:voidCPc_pcDlg:OnOnCommMscomm1()/TODO:AddyourcontrolnotificationhandlercodehereVARIANTv

29、ariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata2048;/設(shè)置BYTE數(shù)組CStringstrtemp;if(m_mmEvent()=2)事件值為2表示接收緩沖區(qū)內(nèi)有字符variant_inp=m_put();/讀緩沖區(qū)safearray_inp=variant_inp;/VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量len=safearray_eDimSize();/得到有效數(shù)據(jù)長(zhǎng)度f(wàn)or(k=O;k<len;k+)safearray_ement(&k,rxdata+k);轉(zhuǎn)換為BYTE型數(shù)組fo

30、r(k=0;k<len;k+)/將數(shù)組轉(zhuǎn)換為Cstring型變量BYTEbt=*(char*)(rxdata+k);/字符型t("%c",bt);/將字符送入臨時(shí)變量strtemp存放m_strReceive+=strtemp;/加入接收編輯框?qū)?yīng)字符串UpdateData(False);/更新編輯框內(nèi)容4 .編譯運(yùn)行程序設(shè)計(jì)、調(diào)試完畢,執(zhí)行菜單中的“啟動(dòng)”命令或單擊工具欄中的快捷按鈕“啟動(dòng)”運(yùn)行程序。(1) 在程序窗體中的發(fā)送區(qū)輸入要發(fā)送的字符,單擊“保存發(fā)送字符”按鈕,發(fā)送區(qū)的字符串保存到指定文件中;單擊“選擇發(fā)送文件”按鈕,打開(kāi)指定文件并將其中的字符顯示到發(fā)送字

31、符區(qū)。(2) 單擊“發(fā)送”按鈕,發(fā)送字符區(qū)的數(shù)據(jù)發(fā)送到連線的計(jì)算機(jī)中并顯示在其接收字符區(qū)中。程序運(yùn)行界面如圖6-6所示。圖6-6程序運(yùn)行界面6.1.5.3 利用MSComm控件實(shí)現(xiàn)字符發(fā)送與接收1 .建立工程(1) 啟動(dòng)VisualC+6.0,單擊“文件”菜單中的“新建”命令,顯示新建對(duì)話(huà)框,選擇“MFCAppWizard(exe)”工程類(lèi)型,輸入需要?jiǎng)?chuàng)建工程的名稱(chēng)“pc_pc”和目錄。(2) 按照彈出的應(yīng)用向?qū)?duì)話(huà)框依次填寫(xiě),第1步選擇基于對(duì)話(huà)框,其他均采用默認(rèn)。(3) 單擊“完成”按鈕,將會(huì)彈出一個(gè)關(guān)于新工程信息的對(duì)話(huà)框。單擊“確定”按鈕,這樣MFC向?qū)П阕詣?dòng)生成了一個(gè)名稱(chēng)為“pc_pc”

32、的工程。2 .資源創(chuàng)建(1) 應(yīng)用程序中添加了一個(gè)對(duì)話(huà)框資源IDD_pc_pc_DIALOG,打開(kāi)屬性對(duì)話(huà)框,將對(duì)話(huà)框標(biāo)題改為“基于MFC的串口通信”。(2) 為了實(shí)現(xiàn)計(jì)算機(jī)與計(jì)算機(jī)的串口通信,添加MScomm控件。選擇“工程”菜單中的"添加工程”下的“ComponentsandControls"選項(xiàng),在彈出的對(duì)話(huà)框中雙擊“RegisteredActiveXControls”項(xiàng),選擇“MicrosoftCommunicationsControl,version6.0”項(xiàng),單擊“Insert”按鈕,在彈出的對(duì)話(huà)框中單擊“OK”按鈕,再在彈出的對(duì)話(huà)框中單擊“結(jié)束”按鈕關(guān)閉對(duì)話(huà)框

33、,所選擇的控件就會(huì)出現(xiàn)在“控件面板”中,然后將其添加到對(duì)話(huà)框中相應(yīng)位置。(3) 刪除對(duì)話(huà)框中原來(lái)的Static文本,用面板為對(duì)話(huà)框添加如表6-6所示的控件,并按照?qǐng)D6-7所示放置。圖6-7程序界面表6-6對(duì)話(huà)框的控件類(lèi)型、ID及相關(guān)屬性控件類(lèi)型ID號(hào)標(biāo)題屬性功能靜態(tài)文本默認(rèn)顯示接收字符區(qū)默認(rèn)標(biāo)簽靜態(tài)文本默認(rèn)輸入發(fā)送字符區(qū)默認(rèn)標(biāo)簽編輯框IDC_receiveHorizontalscroll(V)顯示接收字符區(qū)Mutiline(V)編輯框IDC_sendHorizontalscroll(V)顯示發(fā)送字符區(qū)Mutiline(V)MSCommIDC_MSCOMM1在程序中設(shè)置默認(rèn)串口參數(shù)設(shè)置按鈕IDO

34、K發(fā)送默認(rèn)發(fā)送字符命令按鈕IDCANCEL退岀程序默認(rèn)關(guān)閉程序命令(4) 添加成員變量,在"查看”菜單中或在對(duì)話(huà)框上單擊鼠標(biāo)右鍵,打開(kāi)“ClassWizard”對(duì)話(huà)框中的"MemberVariables”標(biāo)簽,選中所需的控件ID號(hào),雙擊鼠標(biāo)左鍵或單擊AddVariables按鈕,依次為表6-7中所列控件增加成員變量。表6-7成員變量控件ID號(hào)變量類(lèi)型變量名IDCMSCOMM1CMSCommmctrlCommIDCreceiveCStringmstrReceiveIDCsendCStringmstrSend(5) 切換到ClassWizard的MessageMaps標(biāo)簽頁(yè)或在

35、對(duì)話(huà)框中雙擊每一個(gè)按鈕,為"發(fā)送”、“退出”按鈕分別添加ON_BN_CLICKED消息響應(yīng)函數(shù)On0K(),0nCancel()。(6) 在對(duì)話(huà)框中雙擊MSComm控件,為MSComm控件添加OnComm消息響應(yīng)函數(shù)OnOnCommMscomm1()。3 函數(shù)代碼實(shí)現(xiàn)(1)在pc_文件中,設(shè)置初始化函數(shù)OnlnitDialog(),添加代碼實(shí)現(xiàn)對(duì)話(huà)框各控件的初始化工作,如下:BOOLCPc_pcDlg:OnlnitDialog()/VC自動(dòng)生成的代碼/TODO:Addextrainitializationherem_mmPort(1);/選擇COM1m_putMode(1);/輸入方

36、式為二進(jìn)制方式m_BufferSize(1024);/設(shè)置輸入緩沖區(qū)大小/設(shè)置輸岀緩沖區(qū)大小,波特率9600,無(wú)校驗(yàn),8個(gè)數(shù)據(jù)位,1個(gè)停止位m_tBufferSize(512);m_ttings("9600,n,8,1");if(!m_rtOpen()m_rtOpen(True);打開(kāi)串口/參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的OnComm事件m_hreshold(1);m_putLen(0);/設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為0m_put();先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)returnTrue;/returnTrueunlessyousetthefo

37、custoacontrol(2)實(shí)現(xiàn)發(fā)送按鈕、退出按鈕相應(yīng)的消息響應(yīng)函數(shù)On0K(),0nCancel()。代碼如下:voidCPc_pcDlg:OnOK()/TODO:AddextravalidationhereUpdateData(TRUE);m_tput(COleVariant(m_strSend);/發(fā)送按鈕/讀取編輯框內(nèi)容/發(fā)送數(shù)據(jù)voidCPc_pcDlg:OnCancel()/TODO:Addextracleanupherem_rtOpen(0);CDialog:OnCancel();/退岀按鈕(3) 實(shí)現(xiàn)MSComm控件相應(yīng)的消息響應(yīng)函數(shù)OnOnCommMscomm1()。代碼

38、如下:voidCPc_pcDlg:OnOnCommMscomm1()VARIANTvariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata2048;/設(shè)置BYTECStringstrtemp;if(m_mmEvent()=2)variant_inp=m_put();safearray_inp=variant_inp;len=safearray_eDimSize();/TODO:Addyourcontrolnotificationhandlercodehere數(shù)組事件值為2表示接收緩沖區(qū)內(nèi)有字符/讀緩沖區(qū)/VARIANT型變量轉(zhuǎn)換為C

39、oleSafeArray型變量得到有效數(shù)據(jù)長(zhǎng)度f(wàn)or(k=0;k<len;k+)safearray_ement(&k,rxdata+k);/轉(zhuǎn)換為BYTE型數(shù)組for(k=0;k<len;k+)/將數(shù)組轉(zhuǎn)換為Cstring型變量BYTEbt=*(char*)(rxdata+k);/字符型t("%c",bt);/將字符送入臨時(shí)變量strtemp存放m_strReceive+=strtemp;/加入接收編輯框?qū)?yīng)字符串UpdateData(False);/更新編輯框內(nèi)容4 編譯運(yùn)行程序程序設(shè)計(jì)、調(diào)試完畢,單擊工具欄中的快捷按鈕“啟動(dòng)”,運(yùn)行程序。注意:兩臺(tái)計(jì)

40、算機(jī)同時(shí)運(yùn)行本程序。首先在一臺(tái)計(jì)算機(jī)程序窗體中發(fā)送字符區(qū)輸入要發(fā)送的字符,比如“我是第1組,收到請(qǐng)回話(huà)!”,單擊“發(fā)送字符”按鈕,發(fā)送區(qū)的字符串通過(guò)COM1口發(fā)送出去;如果聯(lián)網(wǎng)通信的另一臺(tái)計(jì)算機(jī)程序收到字符,則返回字符串,如“收到,我是第2組!”如果通信正常該字符串將顯示在接收區(qū)中。程序運(yùn)行界面如圖6-8所示。.痊甚于町匸的串口通信顯亦按昊宇捋區(qū)收釦畑品JJ端入創(chuàng)年打區(qū):貌衛(wèi)東I歸申知誦冋話(huà)砂.U垂二I退出圖6-8程序運(yùn)行界面6.1.5.4 利用MSComm控件實(shí)現(xiàn)PC雙串口互通信1線路說(shuō)明如果一臺(tái)計(jì)算機(jī)有兩個(gè)串口,可通過(guò)串口線將兩個(gè)串口連接起來(lái):COM1端口的TXD與COM2端口的RXD相連

41、;COM1端口的RXD與COM2端口的TXD相連;COM1端口的GND與COM2端口的GND相連,如圖6-9(a)所示,這是串口通信設(shè)備之間的最簡(jiǎn)單連接(即三線連接),圖中的2號(hào)接收腳與3號(hào)發(fā)送腳交叉連接是因?yàn)樵谥边B方式時(shí),把通信雙方都當(dāng)作數(shù)據(jù)終端設(shè)備看待,雙方都可發(fā)也可收。如果一臺(tái)計(jì)算機(jī)只有一個(gè)串行通信端口可以使用,那么將第2腳與第3管腳短路,如圖6-9(b)所示,那么由第3腳的輸出信號(hào)就會(huì)被傳送到第2腳而送到同一串行端口的輸入緩沖區(qū),程序只要再由相同的串行端口上作讀取的操作,即可將數(shù)據(jù)讀入,一樣可以形成一個(gè)測(cè)試環(huán)境。串口設(shè)備最簡(jiǎn)單連接圖6-92代碼設(shè)計(jì)為了實(shí)現(xiàn)同一計(jì)算機(jī)串口1與串口(1)

42、在mc_文件中,設(shè)置初始化函數(shù)化工作,如下:2通信,添加2個(gè)MScomm控件。OnlnitDialog(),添加代碼實(shí)現(xiàn)對(duì)話(huà)框各控件的初始BOOLCMc_mcDlg:OnlnitDialog()/VC自動(dòng)生成的代碼/TODO:Addextrainitializationherem_mmPort(1);m_putMode(1);m_BufferSize(1024);m_tBufferSize(512);m_ttings("9600,n,8,1");if(!m_rtOpen()m_rtOpen(True);選擇COM1/輸入方式為二進(jìn)制方式/設(shè)置輸入緩沖區(qū)大小設(shè)置輸岀緩沖區(qū)大小

43、,波特率9600,無(wú)校驗(yàn),8個(gè)數(shù)據(jù)位,1個(gè)停止位打開(kāi)串口參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的m_hreshold(1);m_putLen(0);m_put();m_mmPort(2);m_putMode(1);m_BufferSize(1024);/設(shè)置輸岀緩沖區(qū)大小,m_tBufferSize(512);m_ttings("9600,n,8,1");if(!m_rtOpen()m_rtOpen(True);/設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為0先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)選擇COM2/輸入方式為二進(jìn)制方式/設(shè)置輸入緩沖區(qū)大小波特率9600無(wú)校驗(yàn),8

44、個(gè)數(shù)據(jù)位,1個(gè)停止位打開(kāi)串口參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的m_hreshold(1);m_putLen(0);/設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為0m_put();先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)returnTrue;/returnTrueunlessyousetthefocustoacontrol(2)實(shí)現(xiàn)發(fā)送按鈕、退出按鈕相應(yīng)的消息響應(yīng)函數(shù)OnComm事件OnComm事件On0K()、OnOk1()、OnButton1()、OnButton2()。代碼如下:voidCMc_mcDlg:OnOK()/TODO:AddextravalidationhereUpdate

45、Data(True);m_tput(COIeVariant(m_strcom1data);/發(fā)送數(shù)據(jù)voidCMc_mcDlg:OnOk1()發(fā)送/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(True);m_tput(COleVariant(m_strcom2data);/發(fā)送數(shù)據(jù)voidCMc_mcDlg:OnButton1()/TODO:Addyourcontrolnotificationhandlercodeherem_strcom1data=""UpdateData(false);voidCMc_

46、mcDlg:OnButton2()/TODO:Addyourcontrolnotificationhandlercodeherem_strcom2data=""UpdateData(false);發(fā)送讀取編輯框內(nèi)容讀取編輯框內(nèi)容清空更新編輯框內(nèi)容清空更新編輯框內(nèi)容(3)實(shí)現(xiàn)兩個(gè)MSComm控件相應(yīng)的消息響應(yīng)函數(shù)OnOnCommMscomm1(),OnOnCommMscomm1(),代碼如下:voidCMc_mcDlg:OnOnCommMscomm1()/TODO:AddyourcontrolnotificationhandlercodehereVARIANTvariant_

47、inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata2048;CStringstrtemp;if(m_mmEvent()=2)variant_inp=m_put();safearray_inp=variant_inp;len=safearray_eDimSize();/設(shè)置BYTE數(shù)組事件值為2表示接收緩沖區(qū)內(nèi)有字符/讀緩沖區(qū)/VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量得到有效數(shù)據(jù)長(zhǎng)度f(wàn)or(k=0;k<len;k+)safearray_ement(&k,rxdata+k);for(k=0;k<len;k+)

48、/轉(zhuǎn)換為BYTE型數(shù)組/將數(shù)組轉(zhuǎn)換為Cstring型變量/字符型BYTEbt=*(char*)(rxdata+k);t("%c",bt);/將字符送入臨時(shí)變量strtemp存放m_strcom2data+=strtemp;/加入接收編輯框?qū)?yīng)字符串UpdateData(False);voidCMc_mcDlg:0n0nCommMscomm2()/TODO:AddyourcontrolnotificationhandlercodehereVARIANTvariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata2048

49、;CStringstrtemp;if(m_mmEvent()=2)variant_inp=m_put();safearray_inp=variant_inp;len=safearray_eDimSize();for(k=0;k<len;k+)safearray_ement(&k,rxdata+k);for(k=0;k<len;k+)更新編輯框內(nèi)容/設(shè)置BYTE數(shù)組事件值為2表示接收緩沖區(qū)內(nèi)有字符/讀緩沖區(qū)/VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量得到有效數(shù)據(jù)長(zhǎng)度/轉(zhuǎn)換為BYTE型數(shù)組/將數(shù)組轉(zhuǎn)換為Cstring型變量BYTEbt=*(char*)(rxda

50、ta+k);t("%c",bt);m_strcom1data+=strtemp;/字符型/將字符送入臨時(shí)變量strtemp存放/加入接收編輯框?qū)?yīng)字符串更新編輯框內(nèi)容UpdateData(False);運(yùn)行程序:首先在程序窗體中發(fā)送字符區(qū)輸入要發(fā)送的字符,單擊“發(fā)送字符”按鈕,發(fā)送區(qū)的字符串通過(guò)COM1口3管腳發(fā)送出去;COM1口傳送過(guò)來(lái)的字符串由COM2口的管腳2輸入緩沖區(qū)并自動(dòng)讀入,顯示在接收區(qū)中。程序運(yùn)行界面如圖6-10所示。圖6-10程序運(yùn)行界面6.2 PC與單片機(jī)串口通信程序設(shè)計(jì)目前,在許多單片機(jī)應(yīng)用系統(tǒng)中,上、下位機(jī)分工明確,作為下位機(jī)核心器件的單片機(jī)往往只負(fù)責(zé)

51、數(shù)據(jù)的采集和通信,而上位機(jī)通常以基于圖形界面的Windows系統(tǒng)為操作平臺(tái)。為便于查詢(xún)和保存數(shù)據(jù),還需要數(shù)據(jù)庫(kù)的支持,這種應(yīng)用的核心是數(shù)據(jù)通信,它包括單片機(jī)和上位機(jī)之間、客戶(hù)端和服務(wù)器之間以及客戶(hù)端和客戶(hù)端之間的通信,而單片機(jī)和上位機(jī)之間數(shù)據(jù)通信則是整個(gè)系統(tǒng)的基礎(chǔ)。單片機(jī)和PC的通信是通過(guò)單片機(jī)的串口和串口之間的硬件連接實(shí)現(xiàn)的。圖6-11所示為一塊單片機(jī)實(shí)驗(yàn)板。有關(guān)單片機(jī)實(shí)驗(yàn)板的詳細(xì)信息請(qǐng)查詢(xún)電子開(kāi)發(fā)網(wǎng)。6.2.1 PC與單片機(jī)串口通信程序?qū)嵱?xùn)目的實(shí)訓(xùn)目的有以下兩個(gè)方面。(1)掌握pc與單片機(jī)串口通信的線路連接方法。(2)掌握PC與單片機(jī)串口通信的KeilC51、VisualC+程序設(shè)計(jì)方法。

52、6.2.2 PC與單片機(jī)串口通信程序設(shè)計(jì)用軟、硬件本設(shè)計(jì)用到的硬件和軟件清單見(jiàn)表6-8。表6-8設(shè)計(jì)用軟、硬件序號(hào)名稱(chēng)數(shù)量1PC12單片機(jī)實(shí)驗(yàn)板(AT89C51、MAX232等)13串口通信線(3線制)14VisualC+6.016.2.3 PC與單片機(jī)串口通信程序硬件線路線路說(shuō)明:如圖6-12所示,數(shù)據(jù)通信的硬件上采用3線制,將單片機(jī)和PC串口的3個(gè)引腳(RXD、TXD、GND)分別連在一起,即將PC和單片機(jī)的發(fā)送數(shù)據(jù)線TXD與接收數(shù)據(jù)RXD交叉連接,兩者的地線GND直接相連,而其他信號(hào)線(如握手信號(hào)線)均不用,采用軟件握手的方式,這樣既可以實(shí)現(xiàn)預(yù)定的任務(wù)又可以簡(jiǎn)化電路設(shè)計(jì)。但由于單片機(jī)的T

53、TL邏輯電平和RS-232C的電氣特性完全不同,RS-232C的邏輯0電平規(guī)定為+3V+15V之間,邏輯1電平為-3V-15V之間,因此在將PC和單片機(jī)的RXD和TXD交叉連接時(shí)必須進(jìn)行電平轉(zhuǎn)換,這里使用的是MAX232電平轉(zhuǎn)換芯片。單片機(jī)系統(tǒng)有LED顯示器模塊、繼電器輸出模塊、蜂鳴器模塊等。圖6-12PC與單片機(jī)串口通信線路6.2.4設(shè)計(jì)任務(wù)利用KeilC51、VisualC+編寫(xiě)程序?qū)崿F(xiàn)PC與單片機(jī)串口通信。1 設(shè)計(jì)任務(wù)1PC通過(guò)串行口將數(shù)字00,01,02,03.,FF(十六進(jìn)制)發(fā)送給單片機(jī),單片機(jī)收到后回傳這個(gè)數(shù)字,PC接收到回傳數(shù)據(jù)后顯示出來(lái),若發(fā)送的數(shù)據(jù)和接收到的數(shù)據(jù)相等,則串行

54、通信正確,否則有錯(cuò)誤。啟始符是數(shù)字00,結(jié)束符是數(shù)字FF。2 .設(shè)計(jì)任務(wù)2(1) 測(cè)試通信狀態(tài)。先在文本框中輸入字符串“Hello”,單擊“測(cè)試”按鈕,將字符串“Hello”發(fā)送到單片機(jī),若PC與單片機(jī)通信正常,在PC程序的文本框中顯示字符串“OK!”,否則顯示字符串“ERROR!”。(2) 循環(huán)計(jì)數(shù)。單擊“開(kāi)始”按鈕,文本框中數(shù)字從0開(kāi)始累加,0、1、2、3,并將此數(shù)發(fā)送到單片機(jī)的顯示器上顯示;當(dāng)累加到10時(shí),回到0重新開(kāi)始累加,依次循環(huán);任何時(shí)候,單擊“停止”按鈕,PC程序中和單片機(jī)顯示器都停止累加,再單擊“開(kāi)始”按鈕,接著停下的數(shù)繼續(xù)累加。(3) 控制指示燈。在單片機(jī)繼電器接線端子的兩個(gè)通道上分別接上兩個(gè)指示燈,在PC程序界面上選擇指示燈號(hào),如1號(hào)燈,單擊界面中的“打開(kāi)”按鈕,單片機(jī)上

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論