

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第6章VisualC+串口通信程序設(shè)計典型實例利用VisualC+開發(fā)串口通信程序既可以使用MSComm控件也可以調(diào)用WindowsAPI函數(shù)。不過,只要MSComm可以被選用,它幾乎總是我們推薦的選擇。在本章提供的串口通信程序設(shè)計中,PC與單片機(jī)、PC與智能儀表、PC與PLC、PC與GSM短信模塊等串口通信任務(wù)的實現(xiàn)均采用MSComm控件。6.1 PC與PC串口通信程序設(shè)計當(dāng)兩臺串口設(shè)備通信距離較近時,可以直接連接,最簡單的情況,在通信中只需3根線(發(fā)送線、接收線、信號地線)便可實現(xiàn)全雙工異步串行通信。本設(shè)計通過兩臺PC串口三線連接,介紹了利用API函數(shù)和MSComm控件設(shè)計串口通信程序的方
2、法,包括字符與文件的發(fā)送與接收。6.1.1 PC與PC串口通信程序設(shè)計目的設(shè)計目的有以下兩個方面。(1)掌握pc與pc串口通信的線路連接方法。(2)利用VisualC+API函數(shù)和MSComm控件實現(xiàn)PC與PC串口通信的程序設(shè)計方法。6.1.2 PC與PC串口通信程序設(shè)計用軟、硬件本設(shè)計用到的硬件和軟件清單見表6-1。表6-1設(shè)計用軟、硬件序號名稱數(shù)旦里1PC或IPC12串口通信線(三線制)13VisualC+6.016.1.3 PC與PC串口通信程序硬件線路線路說明:在計算機(jī)通電前,如圖6-1所示,將兩臺PC通過串口線連接起來: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è)計任務(wù)利用VisualC+API函數(shù)和MSComm控件編寫程序?qū)崿F(xiàn)PC與PC串口通信。(1) 兩臺計算機(jī)互發(fā)字符并自動接收,如一臺計算機(jī)輸入字符串"Pleasereturnabc123”執(zhí)行“發(fā)送字符”命令,另一臺計算機(jī)若收到,就輸入字符串“abc123”執(zhí)行“發(fā)送字符”命令,信息返回到第一組的計算機(jī)。實際上就是編寫一個簡單的雙機(jī)聊天程序。(2) 將文本文件或二進(jìn)制文件通過串口從一臺計算機(jī)傳送到另一
4、臺計算機(jī)。圖6-1PC與PC串口通信線路6.1.5任務(wù)實現(xiàn)6.1.5.1 利用API函數(shù)實現(xiàn)字符發(fā)送與接收1 .建立工程(1) 啟動VisualC+6.0,執(zhí)行“文件”菜單中的“新建”命令,顯示新建對話框,選擇"MFCAppWizard(exe)"工程類型,輸入需要創(chuàng)建工程的名稱“pc_pc_api"和目錄。(2) 按照彈出的應(yīng)用向?qū)υ捒蛞来翁顚懀?步選擇基于對話框,其他均采用默認(rèn)。(3) 單擊“完成”,將會彈出一個關(guān)于新工程信息的對話框。單擊“確定”按鈕。這樣MFC向?qū)П阕詣由闪艘粋€名稱為pc_pc_api的工程。2 .資源創(chuàng)建圖6-2程序界面(1)應(yīng)用程
5、序中添加了一個對話框資源IDD_PC_PC_API_DIALOG,打開屬性對話框,將對話框標(biāo)題改為“PC與PC串口通信API”。(2)刪除對話框中原來的Static文本,用面板為對話框添加如表6-2所示的控件,并按照圖6-2所示放置。表6-2對話框的控件類型、ID及相關(guān)屬性控件類型ID號標(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) 添加成員變量,在"查看”菜單中或在對話框上單擊鼠標(biāo)右鍵,打開“ClassWizard”對話框中的"MemberVariables”標(biāo)簽,選中所需的控件ID號,雙擊鼠標(biāo)左鍵或單擊AddVariables按鈕,依次為表6-3中所列控件增加成員變量。表6-3成員變量控件ID號變量類型變量名IDCreceiveCStringmstrReceiveIDCsendCStringmstrSend(4) 切換到ClassWizard的MessageMaps標(biāo)簽頁或在對話框中雙擊每一個按鈕,為"發(fā)送”、“退出”按鈕分別添加ON_BN
7、_CLICKED消息響應(yīng)函數(shù)On0K(),0nCancel()。3 程序代碼設(shè)計窗體模塊程序如下:(1) 在pc_pc_文件的開始處,增加全局變量、消息和線程函數(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)/自定義一個消息/線程函數(shù)使用的OVERLAPPED結(jié)構(gòu)/寫操作使用的OVERLAPPED結(jié)構(gòu)/讀操作使用的OVERLAPPED結(jié)構(gòu)/線程是否運行/數(shù)據(jù)是否發(fā)送完畢/線程函數(shù)/創(chuàng)建一個事件WaitCommEvent(CPc_pc_apiDlg*)AfxGetMainWnd()->hCom,&dwEvtMask,&tOverLaped);如果事件沒有信號,延時0.1s等待窗口事件dwResult=WaitForSingleObject(t,100);switch(dwResult)caseWAIT_OBJECT_0:事件對象有信號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(),添加代碼實現(xiàn)對話框串口通信的初始化工作,如下:BOOLCPc_pcDlg:OnInitDialog()/VC自動生成的代碼/TODO:AddextrainitializationhereCSeriesPort();returnTrue;/returnTrueunlessyousetthefocustoacontrol(4) 實現(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)建一個事件對象IsStop=False;if(WriteFile(hCom,m_strSend,m_ngth(),&factdata,&wOverLaped)開始發(fā)送數(shù)據(jù)IsStop=True;elseres=WaitForSingleObje
12、ct(t,5000);/延時5秒,等待數(shù)據(jù)發(fā)送if(WAIT_OBJECT_0=res)/如果事件處于有信號狀態(tài),表示發(fā)送完成IsStop=True;elseIsStop=False;Sleep(500);/延時500毫秒voidCPc_pc_apiDlg:OnCancel()/TODO:AddextracleanuphereCloseHandle(hCom);CDialog:OnCancel();具體代碼如下:(5) 為了實現(xiàn)API函數(shù)配置串口并打開串口,在pc_pc_中增加成員函數(shù),voidCPc_pc_apiDlg:CSeriesPort()/配置并打開串口hCom=CreateFile
13、("COM1",打開串口1GENERIC_READ|GENERIC_WRITE,/允許讀和寫操作0,/獨占方式NULL,OPEN_EXISTING,/打開一個存在的串口FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,/異步方式打開NULL);if(hCom=INVALID_HANDLE_VALUE)MessageBox("端口打開失敗.");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,¶m,0,&dwThreadlD);if(hThread=INVALID_HANDLE_VALUE)MessageBox("線程創(chuàng)建失敗.","提示",64);return;IsFun=True;(6) 為了實現(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);清空串口錯誤標(biāo)志,記錄當(dāng)前通信狀態(tài)t=CreateEvent(NULL,True,False,NULL);創(chuàng)建一個事件對象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編譯運行程序程序設(shè)計、調(diào)試完畢,執(zhí)行菜單中的“啟動”命令或單擊工具欄中的“啟動”快捷按鈕,運行程序。(1) 首先在程序窗體中發(fā)送字符區(qū)輸入要發(fā)送的字符,單擊“發(fā)送數(shù)據(jù)”按鈕,發(fā)送區(qū)的字符串通過COM1口發(fā)送出去。(2) 另一臺計算機(jī)發(fā)送數(shù)據(jù),本計算機(jī)自動讀入并顯示在接收數(shù)據(jù)區(qū)中。程序運行界面如圖6-3所示。圖6-3程序運行界面6.1.5.2 利用MSComm控件實現(xiàn)文件發(fā)送與接收1 .建立工程(1) 啟動VisualC+6.0,執(zhí)行“文件”菜單中的“新建”命令,顯示新建對話框,選擇“MFCAppWizard(exe)”工程類型,輸入需要創(chuàng)建工程
18、的名稱“pc_pc”和目錄。(2) 按照彈出的應(yīng)用向?qū)υ捒蛞来翁顚?,?步選擇基于對話框,其他均采用默認(rèn)。(3) 單擊“完成”按鈕,將會彈出一個關(guān)于新工程信息的對話框,如圖6-4所示。單擊“確定”按鈕。這樣MFC向?qū)П阕詣由闪艘粋€名稱為pc_pc的工程。圖6-4新建工程信息2 .資源創(chuàng)建(1) 應(yīng)用程序中添加了一個對話框資源IDD_pc_pc_DIALOG,打開屬性對話框,將對話框標(biāo)題改為“基于MFC的串口通信”。(2) 為了實現(xiàn)計算機(jī)與計算機(jī)的串口通信,添加MScomm控件。選擇“工程”菜單中的"添加工程”下的“ComponentsandControls"選項,在彈出
19、的對話框中雙擊“RegisteredActiveXControls”項,選擇“MicrosoftCommunicationsControl,version6.0”項,單擊“Insert”按鈕,在彈出的對話框中單擊“OK”按鈕,再在彈出的對話框中單擊“結(jié)束”按鈕關(guān)閉對話框,所選擇的控件就會出現(xiàn)在“控件面板”中,然后將其添加到對話框中相應(yīng)位置。(3) 刪除對話框中原來的Static文本,用面板為對話框添加如表6-4所示的控件,并按照圖6-5所示放置。表6-4對話框的控件類型、ID及相關(guān)屬性控件類型ID號標(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) 添加成員變量,在“查看”菜單中或在對話框上單擊鼠標(biāo)右鍵,打開“ClassWizard”對話框中的“MemberVar
21、iables”標(biāo)簽,選中所需的控件ID號,雙擊鼠標(biāo)左鍵或單擊AddVariables按鈕,依次為表6-5中所列控件增加成員變量。表6-5成員變量控件ID號變量類型變量名IDC_MSCOMM1CMSCommm_ctrlCommIDC_receiveCStringm_strReceiveIDCsendCStringmstrSendIDC_sendCEditm_ctrlSend(5) 切換到ClassWizard的MessageMaps標(biāo)簽頁或在對話框中雙擊每一個按鈕,為"發(fā)送”,“退出”按鈕分別添加ON_BN_CLICKED消息響應(yīng)函數(shù)On0K(),0nCancel()。(6) 在對話框
22、中雙擊MSComm控件,為MSComm控件添加OnComm消息響應(yīng)函數(shù)OnOnCommMscomm1()。3 函數(shù)代碼實現(xiàn)(1) 在pc_文件的開始處,增加全局變量,代碼如下:CStringstrDirFile;/保存文件路徑的變量(2) 在pc_文件中,設(shè)置初始化函數(shù)OnlnitDialog(),添加代碼實現(xiàn)對話框各控件的初始化工作,如下:BOOLCPc_pcDlg:OnlnitDialog()/VC自動生成的代碼/TODO:Addextrainitializationherem_mmPort(1);選擇COM1m_putMode(1);/輸入方式為二進(jìn)制方式m_BufferSize(102
23、4);/設(shè)置輸入緩沖區(qū)大小m_tBufferSize(512);設(shè)置輸出緩沖區(qū)大小,波特率9600,無校驗,8個數(shù)據(jù)位,1個停止位m_ttings("9600,n,8,1");if(!m_rtOpen()m_rtOpen(True);/打開串口m_hreshold(1);參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個字符時將引發(fā)一個接收數(shù)據(jù)的OnComm事件m_putLen(0);設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長度為0m_put();/先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)returnTrue;/returnTrueunlessyousetthefocustoacontrol(3) 實現(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("請選擇保存路徑:");if(al()=IDOK)strDirFile=thName();CFilefile(strDirFile,CFile:modeCreate|CFile:modeReadWrite|CFile:shareExclusive);(m_strSend,m_ngth();UpdateData(true);();elseMessageBox("請輸入您要發(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)/如果讀的文件長度小于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) 實現(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ù)長度for(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);/將字符送入臨時變量strtemp存放m_strReceive+=strtemp;/加入接收編輯框?qū)?yīng)字符串UpdateData(False);/更新編輯框內(nèi)容4 .編譯運行程序設(shè)計、調(diào)試完畢,執(zhí)行菜單中的“啟動”命令或單擊工具欄中的快捷按鈕“啟動”運行程序。(1) 在程序窗體中的發(fā)送區(qū)輸入要發(fā)送的字符,單擊“保存發(fā)送字符”按鈕,發(fā)送區(qū)的字符串保存到指定文件中;單擊“選擇發(fā)送文件”按鈕,打開指定文件并將其中的字符顯示到發(fā)送字
31、符區(qū)。(2) 單擊“發(fā)送”按鈕,發(fā)送字符區(qū)的數(shù)據(jù)發(fā)送到連線的計算機(jī)中并顯示在其接收字符區(qū)中。程序運行界面如圖6-6所示。圖6-6程序運行界面6.1.5.3 利用MSComm控件實現(xiàn)字符發(fā)送與接收1 .建立工程(1) 啟動VisualC+6.0,單擊“文件”菜單中的“新建”命令,顯示新建對話框,選擇“MFCAppWizard(exe)”工程類型,輸入需要創(chuàng)建工程的名稱“pc_pc”和目錄。(2) 按照彈出的應(yīng)用向?qū)υ捒蛞来翁顚懀?步選擇基于對話框,其他均采用默認(rèn)。(3) 單擊“完成”按鈕,將會彈出一個關(guān)于新工程信息的對話框。單擊“確定”按鈕,這樣MFC向?qū)П阕詣由闪艘粋€名稱為“pc_pc”
32、的工程。2 .資源創(chuàng)建(1) 應(yīng)用程序中添加了一個對話框資源IDD_pc_pc_DIALOG,打開屬性對話框,將對話框標(biāo)題改為“基于MFC的串口通信”。(2) 為了實現(xiàn)計算機(jī)與計算機(jī)的串口通信,添加MScomm控件。選擇“工程”菜單中的"添加工程”下的“ComponentsandControls"選項,在彈出的對話框中雙擊“RegisteredActiveXControls”項,選擇“MicrosoftCommunicationsControl,version6.0”項,單擊“Insert”按鈕,在彈出的對話框中單擊“OK”按鈕,再在彈出的對話框中單擊“結(jié)束”按鈕關(guān)閉對話框
33、,所選擇的控件就會出現(xiàn)在“控件面板”中,然后將其添加到對話框中相應(yīng)位置。(3) 刪除對話框中原來的Static文本,用面板為對話框添加如表6-6所示的控件,并按照圖6-7所示放置。圖6-7程序界面表6-6對話框的控件類型、ID及相關(guān)屬性控件類型ID號標(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) 添加成員變量,在"查看”菜單中或在對話框上單擊鼠標(biāo)右鍵,打開“ClassWizard”對話框中的"MemberVariables”標(biāo)簽,選中所需的控件ID號,雙擊鼠標(biāo)左鍵或單擊AddVariables按鈕,依次為表6-7中所列控件增加成員變量。表6-7成員變量控件ID號變量類型變量名IDCMSCOMM1CMSCommmctrlCommIDCreceiveCStringmstrReceiveIDCsendCStringmstrSend(5) 切換到ClassWizard的MessageMaps標(biāo)簽頁或在
35、對話框中雙擊每一個按鈕,為"發(fā)送”、“退出”按鈕分別添加ON_BN_CLICKED消息響應(yīng)函數(shù)On0K(),0nCancel()。(6) 在對話框中雙擊MSComm控件,為MSComm控件添加OnComm消息響應(yīng)函數(shù)OnOnCommMscomm1()。3 函數(shù)代碼實現(xiàn)(1)在pc_文件中,設(shè)置初始化函數(shù)OnlnitDialog(),添加代碼實現(xiàn)對話框各控件的初始化工作,如下:BOOLCPc_pcDlg:OnlnitDialog()/VC自動生成的代碼/TODO:Addextrainitializationherem_mmPort(1);/選擇COM1m_putMode(1);/輸入方
36、式為二進(jìn)制方式m_BufferSize(1024);/設(shè)置輸入緩沖區(qū)大小/設(shè)置輸岀緩沖區(qū)大小,波特率9600,無校驗,8個數(shù)據(jù)位,1個停止位m_tBufferSize(512);m_ttings("9600,n,8,1");if(!m_rtOpen()m_rtOpen(True);打開串口/參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個字符時將引發(fā)一個接收數(shù)據(jù)的OnComm事件m_hreshold(1);m_putLen(0);/設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長度為0m_put();先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)returnTrue;/returnTrueunlessyousetthefo
37、custoacontrol(2)實現(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) 實現(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ù)長度for(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);/將字符送入臨時變量strtemp存放m_strReceive+=strtemp;/加入接收編輯框?qū)?yīng)字符串UpdateData(False);/更新編輯框內(nèi)容4 編譯運行程序程序設(shè)計、調(diào)試完畢,單擊工具欄中的快捷按鈕“啟動”,運行程序。注意:兩臺計
40、算機(jī)同時運行本程序。首先在一臺計算機(jī)程序窗體中發(fā)送字符區(qū)輸入要發(fā)送的字符,比如“我是第1組,收到請回話!”,單擊“發(fā)送字符”按鈕,發(fā)送區(qū)的字符串通過COM1口發(fā)送出去;如果聯(lián)網(wǎng)通信的另一臺計算機(jī)程序收到字符,則返回字符串,如“收到,我是第2組!”如果通信正常該字符串將顯示在接收區(qū)中。程序運行界面如圖6-8所示。.痊甚于町匸的串口通信顯亦按昊宇捋區(qū)收釦畑品JJ端入創(chuàng)年打區(qū):貌衛(wèi)東I歸申知誦冋話砂.U垂二I退出圖6-8程序運行界面6.1.5.4 利用MSComm控件實現(xiàn)PC雙串口互通信1線路說明如果一臺計算機(jī)有兩個串口,可通過串口線將兩個串口連接起來:COM1端口的TXD與COM2端口的RXD相連
41、;COM1端口的RXD與COM2端口的TXD相連;COM1端口的GND與COM2端口的GND相連,如圖6-9(a)所示,這是串口通信設(shè)備之間的最簡單連接(即三線連接),圖中的2號接收腳與3號發(fā)送腳交叉連接是因為在直連方式時,把通信雙方都當(dāng)作數(shù)據(jù)終端設(shè)備看待,雙方都可發(fā)也可收。如果一臺計算機(jī)只有一個串行通信端口可以使用,那么將第2腳與第3管腳短路,如圖6-9(b)所示,那么由第3腳的輸出信號就會被傳送到第2腳而送到同一串行端口的輸入緩沖區(qū),程序只要再由相同的串行端口上作讀取的操作,即可將數(shù)據(jù)讀入,一樣可以形成一個測試環(huán)境。串口設(shè)備最簡單連接圖6-92代碼設(shè)計為了實現(xiàn)同一計算機(jī)串口1與串口(1)
42、在mc_文件中,設(shè)置初始化函數(shù)化工作,如下:2通信,添加2個MScomm控件。OnlnitDialog(),添加代碼實現(xiàn)對話框各控件的初始BOOLCMc_mcDlg:OnlnitDialog()/VC自動生成的代碼/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,無校驗,8個數(shù)據(jù)位,1個停止位打開串口參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個字符時將引發(fā)一個接收數(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ù)長度為0先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)選擇COM2/輸入方式為二進(jìn)制方式/設(shè)置輸入緩沖區(qū)大小波特率9600無校驗,8
44、個數(shù)據(jù)位,1個停止位打開串口參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個字符時將引發(fā)一個接收數(shù)據(jù)的m_hreshold(1);m_putLen(0);/設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長度為0m_put();先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)returnTrue;/returnTrueunlessyousetthefocustoacontrol(2)實現(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)實現(xiàn)兩個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ù)長度for(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);/將字符送入臨時變量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ù)長度/轉(zhuǎn)換為BYTE型數(shù)組/將數(shù)組轉(zhuǎn)換為Cstring型變量BYTEbt=*(char*)(rxda
50、ta+k);t("%c",bt);m_strcom1data+=strtemp;/字符型/將字符送入臨時變量strtemp存放/加入接收編輯框?qū)?yīng)字符串更新編輯框內(nèi)容UpdateData(False);運行程序:首先在程序窗體中發(fā)送字符區(qū)輸入要發(fā)送的字符,單擊“發(fā)送字符”按鈕,發(fā)送區(qū)的字符串通過COM1口3管腳發(fā)送出去;COM1口傳送過來的字符串由COM2口的管腳2輸入緩沖區(qū)并自動讀入,顯示在接收區(qū)中。程序運行界面如圖6-10所示。圖6-10程序運行界面6.2 PC與單片機(jī)串口通信程序設(shè)計目前,在許多單片機(jī)應(yīng)用系統(tǒng)中,上、下位機(jī)分工明確,作為下位機(jī)核心器件的單片機(jī)往往只負(fù)責(zé)
51、數(shù)據(jù)的采集和通信,而上位機(jī)通常以基于圖形界面的Windows系統(tǒng)為操作平臺。為便于查詢和保存數(shù)據(jù),還需要數(shù)據(jù)庫的支持,這種應(yīng)用的核心是數(shù)據(jù)通信,它包括單片機(jī)和上位機(jī)之間、客戶端和服務(wù)器之間以及客戶端和客戶端之間的通信,而單片機(jī)和上位機(jī)之間數(shù)據(jù)通信則是整個系統(tǒng)的基礎(chǔ)。單片機(jī)和PC的通信是通過單片機(jī)的串口和串口之間的硬件連接實現(xiàn)的。圖6-11所示為一塊單片機(jī)實驗板。有關(guān)單片機(jī)實驗板的詳細(xì)信息請查詢電子開發(fā)網(wǎng)。6.2.1 PC與單片機(jī)串口通信程序?qū)嵱?xùn)目的實訓(xùn)目的有以下兩個方面。(1)掌握pc與單片機(jī)串口通信的線路連接方法。(2)掌握PC與單片機(jī)串口通信的KeilC51、VisualC+程序設(shè)計方法。
52、6.2.2 PC與單片機(jī)串口通信程序設(shè)計用軟、硬件本設(shè)計用到的硬件和軟件清單見表6-8。表6-8設(shè)計用軟、硬件序號名稱數(shù)量1PC12單片機(jī)實驗板(AT89C51、MAX232等)13串口通信線(3線制)14VisualC+6.016.2.3 PC與單片機(jī)串口通信程序硬件線路線路說明:如圖6-12所示,數(shù)據(jù)通信的硬件上采用3線制,將單片機(jī)和PC串口的3個引腳(RXD、TXD、GND)分別連在一起,即將PC和單片機(jī)的發(fā)送數(shù)據(jù)線TXD與接收數(shù)據(jù)RXD交叉連接,兩者的地線GND直接相連,而其他信號線(如握手信號線)均不用,采用軟件握手的方式,這樣既可以實現(xiàn)預(yù)定的任務(wù)又可以簡化電路設(shè)計。但由于單片機(jī)的T
53、TL邏輯電平和RS-232C的電氣特性完全不同,RS-232C的邏輯0電平規(guī)定為+3V+15V之間,邏輯1電平為-3V-15V之間,因此在將PC和單片機(jī)的RXD和TXD交叉連接時必須進(jìn)行電平轉(zhuǎn)換,這里使用的是MAX232電平轉(zhuǎn)換芯片。單片機(jī)系統(tǒng)有LED顯示器模塊、繼電器輸出模塊、蜂鳴器模塊等。圖6-12PC與單片機(jī)串口通信線路6.2.4設(shè)計任務(wù)利用KeilC51、VisualC+編寫程序?qū)崿F(xiàn)PC與單片機(jī)串口通信。1 設(shè)計任務(wù)1PC通過串行口將數(shù)字00,01,02,03.,FF(十六進(jìn)制)發(fā)送給單片機(jī),單片機(jī)收到后回傳這個數(shù)字,PC接收到回傳數(shù)據(jù)后顯示出來,若發(fā)送的數(shù)據(jù)和接收到的數(shù)據(jù)相等,則串行
54、通信正確,否則有錯誤。啟始符是數(shù)字00,結(jié)束符是數(shù)字FF。2 .設(shè)計任務(wù)2(1) 測試通信狀態(tài)。先在文本框中輸入字符串“Hello”,單擊“測試”按鈕,將字符串“Hello”發(fā)送到單片機(jī),若PC與單片機(jī)通信正常,在PC程序的文本框中顯示字符串“OK!”,否則顯示字符串“ERROR!”。(2) 循環(huán)計數(shù)。單擊“開始”按鈕,文本框中數(shù)字從0開始累加,0、1、2、3,并將此數(shù)發(fā)送到單片機(jī)的顯示器上顯示;當(dāng)累加到10時,回到0重新開始累加,依次循環(huán);任何時候,單擊“停止”按鈕,PC程序中和單片機(jī)顯示器都停止累加,再單擊“開始”按鈕,接著停下的數(shù)繼續(xù)累加。(3) 控制指示燈。在單片機(jī)繼電器接線端子的兩個通道上分別接上兩個指示燈,在PC程序界面上選擇指示燈號,如1號燈,單擊界面中的“打開”按鈕,單片機(jī)上
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 原地回遷合同范本
- 體育冠名合同范本
- 合同范例起訴書
- 展會招商渠道合同范本
- 單位簽合同范例
- 合同范本格式 字體
- 冷鏈車輛采購合同范本
- 臨時安置房建設(shè)合同范本
- 樓地面找平合同范本
- 合同范例機(jī)械產(chǎn)品
- 【正版授權(quán)】 IEC 63310:2025 EN Functional performance criteria for AAL robots used in connected home environment
- 最終版附件1:“跨學(xué)科主題學(xué)習(xí)”教學(xué)設(shè)計(2025年版)
- (2024)云南省公務(wù)員考試《行測》真題及答案解析
- 2022年“正確認(rèn)識新疆四史”《民族團(tuán)結(jié)鑄牢中華民族共同體意識》全文解讀
- 靜脈治療護(hù)理技術(shù)操作標(biāo)準(zhǔn)解讀
- 附件25:戶口登記非主項變更、更正告知承諾書
- MBR系統(tǒng)運行技術(shù)手冊
- 中國河流湖泊
- 學(xué)校中層干部民主測評表(一)
- 中國農(nóng)業(yè)銀行資金證明模板
- 外貿(mào)報關(guān)用發(fā)票、裝箱單、合同、報關(guān)單模板
評論
0/150
提交評論