




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、目目 錄錄 1 引言引言.1 1.1 問題的提出.1 1.2 國內(nèi)外研究的現(xiàn)狀.1 1.3 任務(wù)與分析.2 1.4 主要任務(wù).2 1.5 分析.2 2 程序的主要功能程序的主要功能.2 2.1 參數(shù)設(shè)置功能.2 2.2 參數(shù)顯示功能.2 2.3 打開串口功能.2 2.4 關(guān)閉串口功能.2 2.5 接收數(shù)據(jù)功能.3 2.6 發(fā)送數(shù)據(jù)功能.3 2.7 清空數(shù)據(jù)接收區(qū)功能.3 2.8 清空數(shù)據(jù)發(fā)送區(qū)功能.3 2.9 自動發(fā)送功能.3 2.10 十六進制顯示功能.3 2.11 十六進制發(fā)送功能.3 3 程序運行平臺程序運行平臺.3 4 總體設(shè)計總體設(shè)計.4 5 5 程序類的說明程序類的說明.4 6 6
2、 模塊分析模塊分析.6 6.1 參數(shù)設(shè)置和顯示模塊.6 6.2 打開串口模塊.9 6.3 發(fā)送數(shù)據(jù)模塊.9 6.4 自動發(fā)送模塊.10 6.5 接收數(shù)據(jù)模塊.11 6.6 清空接收區(qū)模塊.12 6.7 清空發(fā)送區(qū)模塊.12 6.8 關(guān)閉串口模塊 .12 7 7 系統(tǒng)測試系統(tǒng)測試.13 7.1 測試.13 7.2 總結(jié).18 8 8 結(jié)論結(jié)論.18 9 參考文獻參考文獻.19 摘摘 要要 隨著計算機的普及,計算機網(wǎng)絡(luò)和多微機系統(tǒng)的廣泛應(yīng)用,盡管當今 usb 通信技術(shù)和以太網(wǎng)技術(shù)快速發(fā)展,然而串口通信技術(shù)始終以其連接簡便, 價格低廉,穩(wěn)定可靠等優(yōu)點,在計算機通信領(lǐng)域占有一席之地。mscomm 控
3、件是微軟公司為了用戶使用方便而提供的一種便捷的控制串口編程的解決方 案,本文主要介紹了如何利用 vc + + 2008 mscomm 控件的串口通信方法, 對程序的類進行了說明,分析了本程序各個模塊怎樣實現(xiàn)起作用。此次設(shè)計 以 mfc 來設(shè)計界面編制程序,同時利用 mscomm 控件通過串口發(fā)送和接收數(shù) 據(jù),實現(xiàn)了串口通信。該串口通信控制程序具有通信參數(shù)設(shè)置、通信參數(shù)顯 示、打開和關(guān)閉串口、接收數(shù)據(jù)、發(fā)送數(shù)據(jù)、清空發(fā)送區(qū)和接收區(qū)數(shù)據(jù)的功 能。 關(guān)鍵詞關(guān)鍵詞:串口通信visual studio 2008 mscomm 控件 -1- 基于串口通信的高級語言控制程序的設(shè)計 1 1 引言引言 1.1
4、問題的提出問題的提出 串行通信(serial communication )在現(xiàn)代工業(yè)控制系統(tǒng)中一直有著及其重要的地 位,作為一種基本而又靈活方便的通信方式,它被廣泛應(yīng)用于 pc 與 pc 或者 pc 與 plc 之 間的數(shù)據(jù)交換以及其他工業(yè)控制與自動控制中,它不僅沒有因為時代的進步而遭淘汰, 反而在規(guī)格上越來越完善,應(yīng)用也越來越廣泛。vc+是新一代面向?qū)ο蟮目梢暬_發(fā)工 具,提供了良好的界面設(shè)計能力,在 pc 機的串口通信方面有很強的功能。對于從事機 械行業(yè)的人來說,熟悉基于 rs232 串口通信的高級語言編程方法顯得十分重要。 1.2 國內(nèi)外研究的現(xiàn)狀國內(nèi)外研究的現(xiàn)狀 目前,計算機的串行通
5、信應(yīng)用十分廣泛,串行接口已成為計算機的必需部件和接 口之一。由于其具有連接簡單、使用靈活方便、數(shù)據(jù)傳遞可靠等優(yōu)點,在工業(yè)監(jiān)控、 數(shù)據(jù)采集和實時控制系統(tǒng)中得到了廣泛應(yīng)用。當今,實現(xiàn)串口通信的方法以及第三方控 件有很多,例如 pcomm 控件,windows api 函數(shù)等等。但是這幾種方法都過于復(fù)雜,對程 序員要求較高,而且可靠性并不是很好。利用 microsoft 推出的 mscomm 控件,使得串口 通信的實現(xiàn)更為簡單、可靠。 隨著當今信息技術(shù)的快速發(fā)展,通信已成為信息技術(shù)中的關(guān)鍵問題。尤其在控制 領(lǐng)域,以何種方式實現(xiàn)計算機與外圍設(shè)備間既簡單又可靠的通信,就顯得特別重要。 由于串行通信具有實
6、現(xiàn)簡單、使用靈活方便、數(shù)據(jù)傳輸可靠等優(yōu)點,因而廣泛應(yīng)用于 工業(yè)控制系統(tǒng)中,是計算機與外部設(shè)備進行數(shù)據(jù)通信時經(jīng)常使用的方式之一。vc+是 新一代面向?qū)ο蟮目梢暬_發(fā)工具,提供了良好的界面設(shè)計能力,在 pc 機的串口通信 方面有很強的功能。它具有功能強大、簡便易用和代碼執(zhí)行速度快等特點,在通信軟 件的開發(fā)中成為越來越多開發(fā)人員的首選工具。無論在工業(yè)控制中 pc 機和單片機之間 的通信,還是在 2 臺 pc 機之間的串口通信,都具有相同的原理。只要掌握其中的通信 本質(zhì),就能靈活地實現(xiàn)串口通信,串口控制。 串口通訊,是工業(yè)自動化、智能終端、通信管理等領(lǐng)域傳統(tǒng)且重要的通訊手段。 最常用到的串口通信模式往
7、往是兩種:rs232 和 rs485。其中 rs232 通訊方式有三線制 和九線制兩種。工業(yè)控制中,用戶常常使用單片機的串口通訊功能實現(xiàn)與上位機 -2- 基于串口通信的高級語言控制程序的設(shè)計 通訊,實現(xiàn)多機通訊。例如,工業(yè)現(xiàn)場有很多具備串口通訊功能的端表,在幾十米外 的中控室,你可以通過串口通訊隨時讀取表的運行狀態(tài)和相關(guān)數(shù)據(jù),端表異常的時候 馬上在中控室就能知道,這樣免去了很多麻煩,為實現(xiàn)工業(yè)上的自動控制打下了很好 的基礎(chǔ)。某些用戶還可以根據(jù)實際情況需要,在串口上添加光電隔離電路,以達 到保護端口的目的。這個只是串口通訊功能的一個縮影,在實際生活中串口通訊將發(fā) 揮更大的作用。 1.3 任務(wù)與分
8、析任務(wù)與分析 1.4 主要任務(wù)主要任務(wù) 制定串口通信控制程序的總體構(gòu)架; 熟悉 vc 平臺下的高級語言編程方法; 熟悉基于 rs232 串口通信的高級語言編程方法; 在同一臺 pc 機上調(diào)試通過所編寫的程序; 1.5 分析分析 目前 win32 中基于 vc + + 6. 0 的常用串口通信程序一般可以用兩種方法實現(xiàn): 利用 mscomm activex 串行通信控件; 使用 win2dows api 通信函數(shù)。雖然在 windows 下 win32api 提供了使用文件操作方式的函數(shù)進行串口操作的方法,但是在編 程實現(xiàn)上還是比較復(fù)雜。windows 平臺先進的 activex 技術(shù)使得對串口
9、編程不再需要處 理煩瑣的細節(jié)。利用已有的 axtivex 控件,只需要編寫少量的代碼,就可以輕松高效 地完成任務(wù)。因此程序員不需要花時間去了解復(fù)雜的 api 函數(shù),只需要利用 mscomm 控 件就可實現(xiàn)串口編程。 2 程序的主要功能程序的主要功能 2.1 參數(shù)設(shè)置功能參數(shù)設(shè)置功能 設(shè)置和修改串口通信參數(shù),包括端口,波特率,奇偶校驗位,數(shù)據(jù)位,停止位。 -3- 基于串口通信的高級語言控制程序的設(shè)計 2.2 參數(shù)顯示功能參數(shù)顯示功能 顯示當前串口通信參數(shù),包括端口號,波特率,奇偶校驗位,數(shù)據(jù)位,停止位。 2.3 打開串口功能打開串口功能 參數(shù)設(shè)置后,才能打開串口,實現(xiàn)通信。 2.4 關(guān)閉串口功能
10、關(guān)閉串口功能 關(guān)閉串口,停止通信。 2.5 接收數(shù)據(jù)功能接收數(shù)據(jù)功能 能夠進行單個或多個數(shù)據(jù)的接收和顯示。 2.6 發(fā)送數(shù)據(jù)功能發(fā)送數(shù)據(jù)功能 能夠進行單個或多個數(shù)據(jù)的發(fā)送。 2.7 清空數(shù)據(jù)接收區(qū)功能清空數(shù)據(jù)接收區(qū)功能 刪除接收區(qū)所有數(shù)據(jù)。 2.8 清空數(shù)據(jù)發(fā)送區(qū)功能清空數(shù)據(jù)發(fā)送區(qū)功能 清除發(fā)送區(qū)內(nèi)所有數(shù)據(jù)。 2.9 自動發(fā)送功能自動發(fā)送功能 能把發(fā)送區(qū)內(nèi)的數(shù)據(jù)每 2s 自動發(fā)送。 2.10 十六進制顯示功能十六進制顯示功能 在接收區(qū)只顯示十六進制數(shù),每兩個字符一個空格。 2.11 十六進制發(fā)送功能十六進制發(fā)送功能 只能發(fā)送十六進制數(shù),不能發(fā)送非十六進制數(shù)。 3 程序運行平臺程序運行平臺 vi
11、sual studio 2008 具體操作如下: (1)新建 mscomm 項目,選擇 mfc 應(yīng)用程序,應(yīng)用程序類型選擇“基于對話框” , -4- 基于串口通信的高級語言控制程序的設(shè)計 生成的類中選擇“cmscommdlg” ; (2)為 mscomm 項目添加新建一個 dialog 設(shè)置對話框; (3)加載 mscomm 控件,添加相應(yīng)的源程序,加載必要的控件; (4)編寫程序代碼,再編譯,鏈接,調(diào)試,執(zhí)行等,生成應(yīng)用程序。 4 總體設(shè)計總體設(shè)計 圖 4.1 系統(tǒng)總體框架圖 5 程序類的說明 class cmscommdlg : : public cdialog / 構(gòu)造 public:
12、主 函 數(shù) 參 數(shù) 設(shè) 置 和 顯 示 打 開 和 關(guān) 閉 串 口 發(fā) 送 數(shù) 據(jù) 接 收 數(shù) 據(jù) 清 空 接 收 區(qū) 清 空 發(fā) 送 區(qū) -5- 基于串口通信的高級語言控制程序的設(shè)計 cmscommdlg(cwnd* pparent = = null);/ 標準構(gòu)造函數(shù) / 對話框數(shù)據(jù) int oncreate(lpcreatestruct lpcreatestruct); int string2hex(cstring str, cbytearray char converthexchar(char ch); enum idd = = idd_mscomm_dialog ; protecte
13、d: virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv 支持 / 實現(xiàn) protected: hicon m_hicon; / 生成的消息映射函數(shù) virtual bool oninitdialog(); afx_msg void onsyscommand(uint nid, lparam lparam); afx_msg void onpaint(); afx_msg hcursor onquerydragicon(); declare_message_map() public: cmscomm m_mscom;/聲明m_m
14、scomm變量為cmscomm類型 cstring m_recv;/接收區(qū) cstring m_send;/發(fā)送區(qū) csetupdlg mysetupdlg;/聲明設(shè)置對話框 byte mycom;/串口號碼 cstring myparity;/奇偶校驗類型 cstring mybaudrate;/通信波特率 cstring mydata;/數(shù)據(jù)位 cstring mystop;/停止位 declare_eventsink_map() -6- 基于串口通信的高級語言控制程序的設(shè)計 void oncommmscomm1(); afx_msg void onbnclickedsendbutton(
15、); afx_msg void onbnclickedclearsend(); afx_msg void onbnclickedclearrecv(); afx_msg void onbnclickedsetupcom(); afx_msg void onbnclickedopencom(); afx_msg void onbnclickedclosecom(); afx_msg void ontimer(uint_ptr nidevent); afx_msg void onbnclickedcheckautosend(); cbutton m_opencom;/打開串口按鈕 cbutton
16、m_closecom;/關(guān)閉串口按鈕 cbutton m_setupcom;/設(shè)置按鈕 cstring m_para;/通信參數(shù)顯示 cbutton m_clearrecv;/清空接收按鈕 cbutton m_clearsend;/清空發(fā)送按鈕 cbutton m_sendtext;/發(fā)送按鈕 cbutton m_ctrlhexsend;/十六進制發(fā)送 cbutton m_ctrlhexdisplay;/十六進制顯示 bool m_bautosend;/自動發(fā)送 ; 6 模塊分析 6.16.1 參數(shù)設(shè)置和顯示模塊參數(shù)設(shè)置和顯示模塊 單擊主界面中的【設(shè)置】按鈕,將彈出“設(shè)置”對話框,如圖 7.1
17、 所示,可以在該 對話框中設(shè)置串口的通信參數(shù)。該命令的代碼如下: void cmscommdlg:onbnclickedsetupcom() / todo: 在此添加控件通知處理程序代碼 m_opencom.enablewindow(true); afxmessagebox(_t(請設(shè)置通信參數(shù)并打開串口以實現(xiàn)通信!); -7- 基于串口通信的高級語言控制程序的設(shè)計 cstring strstatus,strtemp; double dblbaund; int mdata,mstop; if ( (mysetupdlg.domodal()=idok) mycom=mysetupdlg.m_co
18、m+1;/求取串口編號 if(mysetupdlg.m_baudrate8) dblbaund=pow(2,(double)mysetupdlg.m_baudrate);/求取波特率 dblbaund=300*dblbaund; else switch(mysetupdlg.m_baudrate) case 8:8: dblbaund=43000; break; case 9:9: dblbaund=56000; break; case 10:10: dblbaund=57600; break; case 11:11: dblbaund=115200; break; case 12:12: d
19、blbaund=128000; break; case 13:13: dblbaund=256000; break; strstatus.format(_t(%.0f),dblbaund); mybaudrate=strstatus; switch(mysetupdlg.m_parity)/ 求取奇偶校驗位 case 0:0: myparity=e; -8- 基于串口通信的高級語言控制程序的設(shè)計 break; case 1:1: myparity=m; break; case 2:2: myparity=n; break; case 3:3: myparity=o; break; case 4
20、:4: myparity=s; break; mdata=4+mysetupdlg.m_data;/求取數(shù)據(jù)位 strstatus.format(_t(%d),mdata); mydata=strstatus; mstop=1+mysetupdlg.m_stop;/求取停止位 strstatus.format(_t(%d),mstop); mystop=strstatus; strstatus=com; strtemp.format(_t(%d),mycom); strstatus+=strtemp; strstatus+=, ; strstatus+=mybaudrate; strstatu
21、s+=bit/s, ; strstatus+=myparity; strstatus+=, ; strstatus+=mydata; strstatus+=, ; strstatus+=mystop; m_para=strstatus;/求取靜態(tài)文本顯示內(nèi)容 updatedata(false); -9- 基于串口通信的高級語言控制程序的設(shè)計 6.26.2 發(fā)送數(shù)據(jù)模塊發(fā)送數(shù)據(jù)模塊 . 6.36.3 單擊主界面中的【發(fā)送】按鈕,將把發(fā)送區(qū)的內(nèi)容發(fā)送到串口調(diào)試助手的接收區(qū),. 6.4 自動發(fā)送模塊自動發(fā)送模塊 當【自動發(fā)送】選中時,系統(tǒng)將自動每隔 2s 發(fā)送一次數(shù)據(jù),如圖 7.4(a)(b)所示,
22、 程序代碼如下: void cmscommdlg:ontimer(uint_ptr nidevent) / todo: 在此添加消息處理程序代碼和/或調(diào)用默認值 onbnclickedsendbutton(); cdialog:ontimer(nidevent); void cmscommdlg:onbnclickedcheckautosend() / todo: 在此添加控件通知處理程序代碼 m_bautosend=!m_bautosend; if(m_bautosend) settimer(1,2000,null);/時間為毫秒 else killtimer(1); /取消定時 6.6.5
23、 5 接收數(shù)據(jù)模塊接收數(shù)據(jù)模塊 發(fā)送方發(fā)送數(shù)據(jù)后,在接受區(qū)顯示對方的發(fā)送內(nèi)容,如果【十六進制顯示】選中, 則將只顯示十六進制數(shù) 0f,如圖 7.5(a)(b)所示,該命令的代碼如下: void cmscommdlg:oncommmscomm1() / todo: 在此處添加消息處理程序代碼 updatedata(true); variant variant_inp; -10- 基于串口通信的高級語言控制程序的設(shè)計 colesafearray safearray_inp; long i = = 0;0; int len; char rxdata2048; cstring tmp; switch
24、( (m_mscom.get_commevent() case 2:2:/表示接收緩沖區(qū)內(nèi)有字符 variant_inp = = m_mscom.get_input(); safearray_inp = = variant_inp; len = = safearray_inp.getonedimsize(); for ( (i = = 0;0; i len; i+) safearray_inp.getelement(/轉(zhuǎn)換為byte型數(shù)組 for ( (i = = 0;0; i len; i+)/將數(shù)組轉(zhuǎn)換為cstring型變量 byte bt=*(char*)(rxdata+i); /字符型
25、 if(m_ctrlhexdisplay.getcheck() tmp.format(_t(%02x ),bt); /將字符以十六進制方式送入臨時 變量tmp存放,注意這里加入一個空隔 m_recv+=tmp; /加入接收編輯框?qū)?yīng)字符串 if(!m_ctrlhexdisplay.getcheck() rxdatai = 0; if(!m_ctrlhexdisplay.getcheck() m_recv +=+= rxdata; updatedata(false); break; default: break; 6.6.6 6 清空接收區(qū)模塊清空接收區(qū)模塊 單擊主界面中的【清空接收區(qū)】按鈕,將
26、清空接收區(qū)內(nèi)容,提示“清空接收區(qū)內(nèi) 容!” 如圖 7.6 所示,該命令的代碼如下: void cmscommdlg:onbnclickedclearrecv() / todo: 在此添加控件通知處理程序代碼 -11- 基于串口通信的高級語言控制程序的設(shè)計 m_recv=; updatedata(false); afxmessagebox(_t(清空接收區(qū)成功!); 6.76.7 清空發(fā)送區(qū)模塊清空發(fā)送區(qū)模塊 單擊主界面中的【清空發(fā)送區(qū)】按鈕,將清空發(fā)送區(qū)內(nèi)容,提示“清空發(fā)送區(qū)內(nèi) 容!” 如圖 7.7 所示,該命令的代碼如下: void cmscommdlg:onbnclickedclearse
27、nd() / todo: 在此添加控件通知處理程序代碼 m_send=; updatedata(false); afxmessagebox(_t(清空發(fā)送區(qū)成功!); 6.8 關(guān)閉串口模塊關(guān)閉串口模塊 單擊主界面中的【關(guān)閉串口】按鈕,將關(guān)閉串口,提示“串口關(guān)閉成功!” ,如圖 7.8 所示,該命令的代碼如下: void cmscommdlg:onbnclickedclosecom() / todo: 在此添加控件通知處理程序代碼 m_mscom.put_portopen(0);/關(guān)閉串口 afxmessagebox(_t(串口關(guān)閉成功!); m_opencom.enablewindow(tru
28、e);/使打開串口按鈕生效 m_closecom.enablewindow(false);/使關(guān)閉串口按鈕無效 m_setupcom.enablewindow(true);/使設(shè)置按鈕生效 7 系統(tǒng)測試 7.1 測試測試 首先,直接雙擊 mscomm 文件夾下的 debug 子文件夾下的 mscomm.exe 運行文件; 其次,按以下步驟進行測試: -12- 基于串口通信的高級語言控制程序的設(shè)計 (1)參數(shù)設(shè)置: 圖 7.1 參數(shù)設(shè)置 (2)打開串口: 圖 7.2 打開串口 (3) 發(fā)送十六進制: -13- 基于串口通信的高級語言控制程序的設(shè)計 圖 7.3(a)十六進制發(fā)送 圖 7.3(b)串口調(diào)試助手十六進制顯示 (4)接收數(shù)據(jù): -14- 基于串口通信的高級語言控制程序的設(shè)計 圖 7.4(a)串口調(diào)試助手發(fā)送數(shù)據(jù) 圖 7.4(b)接收數(shù)據(jù) (5
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遵義職業(yè)技術(shù)學(xué)院《土木工程材料B》2023-2024學(xué)年第二學(xué)期期末試卷
- 濮陽職業(yè)技術(shù)學(xué)院《服裝工業(yè)版型設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 東莞職業(yè)技術(shù)學(xué)院《非織造學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 濟南大學(xué)《英語教材教法與課程標準》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024年搪瓷制品相關(guān)日用品生產(chǎn)設(shè)備項目資金籌措計劃書代可行性研究報告
- 大學(xué)生寢室安全教育
- 室內(nèi)設(shè)計師的設(shè)計理念
- 中醫(yī)特色規(guī)培課件
- 2025年安徽阜陽潁東區(qū)東興建設(shè)投資有限責(zé)任公司招聘筆試參考題庫含答案解析
- 財政學(xué)教學(xué)課件
- 季節(jié)性防雷防汛防臺風(fēng)安全檢查表
- 歸檔文件目錄
- 2022年四川省綿陽市中考英語試題及參考答案
- 防疫小組人員名單
- 眼部健康檢測與分析課件
- 偏心塊振動式土壤夯實機的結(jié)構(gòu)設(shè)計說明
- 蘇州市建設(shè)工程造價計價解釋
- 主題班會《堅定信念--放飛理想》
- 煤礦機電設(shè)備春季預(yù)防性檢修計劃
- S771(一) 水力循環(huán)澄清池
- 高密度電法探測及數(shù)據(jù)處理解釋--答辯
評論
0/150
提交評論