版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 1引言1</b></p><p> 1.1問題的提出1</p><p> 1.2國內外研究的現(xiàn)狀1</p><p> 1.5任務與分析2</p><p> 1.5.1主要任務2&l
2、t;/p><p><b> 1.5.2分析2</b></p><p> 2程序的主要功能2</p><p> 2.1參數(shù)設置功能2</p><p> 2.2參數(shù)顯示功能2</p><p> 2.3打開串口功能2</p><p> 2.4關閉串口功能2&l
3、t;/p><p> 2.5接收數(shù)據(jù)功能3</p><p> 2.6發(fā)送數(shù)據(jù)功能3</p><p> 2.7清空數(shù)據(jù)接收區(qū)和發(fā)送區(qū)功能3</p><p><b> 3程序運行平臺3</b></p><p><b> 4總體設計4</b></p>&
4、lt;p> 5程序變量定義說明4</p><p><b> 6模塊分析5</b></p><p> 6.1初始化模塊5</p><p> 6.2參數(shù)設置和顯示模塊6</p><p> 6.3發(fā)送數(shù)據(jù)模塊8</p><p> 6.4數(shù)據(jù)接收模塊9</p>
5、<p> 6.5清空接數(shù)據(jù)模塊10</p><p> 6.6關閉串口模塊10</p><p><b> 7系統(tǒng)測試11</b></p><p><b> 7.1測試11</b></p><p><b> 7.2總結16</b></p>
6、<p><b> 8結論16</b></p><p><b> 參考文獻16</b></p><p><b> 摘 要</b></p><p> 隨著計算機的普及,計算機網(wǎng)絡和多微機系統(tǒng)的廣泛應用,盡管當今USB通信技術和以太網(wǎng)技術快速發(fā)展,然而串口通信技術始終以其連接簡便
7、,價格低廉,穩(wěn)定可靠等優(yōu)點,在計算機通信領域占有一席之地。MSCOmm控件是微軟公司為了用戶使用方便而提供的一種便捷的控制串口編程的解決方案,本文主要介紹了如何利用VC + + 2008 MSComm 控件的串口通信方法,對程序的類進行了說明,分析了本程序各個模塊怎樣實現(xiàn)起作用。此次設計以MFC 來設計界面編制程序,同時利用MSComm 控件通過串口發(fā)送和接收數(shù)據(jù),實現(xiàn)了串口通信。該串口通信控制程序具有通信參數(shù)設置、通信參數(shù)顯示、打開和
8、關閉串口、接收數(shù)據(jù)、發(fā)送數(shù)據(jù)、清空發(fā)送區(qū)和接收區(qū)數(shù)據(jù)的功能。</p><p> 關鍵詞:串口通信visual c++ 6.0 MSComm控件</p><p><b> 1引言</b></p><p><b> 1.1問題的提出</b></p><p> 串行通信(Serial
9、 Communication )在現(xiàn)代工業(yè)控制系統(tǒng)中一直有著及其重要的地位,作為一種基本而又靈活方便的通信方式,它被廣泛應用于PC與PC或者PC與PLC之間的數(shù)據(jù)交換以及其他工業(yè)控制與自動控制中,它不僅沒有因為時代的進步而遭淘汰,反而在規(guī)格上越來越完善,應用也越來越廣泛。VC++是新一代面向對象的可視化開發(fā)工具,提供了良好的界面設計能力,在PC機的串口通信方面有很強的功能。對于從事機械行業(yè)的人來說,熟悉基于RS232串口通信的高級語言編
10、程方法顯得十分重要。</p><p> 1.2國內外研究的現(xiàn)狀</p><p> 目前,計算機的串行通信應用十分廣泛,串行接口已成為計算機的必需部件和接口之一。由于其具有連接簡單、使用靈活方便、數(shù)據(jù)傳遞可靠等優(yōu)點,在工業(yè)監(jiān)控、數(shù)據(jù)采集和實時控制系統(tǒng)中得到了廣泛應用。當今,實現(xiàn)串口通信的方法以及第三方控件有很多,例如PComm控件,Windows API函數(shù)等等。但是這幾種方法都過于復雜
11、,對程序員要求較高,而且可靠性并不是很好。利用Microsoft推出的MSComm控件,使得串口通信的實現(xiàn)更為簡單、可靠。</p><p> 隨著當今信息技術的快速發(fā)展,通信已成為信息技術中的關鍵問題。尤其在控制領域,以何種方式實現(xiàn)計算機與外圍設備間既簡單又可靠的通信,就顯得特別重要。由于串行通信具有實現(xiàn)簡單、使用靈活方便、數(shù)據(jù)傳輸可靠等優(yōu)點,因而廣泛應用于工業(yè)控制系統(tǒng)中,是計算機與外部設備進行數(shù)據(jù)通信時經(jīng)常使
12、用的方式之一。VC++是新一代面向對象的可視化開發(fā)工具,提供了良好的界面設計能力,在PC機的串口通信方面有很強的功能。它具有功能強大、簡便易用和代碼執(zhí)行速度快等特點,在通信軟件的開發(fā)中成為越來越多開發(fā)人員的首選工具。無論在工業(yè)控制中PC機和單片機之間的通信,還是在2臺Pc機之間的串口通信,都具有相同的原理。只要掌握其中的通信本質,就能靈活地實現(xiàn)串口通信,串口控制。</p><p><b> 1.5任務
13、與分析</b></p><p><b> 1.5.1主要任務</b></p><p> ★制定串口通信控制程序的總體構架;</p><p> ★熟悉VC平臺下的高級語言編程方法;</p><p> ★熟悉基于RS232串口通信的高級語言編程方法;</p><p> ★在同一臺
14、PC機上調試通過所編寫的程序;</p><p><b> 1.5.2分析</b></p><p> 目前Win32 中基于VC + + 6. 0 的常用串口通信程序一般可以用兩種方法實現(xiàn): ①利用MSComm ActiveX 串行通信控件; ②使用Win2dows API 通信函數(shù)。雖然在Windows下Win32API提供了使用文件操作方式的函數(shù)進行串口操作的方
15、法,但是在編程實現(xiàn)上還是比較復雜。Windows平臺先進的ActiveX技術使得對串口編程不再需要處理煩瑣的細節(jié)。利用已有的AxtiveX控件,只需要編寫少量的代碼,就可以輕松高效地完成任務。因此程序員不需要花時間去了解復雜的API函數(shù),只需要利用MSComm控件就可實現(xiàn)串口編程。</p><p><b> 2程序的主要功能</b></p><p><b>
16、; 2.1參數(shù)設置功能</b></p><p> 設置和修改串口通信參數(shù),包括端口,波特率,奇偶校驗位,數(shù)據(jù)位,停止位。</p><p><b> 2.2參數(shù)顯示功能</b></p><p> 顯示當前串口通信參數(shù),包括端口號,波特率,奇偶校驗位,數(shù)據(jù)位,停止位。</p><p><b>
17、 2.3打開串口功能</b></p><p> 打開串口,實現(xiàn)通信。</p><p><b> 2.4關閉串口功能</b></p><p> 關閉串口,停止通信。</p><p><b> 2.5接收數(shù)據(jù)功能</b></p><p> 能夠進行單個或多個
18、數(shù)據(jù)的接收和顯示。</p><p><b> 2.6發(fā)送數(shù)據(jù)功能</b></p><p> 能夠進行單個或多個數(shù)據(jù)的發(fā)送。</p><p> 2.7清空數(shù)據(jù)接收區(qū)和發(fā)生區(qū)功能</p><p> 刪除接收區(qū)和發(fā)生區(qū)所有數(shù)據(jù)。</p><p><b> 3程序運行平臺</b&
19、gt;</p><p> Visual c++ 6.0</p><p><b> 具體操作如下:</b></p><p> ?。?)新建MSComm項目,選擇MFC應用程序,應用程序類型選擇“基于對話框”,生成的類中選擇“CMSCommDlg”;</p><p> ?。?)為MSComm項目添加新建一個Dialog設
20、置對話框;</p><p> (3)加載MSComm控件,添加相應的源程序,加載必要的控件;</p><p> ?。?)編寫程序代碼,再編譯,鏈接,調試,執(zhí)行等,生成應用程序。</p><p><b> 4總體設計</b></p><p> 圖4.1系統(tǒng)總體框架圖</p><p><b
21、> 5程序變量定義說明</b></p><p><b> 6模塊分析</b></p><p><b> 6.1初始化模塊</b></p><p><b> 代碼如下:</b></p><p> BOOL CMyDlg::OnInitDialog()&
22、lt;/p><p><b> {</b></p><p> CDialog::OnInitDialog();</p><p> m_msomm.SetInBufferSize(1024); //設置接收緩沖區(qū)的大小</p><p> m_msomm.SetOutBufferSize(512)
23、; //設置發(fā)送緩沖區(qū)的大小</p><p> if(m_msomm.GetPortOpen()) //判斷串口是否打開</p><p> m_msomm.SetPortOpen(FALSE); //串口如果打開就關閉它</p><p> m_msomm.SetC
24、ommPort(2); //設置通道為COM2</p><p> if(!m_msomm.GetPortOpen()) //判斷串口是否打開</p><p> m_msomm.SetPortOpen(TRUE); //如果沒有打開就重新開啟</p><p&
25、gt;<b> else</b></p><p> AfxMessageBox("serial port open error"); </p><p> m_msomm.SetInputMode(1); //設置以二進制方式接收</p><p> m_msomm.SetSe
26、ttings("9600,n,8,1"); //設置波特率9600,無校檢位,8位數(shù)據(jù)位,1位停止位</p><p> m_msomm.SetRThreshold(1); //串口接收緩沖區(qū)有多于或等于一個字符是產(chǎn)生接收數(shù)據(jù)的OnOnComm</p><p> m_msomm.SetInputLen(0);
27、 //設置當前接收區(qū)長度為零</p><p> m_msomm.GetInput(); //預讀取緩沖區(qū)以清空殘留數(shù)據(jù)</p><p><b> //組合框的初始化</b></p><p> m_td.SetCurSel(1); </p>&l
28、t;p> m_btl.SetCurSel(5);</p><p> m_xjw.SetCurSel(2);</p><p> m_sjw.SetCurSel(0);</p><p> m_tzw.SetCurSel(0);</p><p> // Add "About..." menu item to sy
29、stem menu.</p><p> // IDM_ABOUTBOX must be in the system command range.</p><p> ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);</p><p> ASSERT(IDM_ABOUTBOX < 0xF000);<
30、/p><p> CMenu* pSysMenu = GetSystemMenu(FALSE);</p><p> if (pSysMenu != NULL)</p><p><b> {</b></p><p> CString strAboutMenu;</p><p> strAbout
31、Menu.LoadString(IDS_ABOUTBOX);</p><p> if (!strAboutMenu.IsEmpty())</p><p><b> {</b></p><p> pSysMenu->AppendMenu(MF_SEPARATOR);</p><p> pSysMenu->
32、;AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);</p><p><b> }</b></p><p><b> }</b></p><p> 6.2參數(shù)設置和顯示模塊</p><p> 選擇組合框中相應的設置內容即可設置串口的通信參數(shù),
33、如圖7.1。該命令的代碼如下:</p><p> void CMyDlg::OnSelchangeCombo1() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p><b&
34、gt; //改變串口通道</b></p><p> if(m_msomm.GetPortOpen())</p><p> m_msomm.SetPortOpen(FALSE);</p><p> m_msomm.SetCommPort(m_td.GetCurSel()+1);</p><p> m_msomm.SetPo
35、rtOpen(TRUE);</p><p><b> }</b></p><p> void CMyDlg::OnSelchangeCombo2() </p><p><b> {</b></p><p> // TODO: Add your control notification han
36、dler code here</p><p><b> //改變波特率</b></p><p> int i=m_btl.GetCurSel();</p><p><b> switch(i)</b></p><p><b> {</b></p><
37、p> case 0:m_msomm.SetSettings("300,,,");break;</p><p> case 1:m_msomm.SetSettings("600,,,");break;</p><p> case 2:m_msomm.SetSettings("1200,,,");break;</p&
38、gt;<p> case 3:m_msomm.SetSettings("2400,,,");break;</p><p> case 4:m_msomm.SetSettings("4800,,,");break;</p><p> case 5:m_msomm.SetSettings("9600,,,");br
39、eak;</p><p> case 6:m_msomm.SetSettings("19200,,,");break;</p><p> case 7:m_msomm.SetSettings("38400,,,");break;</p><p><b> }</b></p><
40、p><b> }</b></p><p> void CMyDlg::OnSelchangeCombo4() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><
41、;p><b> //改變數(shù)據(jù)位</b></p><p> int i=m_sjw.GetCurSel();</p><p><b> switch(i)</b></p><p><b> {</b></p><p> case 0:m_msomm.SetSett
42、ings(",,8,");break;</p><p> case 1:m_msomm.SetSettings(",,7,");break;</p><p> case 2:m_msomm.SetSettings(",,6,");break;</p><p><b> }</b>
43、</p><p><b> }</b></p><p> void CMyDlg::OnSelchangeCombo5() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code her
44、e</p><p><b> //改變停止位</b></p><p> int i=m_tzw.GetCurSel();</p><p><b> switch(i)</b></p><p><b> {</b></p><p> case 0
45、:m_msomm.SetSettings(",,,1");break;</p><p> case 1:m_msomm.SetSettings(",,,2");break;</p><p><b> }</b></p><p><b> }</b></p><
46、;p> void CMyDlg::OnSelchangeCombo3() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p><b> //改變校檢位</b></p&g
47、t;<p> int i=m_xjw.GetCurSel();</p><p><b> switch(i)</b></p><p><b> {</b></p><p> case 0:m_msomm.SetSettings(",N,,");break;</p>&
48、lt;p> case 1:m_msomm.SetSettings(",O,,");break;</p><p> case 2:m_msomm.SetSettings(",E,,");break;</p><p><b> }</b></p><p><b> }</b>
49、;</p><p><b> 6.3發(fā)送數(shù)據(jù)模塊</b></p><p> 單擊主界面中的【數(shù)據(jù)發(fā)送】按鈕,將把發(fā)送區(qū)的內容發(fā)送到串口調試助手的接收區(qū),如圖7.3,該命令的代碼如下:</p><p> void CMyDlg::OnOsend() </p><p><b> {</b><
50、;/p><p> // TODO: Add your control notification handler code here</p><p><b> //發(fā)送數(shù)據(jù)</b></p><p> UpdateData(1);</p><p> m_msomm.SetOutput(COleVariant(m_str_
51、send));</p><p><b> }</b></p><p><b> 6.4數(shù)據(jù)接收模塊</b></p><p> 如圖7.2,程序代碼如下:</p><p> void CMyDlg::OnOnCommMscomm1() </p><p><b>
52、; {</b></p><p> // TODO: Add your control notification handler code here</p><p><b> //定義參數(shù)</b></p><p> COleSafeArray x;</p><p> VARIANT y;</p&
53、gt;<p> BYTE rxdata[1024];</p><p> CString a;</p><p> LONG len, k;</p><p> //判斷是否接受數(shù)據(jù),進行類型轉換</p><p> if(m_msomm.GetCommEvent()==2)</p><p><b
54、> {</b></p><p> y=m_msomm.GetInput(); //讀取接收緩沖區(qū)的內容</p><p><b> x=y;</b></p><p> len=x.GetOneDimSize();</p><p> for(k=0;k<len;k++)</p>
55、<p> x.GetElement(&k,rxdata+k);</p><p> for(k=0;k<len;k++)</p><p> { BYTE bt=*(char*)(rxdata+k);</p><p> if(!m_16.GetCheck())</p><p> {a.Format("
56、;%c",bt); </p><p> m_str_recv+=a;} </p><p><b> else</b></p><p> {a.Format("%02X",bt); //十六進制轉換</p><p> m_str_recv+=a+" ";}
57、</p><p><b> }</b></p><p><b> }</b></p><p> UpdateData(0); //顯示數(shù)據(jù)</p><p><b> }</b></p><p> 6.5清空接數(shù)據(jù)模塊&l
58、t;/p><p> 單擊主界面中的【清空】按鈕,將清空所有數(shù)據(jù),如圖7.4,該命令的代碼如下:</p><p> void CMyDlg::OnButton4() </p><p><b> {</b></p><p> // TODO: Add your control notification handler c
59、ode here</p><p> //清空接收,發(fā)送框的內容</p><p> m_str_send="";</p><p> m_str_recv="";</p><p> UpdateData(0);</p><p><b> }</b>&
60、lt;/p><p><b> 6.6關閉串口模塊</b></p><p> 單擊主界面中的【關閉串口】按鈕,將關閉串口,該命令的代碼如下:</p><p> void CMyDlg::OnButton1() </p><p><b> {</b></p><p> //
61、 TODO: Add your control notification handler code here</p><p><b> //串口的開關</b></p><p> int x=m_msomm.GetPortOpen();</p><p> m_msomm.SetPortOpen(!x);</p><p&g
62、t;<b> }</b></p><p><b> 7系統(tǒng)測試</b></p><p><b> 7.1測試</b></p><p> 首先,直接雙擊MSComm文件夾下的debug子文件夾下的MSComm.exe運行文件;</p><p> 其次,按以下步驟進行測試
63、:</p><p><b> (1)參數(shù)設置:</b></p><p><b> 圖7.1 參數(shù)設置</b></p><p><b> (2)接收數(shù)據(jù):</b></p><p> 圖7.2(a)串口調試助手發(fā)送數(shù)據(jù)</p><p> 圖7.2(
64、b)串口通信工具接收數(shù)據(jù)</p><p> 圖7.3(a)串口助手發(fā)送十六進制數(shù)據(jù)</p><p> 圖7.3(b)串口工具接收并顯示十六進制數(shù)據(jù)</p><p><b> ?。?)發(fā)送數(shù)據(jù)</b></p><p> 圖7.3(c)串口工具發(fā)送數(shù)據(jù)</p><p> 圖7.3(d)調試助手
65、接收數(shù)據(jù)</p><p><b> (4)清空接收區(qū)</b></p><p><b> 圖7.4清空接收區(qū)</b></p><p><b> 7.2總結</b></p><p> 通過上述測試,本系統(tǒng)實現(xiàn)了參數(shù)設置與顯示、打開關閉串口、接收和發(fā)送數(shù)據(jù)、自動發(fā)送、十六進制
66、顯示、清空數(shù)據(jù)接收區(qū)和發(fā)送區(qū)內容的功能,同時,能夠在任何時候更改串口參數(shù)。</p><p><b> 8結論</b></p><p> 本次課程設計,在visual c++ 6.0平臺下,利用MSComm控件編寫串口通信程序,實現(xiàn)了串口通信參數(shù)設置與顯示、打開和關閉串口、接收和發(fā)送數(shù)據(jù)(包括十六進制的接收)、清空接收區(qū)和發(fā)送區(qū)內容的功能。同時,本串口通信程序能避免
67、在串口未打開時發(fā)送接收數(shù)據(jù)。但是,本程序也存在一些不足,如沒有串口開關狀態(tài)的提示,如果在數(shù)據(jù)發(fā)送過程中改變串口設置會接收、發(fā)送數(shù)據(jù)會出現(xiàn)錯誤,所有不要再發(fā)送數(shù)據(jù)過程中更改串口參數(shù)。</p><p> 本次課程設計,利用VC++下的MSComm控件編程方法,通過MSComm控件可以十分便捷地寫出靈活性高,移植性強的串口通信程序,避免了去了解一些復雜的windowsAPI函數(shù)。這種方法具有很強的實用性,可以廣泛地用
68、于工業(yè)數(shù)據(jù)采集等領域。</p><p><b> 參考文獻</b></p><p> [1]李強,賈云霞編著.VisualC++項目開發(fā)實踐.北京:中國鐵道出版社,2003</p><p> [2]張筠莉,劉書智編著.visualc++實踐與提高-串口通信與工程應用篇.</p><p> 北京:中國鐵道出版社,2
69、006</p><p> [3]淑慧VC++6.0環(huán)境下GPS接收機串口通信的實現(xiàn)[期刊論文]-測繪信息與工程 2002(5)</p><p> [4]王華,岳麗全,岳志高. MSComm 控件在VC + + 6. 0串口通信中的應用.</p><p> 長春工程學院學報:自然科學版,2009 ,10 (1)</p><p> [5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設計--基于串口通信的高級語言控制程序的設計
- 串口通信c++課程設計--基于串口通信的高級語言控制程序的設計
- 基于串口通信的高級語言控制程序的設計c++課程設計
- 基于plc的串級控制程序的課程設計
- 微機課程設計--智能流星燈管的控制程序設計
- 課程設計---全自動洗衣機控制程序設計
- 基于vhdl語言串口控制器課程設計
- 設計開發(fā)控制程序
- 設計開發(fā)控制程序
- 機械手課程設計--機械手控制程序
- 設計開發(fā)控制程序
- eda課程設計--三層電梯plc控制程序設計
- 《高級語言程序設計》課程設計大綱
- 《高級語言程序設計》課程設計報告
- plc課程設計--熱處理車間溫度plc控制程序
- 網(wǎng)絡遠程通信和控制程序畢業(yè)設計
- 設計變更控制程序
- plc課程設計--兩臺抽水機控制程序設計
- 虛擬儀器技術及應用課程設計-電梯控制程序設計
- 課程設計--廣告牌燈自動閃爍plc控制程序設計
評論
0/150
提交評論