版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄 </b></p><p><b> 1引言1</b></p><p> 1.1問(wèn)題的提出1</p><p> 1.2國(guó)內(nèi)外研究的現(xiàn)狀1</p><p> 1.5任務(wù)與分析2</p><p> 1.5.1主要任務(wù)2&
2、lt;/p><p><b> 1.5.2分析2</b></p><p> 2程序的主要功能2</p><p> 2.1參數(shù)設(shè)置功能2</p><p> 2.2參數(shù)顯示功能2</p><p> 2.3打開(kāi)串口功能2</p><p> 2.4關(guān)閉串口功能2&
3、lt;/p><p> 2.5接收數(shù)據(jù)功能3</p><p> 2.6發(fā)送數(shù)據(jù)功能3</p><p> 2.7清空數(shù)據(jù)接收區(qū)功能3</p><p> 2.8清空數(shù)據(jù)發(fā)送區(qū)功能3</p><p> 2.9自動(dòng)發(fā)送功能3</p><p> 2.10十六進(jìn)制顯示功能3</p&g
4、t;<p> 2.11十六進(jìn)制發(fā)送功能3</p><p><b> 3程序運(yùn)行平臺(tái)3</b></p><p><b> 4總體設(shè)計(jì)4</b></p><p><b> 5程序類的說(shuō)明4</b></p><p><b> 6模塊分析6&
5、lt;/b></p><p> 6.1參數(shù)設(shè)置和顯示模塊6</p><p> 6.2打開(kāi)串口模塊9</p><p> 6.3發(fā)送數(shù)據(jù)模塊9</p><p> 6.4自動(dòng)發(fā)送模塊10</p><p> 6.5接收數(shù)據(jù)模塊11</p><p> 6.6清空接收區(qū)模塊12
6、</p><p> 6.7清空發(fā)送區(qū)模塊12</p><p> 6.8關(guān)閉串口模塊12</p><p><b> 7系統(tǒng)測(cè)試13</b></p><p><b> 7.1測(cè)試13</b></p><p><b> 7.2總結(jié)18</b>
7、;</p><p><b> 8結(jié)論18</b></p><p><b> 參考文獻(xiàn)19</b></p><p><b> 摘 要 </b></p><p> 隨著計(jì)算機(jī)的普及,計(jì)算機(jī)網(wǎng)絡(luò)和多微機(jī)系統(tǒng)的廣泛應(yīng)用,盡管當(dāng)今USB通信技術(shù)和以太網(wǎng)技術(shù)快速發(fā)展,然而串
8、口通信技術(shù)始終以其連接簡(jiǎn)便,價(jià)格低廉,穩(wěn)定可靠等優(yōu)點(diǎn),在計(jì)算機(jī)通信領(lǐng)域占有一席之地。MSCOmm控件是微軟公司為了用戶使用方便而提供的一種便捷的控制串口編程的解決方案,本文主要介紹了如何利用VC + + 2008 MSComm 控件的串口通信方法,對(duì)程序的類進(jìn)行了說(shuō)明,分析了本程序各個(gè)模塊怎樣實(shí)現(xiàn)起作用。此次設(shè)計(jì)以MFC 來(lái)設(shè)計(jì)界面編制程序,同時(shí)利用MSComm 控件通過(guò)串口發(fā)送和接收數(shù)據(jù),實(shí)現(xiàn)了串口通信。該串口通信控制程序具有通信參數(shù)
9、設(shè)置、通信參數(shù)顯示、打開(kāi)和關(guān)閉串口、接收數(shù)據(jù)、發(fā)送數(shù)據(jù)、清空發(fā)送區(qū)和接收區(qū)數(shù)據(jù)的功能。</p><p> 關(guān)鍵詞:串口通信visual studio 2008 MSComm控件</p><p><b> 1引言</b></p><p><b> 1.1問(wèn)題的提出</b></p><p&
10、gt; 串行通信(Serial Communication )在現(xiàn)代工業(yè)控制系統(tǒng)中一直有著及其重要的地位,作為一種基本而又靈活方便的通信方式,它被廣泛應(yīng)用于PC與PC或者PC與PLC之間的數(shù)據(jù)交換以及其他工業(yè)控制與自動(dòng)控制中,它不僅沒(méi)有因?yàn)闀r(shí)代的進(jìn)步而遭淘汰,反而在規(guī)格上越來(lái)越完善,應(yīng)用也越來(lái)越廣泛。VC++是新一代面向?qū)ο蟮目梢暬_(kāi)發(fā)工具,提供了良好的界面設(shè)計(jì)能力,在PC機(jī)的串口通信方面有很強(qiáng)的功能。對(duì)于從事機(jī)械行業(yè)的人來(lái)說(shuō),熟悉基
11、于RS232串口通信的高級(jí)語(yǔ)言編程方法顯得十分重要。</p><p> 1.2國(guó)內(nèi)外研究的現(xiàn)狀</p><p> 目前,計(jì)算機(jī)的串行通信應(yīng)用十分廣泛,串行接口已成為計(jì)算機(jī)的必需部件和接口之一。由于其具有連接簡(jiǎn)單、使用靈活方便、數(shù)據(jù)傳遞可靠等優(yōu)點(diǎn),在工業(yè)監(jiān)控、數(shù)據(jù)采集和實(shí)時(shí)控制系統(tǒng)中得到了廣泛應(yīng)用。當(dāng)今,實(shí)現(xiàn)串口通信的方法以及第三方控件有很多,例如PComm控件,Windows API函
12、數(shù)等等。但是這幾種方法都過(guò)于復(fù)雜,對(duì)程序員要求較高,而且可靠性并不是很好。利用Microsoft推出的MSComm控件,使得串口通信的實(shí)現(xiàn)更為簡(jiǎn)單、可靠。</p><p> 隨著當(dāng)今信息技術(shù)的快速發(fā)展,通信已成為信息技術(shù)中的關(guān)鍵問(wèn)題。尤其在控制領(lǐng)域,以何種方式實(shí)現(xiàn)計(jì)算機(jī)與外圍設(shè)備間既簡(jiǎn)單又可靠的通信,就顯得特別重要。由于串行通信具有實(shí)現(xiàn)簡(jiǎn)單、使用靈活方便、數(shù)據(jù)傳輸可靠等優(yōu)點(diǎn),因而廣泛應(yīng)用于工業(yè)控制系統(tǒng)中,是計(jì)算
13、機(jī)與外部設(shè)備進(jìn)行數(shù)據(jù)通信時(shí)經(jīng)常使用的方式之一。VC++是新一代面向?qū)ο蟮目梢暬_(kāi)發(fā)工具,提供了良好的界面設(shè)計(jì)能力,在PC機(jī)的串口通信方面有很強(qiáng)的功能。它具有功能強(qiáng)大、簡(jiǎn)便易用和代碼執(zhí)行速度快等特點(diǎn),在通信軟件的開(kāi)發(fā)中成為越來(lái)越多開(kāi)發(fā)人員的首選工具。無(wú)論在工業(yè)控制中PC機(jī)和單片機(jī)之間的通信,還是在2臺(tái)Pc機(jī)之間的串口通信,都具有相同的原理。只要掌握其中的通信本質(zhì),就能靈活地實(shí)現(xiàn)串口通信,串口控制。</p><p>
14、<b> 1.5任務(wù)與分析</b></p><p><b> 1.5.1主要任務(wù)</b></p><p> ★制定串口通信控制程序的總體構(gòu)架;</p><p> ★熟悉VC平臺(tái)下的高級(jí)語(yǔ)言編程方法;</p><p> ★熟悉基于RS232串口通信的高級(jí)語(yǔ)言編程方法;</p>
15、<p> ★在同一臺(tái)PC機(jī)上調(diào)試通過(guò)所編寫(xiě)的程序;</p><p><b> 1.5.2分析</b></p><p> 目前Win32 中基于VC + + 6. 0 的常用串口通信程序一般可以用兩種方法實(shí)現(xiàn): ①利用MSComm ActiveX 串行通信控件; ②使用Win2dows API 通信函數(shù)。雖然在Windows下Win32API提供了使用文
16、件操作方式的函數(shù)進(jìn)行串口操作的方法,但是在編程實(shí)現(xiàn)上還是比較復(fù)雜。Windows平臺(tái)先進(jìn)的ActiveX技術(shù)使得對(duì)串口編程不再需要處理煩瑣的細(xì)節(jié)。利用已有的AxtiveX控件,只需要編寫(xiě)少量的代碼,就可以輕松高效地完成任務(wù)。因此程序員不需要花時(shí)間去了解復(fù)雜的API函數(shù),只需要利用MSComm控件就可實(shí)現(xiàn)串口編程。</p><p><b> 2程序的主要功能</b></p>&
17、lt;p><b> 2.1參數(shù)設(shè)置功能</b></p><p> 設(shè)置和修改串口通信參數(shù),包括端口,波特率,奇偶校驗(yàn)位,數(shù)據(jù)位,停止位。</p><p><b> 2.2參數(shù)顯示功能</b></p><p> 顯示當(dāng)前串口通信參數(shù),包括端口號(hào),波特率,奇偶校驗(yàn)位,數(shù)據(jù)位,停止位。</p><
18、;p><b> 2.3打開(kāi)串口功能</b></p><p> 參數(shù)設(shè)置后,才能打開(kāi)串口,實(shí)現(xiàn)通信。</p><p><b> 2.4關(guān)閉串口功能</b></p><p> 關(guān)閉串口,停止通信。</p><p><b> 2.5接收數(shù)據(jù)功能</b></p&g
19、t;<p> 能夠進(jìn)行單個(gè)或多個(gè)數(shù)據(jù)的接收和顯示。</p><p><b> 2.6發(fā)送數(shù)據(jù)功能</b></p><p> 能夠進(jìn)行單個(gè)或多個(gè)數(shù)據(jù)的發(fā)送。</p><p> 2.7清空數(shù)據(jù)接收區(qū)功能</p><p> 刪除接收區(qū)所有數(shù)據(jù)。</p><p> 2.8清空數(shù)據(jù)
20、發(fā)送區(qū)功能</p><p> 清除發(fā)送區(qū)內(nèi)所有數(shù)據(jù)。</p><p><b> 2.9自動(dòng)發(fā)送功能</b></p><p> 能把發(fā)送區(qū)內(nèi)的數(shù)據(jù)每2s自動(dòng)發(fā)送。</p><p> 2.10十六進(jìn)制顯示功能</p><p> 在接收區(qū)只顯示十六進(jìn)制數(shù),每?jī)蓚€(gè)字符一個(gè)空格。</p>
21、;<p> 2.11十六進(jìn)制發(fā)送功能</p><p> 只能發(fā)送十六進(jìn)制數(shù),不能發(fā)送非十六進(jìn)制數(shù)。</p><p><b> 3程序運(yùn)行平臺(tái)</b></p><p> Visual studio 2008</p><p><b> 具體操作如下:</b></p>
22、<p> ?。?)新建MSComm項(xiàng)目,選擇MFC應(yīng)用程序,應(yīng)用程序類型選擇“基于對(duì)話框”,生成的類中選擇“CMSCommDlg”;</p><p> ?。?)為MSComm項(xiàng)目添加新建一個(gè)Dialog設(shè)置對(duì)話框;</p><p> ?。?)加載MSComm控件,添加相應(yīng)的源程序,加載必要的控件;</p><p> ?。?)編寫(xiě)程序代碼,再編譯,鏈接,調(diào)
23、試,執(zhí)行等,生成應(yīng)用程序。</p><p><b> 4總體設(shè)計(jì)</b></p><p> 圖4.1系統(tǒng)總體框架圖</p><p><b> 5程序類的說(shuō)明</b></p><p> class CMSCommDlg : public CDialog</p><p>
24、<b> {</b></p><p><b> // 構(gòu)造</b></p><p><b> public:</b></p><p> CMSCommDlg(CWnd* pParent = NULL);// 標(biāo)準(zhǔn)構(gòu)造函數(shù)</p><p><b> // 對(duì)
25、話框數(shù)據(jù)</b></p><p> int OnCreate(LPCREATESTRUCT lpCreateStruct);</p><p> int String2Hex(CString str, CByteArray &senddata);</p><p> char ConvertHexChar(char ch);</p>
26、<p> enum { IDD = IDD_MSCOMM_DIALOG };</p><p> protected:</p><p> virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持</p><p><b> // 實(shí)現(xiàn)</b></p>
27、;<p> protected:</p><p> HICON m_hIcon;</p><p> // 生成的消息映射函數(shù)</p><p> virtual BOOL OnInitDialog();</p><p> afx_msg void OnSysCommand(UINT nID, LPARAM lParam)
28、;</p><p> afx_msg void OnPaint();</p><p> afx_msg HCURSOR OnQueryDragIcon();</p><p> DECLARE_MESSAGE_MAP()</p><p><b> public:</b></p><p>
29、CMSComm m_mscom;//聲明m_mscomm變量為CMSComm類型</p><p> CString m_recv;//接收區(qū)</p><p> CString m_send;//發(fā)送區(qū)</p><p> CSetupDlg mySetupDlg;//聲明設(shè)置對(duì)話框</p><p> BYTE myCo
30、m;//串口號(hào)碼</p><p> CString myParity;//奇偶校驗(yàn)類型</p><p> CString myBaudRate;//通信波特率</p><p> CString myData;//數(shù)據(jù)位</p><p> CString myStop;//停止位</p><
31、;p> DECLARE_EVENTSINK_MAP()</p><p> void OnCommMscomm1();</p><p> afx_msg void OnBnClickedSendbutton();</p><p> afx_msg void OnBnClickedClearsend();</p><p> afx
32、_msg void OnBnClickedClearRecv();</p><p> afx_msg void OnBnClickedSetupcom();</p><p> afx_msg void OnBnClickedOpencom();</p><p> afx_msg void OnBnClickedClosecom();</p>&l
33、t;p> afx_msg void OnTimer(UINT_PTR nIDEvent);</p><p> afx_msg void OnBnClickedCheckAutosend();</p><p> CButton m_Opencom;//打開(kāi)串口按鈕</p><p> CButton m_Closecom;//關(guān)閉串口按鈕<
34、;/p><p> CButton m_Setupcom;//設(shè)置按鈕</p><p> CString m_Para;//通信參數(shù)顯示</p><p> CButton m_ClearRecv;//清空接收按鈕</p><p> CButton m_ClearSend;//清空發(fā)送按鈕</p><
35、p> CButton m_SendText;//發(fā)送按鈕</p><p> CButton m_ctrlHexSend;//十六進(jìn)制發(fā)送</p><p> CButton m_ctrlHexDisplay;//十六進(jìn)制顯示</p><p> BOOL m_bAutoSend;//自動(dòng)發(fā)送</p><p><
36、;b> };</b></p><p><b> 6模塊分析</b></p><p> 6.1參數(shù)設(shè)置和顯示模塊</p><p> 單擊主界面中的【設(shè)置】按鈕,將彈出“設(shè)置”對(duì)話框,如圖7.1所示,可以在該對(duì)話框中設(shè)置串口的通信參數(shù)。該命令的代碼如下:</p><p> void CMSComm
37、Dlg::OnBnClickedSetupcom()</p><p><b> {</b></p><p> // TODO: 在此添加控件通知處理程序代碼</p><p> m_Opencom.EnableWindow(TRUE);</p><p> AfxMessageBox(_T("請(qǐng)?jiān)O(shè)置通信參數(shù)
38、并打開(kāi)串口以實(shí)現(xiàn)通信!"));</p><p> CString strStatus,strTemp;</p><p> double dblBaund;</p><p> int mdata,mstop;</p><p> if (mySetupDlg.DoModal()==IDOK)</p><p&g
39、t;<b> {</b></p><p> myCom=mySetupDlg.m_com+1;//求取串口編號(hào)</p><p> if(mySetupDlg.m_BaudRate<8)</p><p><b> {</b></p><p> dblBaund=pow(2
40、,(double)mySetupDlg.m_BaudRate);//求取波特率</p><p> dblBaund=300*dblBaund;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b>&l
41、t;/p><p> switch(mySetupDlg.m_BaudRate)</p><p><b> {</b></p><p><b> case 8:</b></p><p> dblBaund=43000;</p><p><b> break;&l
42、t;/b></p><p><b> case 9:</b></p><p> dblBaund=56000;</p><p><b> break;</b></p><p><b> case 10:</b></p><p> dblB
43、aund=57600;</p><p><b> break;</b></p><p><b> case 11:</b></p><p> dblBaund=115200;</p><p><b> break;</b></p><p><
44、;b> case 12:</b></p><p> dblBaund=128000;</p><p><b> break;</b></p><p><b> case 13:</b></p><p> dblBaund=256000;</p><p&
45、gt;<b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> strStatus.Format(_T("%.0f"),dblBaund);</p><p> myBaudRate
46、=strStatus;</p><p> switch(mySetupDlg.m_Parity)// 求取奇偶校驗(yàn)位</p><p><b> {</b></p><p><b> case 0:</b></p><p><b> {</b></p&g
47、t;<p> myParity="E";</p><p><b> break;</b></p><p><b> }</b></p><p><b> case 1:</b></p><p><b> {</b>
48、;</p><p> myParity="M";</p><p><b> break;</b></p><p><b> }</b></p><p><b> case 2:</b></p><p><b> {
49、</b></p><p> myParity="N";</p><p><b> break;</b></p><p><b> }</b></p><p><b> case 3:</b></p><p><
50、;b> {</b></p><p> myParity="O";</p><p><b> break;</b></p><p><b> }</b></p><p><b> case 4:</b></p><
51、;p><b> {</b></p><p> myParity="S";</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p>
52、<p> mdata=4+mySetupDlg.m_Data;//求取數(shù)據(jù)位</p><p> strStatus.Format(_T("%d"),mdata);</p><p> myData=strStatus;</p><p> mstop=1+mySetupDlg.m_Stop;//求取停止位</p&g
53、t;<p> strStatus.Format(_T("%d"),mstop);</p><p> myStop=strStatus;</p><p> strStatus="COM";</p><p> strTemp.Format(_T("%d"),myCom);</p>
54、;<p> strStatus+=strTemp;</p><p> strStatus+=", ";</p><p> strStatus+=myBaudRate;</p><p> strStatus+="bit/s, ";</p><p> strStatus+=myPa
55、rity;</p><p> strStatus+=", ";</p><p> strStatus+=myData;</p><p> strStatus+=", ";</p><p> strStatus+=myStop;</p><p> m_Para=str
56、Status;//求取靜態(tài)文本顯示內(nèi)容</p><p> UpdateData(false);</p><p><b> }</b></p><p><b> }</b></p><p><b> 6.2打開(kāi)串口模塊</b></p><p>
57、; 單擊主界面中的【打開(kāi)串口】按鈕,如果參數(shù)已設(shè)置好,將打開(kāi)指定的串口,提示“串口打開(kāi)成功!”,如圖7.2所示,該命令的代碼如下:</p><p> void CMSCommDlg::OnBnClickedOpencom()</p><p><b> {</b></p><p> // TODO: 在此添加控件通知處理程序代碼</
58、p><p> CString strPara;//串口參數(shù)</p><p> m_mscom.put_CommPort(myCom);//指定串口號(hào)mycom</p><p> strPara=myBaudRate;</p><p> strPara+=", ";</p><p>
59、 strPara+=myParity;</p><p> strPara+=", ";</p><p> strPara+=myData;</p><p> strPara+=", ";</p><p> strPara+=myStop;</p><p> //Af
60、xMessageBox(strPara);</p><p> m_mscom.put_Settings(strPara);//通信參數(shù)設(shè)置</p><p> m_mscom.put_InBufferSize(1024);//指定接收緩沖區(qū)大小</p><p> m_mscom.put_InBufferCount(0);//清空接收緩沖區(qū)</p
61、><p> m_mscom.put_InputMode(1);//設(shè)置數(shù)據(jù)獲取方式</p><p> m_mscom.put_InputLen(0);//設(shè)置每次讀取長(zhǎng)度</p><p> m_mscom.put_RThreshold(1);//oncomm事件門(mén)限值</p><p> m_mscom.put_PortO
62、pen(1);//打開(kāi)串口</p><p> m_Opencom.EnableWindow(false);//使打開(kāi)串口按鈕無(wú)效</p><p> m_Closecom.EnableWindow(true);//使關(guān)閉串口按鈕生效</p><p> m_SendText.EnableWindow(true);</p><p&g
63、t; m_Setupcom.EnableWindow(false);//使設(shè)置按鈕無(wú)效</p><p> AfxMessageBox(_T("串口打開(kāi)成功!"));</p><p><b> }</b></p><p><b> 6.3發(fā)送數(shù)據(jù)模塊</b></p><p&
64、gt; 單擊主界面中的【發(fā)送】按鈕,將把發(fā)送區(qū)的內(nèi)容發(fā)送到串口調(diào)試助手的接收區(qū),如果【十六進(jìn)制發(fā)送】選中,則只能發(fā)送0~F,如圖7.3(a)(b)所示,該命令的代碼如下:</p><p> void CMSCommDlg::OnBnClickedSendbutton()</p><p><b> {</b></p><p> // TO
65、DO: 在此添加控件通知處理程序代碼</p><p> UpdateData(true);</p><p> if(m_ctrlHexSend.GetCheck())</p><p><b> { </b></p><p> CByteArray hexdata; </p><p> i
66、nt len=String2Hex(m_send,hexdata); </p><p> //此處返回的len可以用于計(jì)算發(fā)送了多少個(gè)十六進(jìn)制數(shù)</p><p> m_mscom.put_Output(COleVariant(hexdata)); //發(fā)送十六進(jìn)制數(shù)據(jù)</p><p><b> }</b></p><p
67、><b> else</b></p><p><b> {</b></p><p> CByteArray sendArr;</p><p> WORD wLength;</p><p> wLength = m_send.GetLength();</p><p&
68、gt; sendArr.SetSize(wLength);</p><p> for(int i =0; i<wLength; i++)</p><p><b> {</b></p><p> sendArr.SetAt(i, m_send.GetAt(i));</p><p><b> }&l
69、t;/b></p><p> m_mscom.put_Output(COleVariant(m_send));</p><p><b> }</b></p><p><b> }</b></p><p><b> 6.4自動(dòng)發(fā)送模塊</b></p>
70、<p> 當(dāng)【自動(dòng)發(fā)送】選中時(shí),系統(tǒng)將自動(dòng)每隔2s發(fā)送一次數(shù)據(jù),如圖7.4(a)(b)所示,程序代碼如下:</p><p> void CMSCommDlg::OnTimer(UINT_PTR nIDEvent)</p><p><b> {</b></p><p> // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值
71、</p><p> OnBnClickedSendbutton();</p><p> CDialog::OnTimer(nIDEvent);</p><p><b> }</b></p><p> void CMSCommDlg::OnBnClickedCheckAutosend()</p>&l
72、t;p><b> {</b></p><p> // TODO: 在此添加控件通知處理程序代碼</p><p> m_bAutoSend=!m_bAutoSend;</p><p> if(m_bAutoSend) </p><p><b> { </b></p>&l
73、t;p> SetTimer(1,2000,NULL);//時(shí)間為毫秒</p><p><b> } </b></p><p><b> else </b></p><p> { KillTimer(1); //取消定時(shí)} </p><p><b> }</b>&
74、lt;/p><p><b> 6.5接收數(shù)據(jù)模塊</b></p><p> 發(fā)送方發(fā)送數(shù)據(jù)后,在接受區(qū)顯示對(duì)方的發(fā)送內(nèi)容,如果【十六進(jìn)制顯示】選中,則將只顯示十六進(jìn)制數(shù)0~F,如圖7.5(a)(b)所示,該命令的代碼如下:</p><p> void CMSCommDlg::OnCommMscomm1()</p><p&g
75、t;<b> {</b></p><p> // TODO: 在此處添加消息處理程序代碼</p><p> UpdateData(true);</p><p> VARIANT variant_inp;</p><p> COleSafeArray safearray_inp;</p><p
76、> long i = 0;</p><p><b> int len;</b></p><p> char rxdata[2048];</p><p> CString tmp;</p><p> switch (m_mscom.get_CommEvent())</p><p>&
77、lt;b> {</b></p><p> case 2://表示接收緩沖區(qū)內(nèi)有字符</p><p><b> {</b></p><p> variant_inp = m_mscom.get_Input();</p><p> safearray_inp = variant_inp;&l
78、t;/p><p> len = safearray_inp.GetOneDimSize();</p><p> for (i = 0; i < len; i++)</p><p> safearray_inp.GetElement(&i, &rxdata[i]);//轉(zhuǎn)換為BYTE型數(shù)組</p><p> for (
79、i = 0; i < len; i++)///將數(shù)組轉(zhuǎn)換為Cstring型變量</p><p><b> {</b></p><p> BYTE bt=*(char*)(rxdata+i); //字符型</p><p> if(m_ctrlHexDisplay.GetCheck())</p><p>&l
80、t;b> {</b></p><p> tmp.Format(_T("%02X "),bt); //將字符以十六進(jìn)制方式送入臨時(shí)變量tmp存放,注意這里加入一個(gè)空隔</p><p> m_recv+=tmp; //加入接收編輯框?qū)?yīng)字符串</p><p><b> }</b></p>
81、<p><b> }</b></p><p> if(!m_ctrlHexDisplay.GetCheck())</p><p> rxdata[i] = '\0';</p><p><b> }</b></p><p> if(!m_ctrlHexDispla
82、y.GetCheck()) m_recv += rxdata;</p><p> UpdateData(false);</p><p><b> break;</b></p><p><b> default:</b></p><p><b> break;</b>&l
83、t;/p><p><b> }</b></p><p><b> }</b></p><p> 6.6清空接收區(qū)模塊</p><p> 單擊主界面中的【清空接收區(qū)】按鈕,將清空接收區(qū)內(nèi)容,提示“清空接收區(qū)內(nèi)容!” 如圖7.6所示,該命令的代碼如下:</p><p> v
84、oid CMSCommDlg::OnBnClickedClearRecv()</p><p><b> {</b></p><p> // TODO: 在此添加控件通知處理程序代碼</p><p> m_recv="";</p><p> UpdateData(FALSE);</p>
85、;<p> AfxMessageBox(_T("清空接收區(qū)成功!"));</p><p><b> }</b></p><p> 6.7清空發(fā)送區(qū)模塊</p><p> 單擊主界面中的【清空發(fā)送區(qū)】按鈕,將清空發(fā)送區(qū)內(nèi)容,提示“清空發(fā)送區(qū)內(nèi)容!” 如圖7.7所示,該命令的代碼如下:</p>
86、<p> void CMSCommDlg::OnBnClickedClearsend()</p><p><b> {</b></p><p> // TODO: 在此添加控件通知處理程序代碼</p><p> m_send="";</p><p> UpdateData(FAL
87、SE);</p><p> AfxMessageBox(_T("清空發(fā)送區(qū)成功!"));</p><p><b> }</b></p><p><b> 6.8關(guān)閉串口模塊</b></p><p> 單擊主界面中的【關(guān)閉串口】按鈕,將關(guān)閉串口,提示“串口關(guān)閉成功!”,如圖
88、7.8所示,該命令的代碼如下:</p><p> void CMSCommDlg::OnBnClickedClosecom()</p><p><b> {</b></p><p> // TODO: 在此添加控件通知處理程序代碼</p><p> m_mscom.put_PortOpen(0);//關(guān)閉
89、串口</p><p> AfxMessageBox(_T("串口關(guān)閉成功!"));</p><p> m_Opencom.EnableWindow(true);//使打開(kāi)串口按鈕生效</p><p> m_Closecom.EnableWindow(false);//使關(guān)閉串口按鈕無(wú)效</p><p>
90、 m_Setupcom.EnableWindow(true);//使設(shè)置按鈕生效</p><p><b> }</b></p><p><b> 7系統(tǒng)測(cè)試</b></p><p><b> 7.1測(cè)試</b></p><p> 首先,直接雙擊MSComm文件夾下
91、的debug子文件夾下的MSComm.exe運(yùn)行文件;</p><p> 其次,按以下步驟進(jìn)行測(cè)試:</p><p><b> (1)參數(shù)設(shè)置:</b></p><p><b> 圖7.1 參數(shù)設(shè)置</b></p><p><b> ?。?)打開(kāi)串口:</b></p
92、><p><b> 圖7.2 打開(kāi)串口</b></p><p> (3) 發(fā)送十六進(jìn)制:</p><p> 圖7.3(a)十六進(jìn)制發(fā)送</p><p> 圖7.3(b)串口調(diào)試助手十六進(jìn)制顯示</p><p><b> (4)接收數(shù)據(jù):</b></p>&
93、lt;p> 圖7.4(a)串口調(diào)試助手發(fā)送數(shù)據(jù)</p><p> 圖7.4(b)接收數(shù)據(jù)</p><p><b> (5)自動(dòng)發(fā)送</b></p><p> 圖7.5(a)自動(dòng)發(fā)送</p><p> 圖7.5(b)串口調(diào)試助手?jǐn)?shù)據(jù)顯示</p><p><b> ?。?)清
94、空接收區(qū)</b></p><p> 圖7.6 清空接收區(qū)</p><p><b> ?。?)清空發(fā)送區(qū)</b></p><p> 圖7.7清空發(fā)送區(qū)</p><p><b> (8)清空發(fā)送區(qū)</b></p><p><b> 圖7.8關(guān)閉串
95、口</b></p><p><b> 7.2總結(jié)</b></p><p> 通過(guò)上述測(cè)試,本系統(tǒng)實(shí)現(xiàn)了參數(shù)設(shè)置與顯示、打開(kāi)關(guān)閉串口、接收和發(fā)送數(shù)據(jù)、自動(dòng)發(fā)送、十六進(jìn)制發(fā)送與顯示、清空數(shù)據(jù)接收區(qū)和發(fā)送區(qū)內(nèi)容的功能,同時(shí),能避免在串口未打開(kāi)時(shí)發(fā)送接收數(shù)據(jù),避免十六進(jìn)制發(fā)送或顯示時(shí),發(fā)送其他字符。</p><p><b>
96、 8結(jié)論</b></p><p> 本次課程設(shè)計(jì),在visual studio 2008平臺(tái)下,利用MSComm控件編寫(xiě)串口通信程序,實(shí)現(xiàn)了串口通信參數(shù)設(shè)置與顯示、打開(kāi)和關(guān)閉串口、接收和發(fā)送數(shù)據(jù)、自動(dòng)發(fā)送、十六進(jìn)制發(fā)送與顯示、清空接收區(qū)和發(fā)送區(qū)內(nèi)容的功能。同時(shí),本串口通信程序能避免在串口未打開(kāi)時(shí)發(fā)送接收數(shù)據(jù),避免十六進(jìn)制發(fā)送或顯示時(shí),發(fā)送或顯示其他字符。但是,本程序也存在一些不足,如:十六進(jìn)制發(fā)送時(shí)
97、,只要其中有一個(gè)非十六進(jìn)制數(shù),則不能把數(shù)據(jù)發(fā)送出去。</p><p> 本次課程設(shè)計(jì),利用VC++下的MSComm控件編程方法,通過(guò)MSComm控件可以十分便捷地寫(xiě)出靈活性高,移植性強(qiáng)的串口通信程序,避免了去了解一些復(fù)雜的windowsAPI函數(shù)。這種方法具有很強(qiáng)的實(shí)用性,可以廣泛地用于工業(yè)數(shù)據(jù)采集等領(lǐng)域。</p><p><b> 參考文獻(xiàn)</b></p&
98、gt;<p> [1]李強(qiáng),賈云霞編著.VisualC++項(xiàng)目開(kāi)發(fā)實(shí)踐.北京:中國(guó)鐵道出版社,2003</p><p> [2]張?bào)蘩?,劉?shū)智編著.visualc++實(shí)踐與提高-串口通信與工程應(yīng)用篇.</p><p> 北京:中國(guó)鐵道出版社,2006</p><p> [3]淑慧VC++6.0環(huán)境下GPS接收機(jī)串口通信的實(shí)現(xiàn)[期刊論文]-測(cè)繪
99、信息與工程 2002(5)</p><p> [4]王華,岳麗全,岳志高. MSComm 控件在VC + + 6. 0串口通信中的應(yīng)用.</p><p> 長(zhǎng)春工程學(xué)院學(xué)報(bào):自然科學(xué)版,2009 ,10 (1)</p><p> [5]王莉,陽(yáng)春華.基于VC++的串口通信設(shè)計(jì)及其應(yīng)用[J].控制工程,2004,11 (S1) :89292.</p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于串口通信的高級(jí)語(yǔ)言控制程序的設(shè)計(jì)c++課程設(shè)計(jì)
- 課程設(shè)計(jì)---基于串口通信的高級(jí)語(yǔ)言控制程序的設(shè)計(jì)
- 課程設(shè)計(jì)--基于串口通信的高級(jí)語(yǔ)言控制程序的設(shè)計(jì)
- 串口通信c++課程設(shè)計(jì)
- 微機(jī)原理串口通信課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)--串口通信
- 嵌入式課程設(shè)計(jì)--串口通信的設(shè)計(jì)
- 基于labview單片機(jī)串口通信課程設(shè)計(jì)
- 單片機(jī)的雙機(jī)串口通信-課程設(shè)計(jì)
- at89c51雙機(jī)串口通信課程設(shè)計(jì)
- 基于vhdl語(yǔ)言串口控制器課程設(shè)計(jì)
- 基于arm的串口通信系統(tǒng)的課程設(shè)計(jì)說(shuō)明書(shū)
- 基于arm的串口通信系統(tǒng)的課程設(shè)計(jì)說(shuō)明書(shū)
- 基于dsp的串口通信設(shè)計(jì)與實(shí)現(xiàn)
- c++課程設(shè)計(jì)--通信錄管理程序
- c++課程設(shè)計(jì)--c++程序設(shè)計(jì)語(yǔ)言
- 基于fpga的串口通信電路設(shè)計(jì)
- 《高級(jí)語(yǔ)言程序設(shè)計(jì)》c++課程設(shè)計(jì)數(shù)值微分
- 高級(jí)語(yǔ)言程序設(shè)計(jì)c++課程答辯
- 串口通信控制器
評(píng)論
0/150
提交評(píng)論