葉艷艷,樊 峰,陳西曲
(武漢工業(yè)學院電氣與電子工程學院,湖北武漢430023
隨著計算機網(wǎng)絡及應用的發(fā)展,通信功能即計算機與外界設備或計算機和計算機之間的數(shù)據(jù)傳輸顯得越來越重要。串口通信技術因其實現(xiàn)簡單、使用靈活方便及傳輸數(shù)據(jù)穩(wěn)定可靠等優(yōu)點,作為一種重要的數(shù)據(jù)傳送手段得到越來越廣泛的應用[1-5]。因此,針對串口通信在計算機等上位機中的開發(fā),在項目開發(fā)過程中有著重要地位。本文講解了在Windows平臺下的串口通信,在VC++6.0開發(fā)環(huán)境下,單片機與PC機之間的數(shù)據(jù)通信及實時描點的實現(xiàn)過程。
作為CPU和串行設備間的編碼轉換器,串口將從CPU發(fā)送出去的字節(jié)數(shù)據(jù)轉換為串行的位,在接收數(shù)據(jù)時,又將串行的位轉換為字節(jié)數(shù)據(jù)[2]。
在Windows環(huán)境下,串口是系統(tǒng)資源的一部分。串口在Win32中是作為文件來進行處理的,并不直接對端口進行操作。Win32提供了相應的文件I/O函數(shù)與通信函數(shù),通過了解這些函數(shù)的使用,就可以編制出符合不同需要的通信程序[3]。應用程序要使用串口進行通信,必須在使用之前向操作系統(tǒng)提出資源申請要求即打開串口,通信完成后必須釋放資源即關閉串口[1-3]。
在VC++6.0開發(fā)環(huán)境下,實現(xiàn)串口通信的方法有多種,但是通過添加串行通信控件MSComm(Microsoft Communication Control)控件來實現(xiàn)串行通信是比較常用的一種方法。因為MSComm控件是微軟公司開發(fā)的新技術,封裝了串口通信的全部API函數(shù),這樣使用者就不必花費大量時間去了解復雜的API函數(shù)及硬件電路原理,只需添加少量的代碼就能實現(xiàn)想要的功能,編程容易實現(xiàn)。
另外,還可通過使用Windows系統(tǒng)提供的應用程序接口API(Application Programming Interface)函數(shù)和多線程編程來實現(xiàn)串口編程[4]。
本文通過對MSComm控件和NTGraph控件的操作來實現(xiàn)PC機與單片機之間的數(shù)據(jù)傳送和波形顯示。
1.2.1 在VC++開發(fā)環(huán)境下用MSComm控件實現(xiàn)串口通信
因MSComm控件內部封裝了串口通信的全部API函數(shù),采用MSComm控件實現(xiàn)串行通信具有不可替代的優(yōu)勢,故本文通過使用MSComm控件來實現(xiàn)串行通信。
應用MSComm控件實現(xiàn)串口通信工作流程圖如圖1所示。
圖1 MSComm控件工作流程圖
(1)MSComm控件的加載。菜單欄Project→Add to project→Components and Controls Gallery→打開Registered ActiveX Controls文件夾→選擇Microsoft Communications Control,version 6.0,單擊 Insert。完成MSComm類及相應文件的添加,生成mscomm.h和mscomm.cpp的文件。
(2)在基于對話框的程序中使用控件創(chuàng)建數(shù)據(jù)收發(fā)窗口界面。插入MSComm控件完成后,工具箱中會出現(xiàn)一個MSComm控件的圖標,將圖標拖到對話框中→編輯屬性修改ID→點擊右鍵,建立控件的類向導→添加控件的一個對象m_Comm→建立控件響應代碼框架→雙擊控件進入代碼框架添加代碼程序,一個控件即添加完成,對需要的各控件按照同樣方法逐一添加并設置。設置完參數(shù)的控件即可實現(xiàn)其相應的功能,比如發(fā)送窗口就能實現(xiàn)數(shù)據(jù)發(fā)送、接收窗口能實現(xiàn)數(shù)據(jù)接收等。設置完成后其對話框界面如圖2所示。
圖2 MSComm控件添加及參數(shù)設置后界面
(3)部分關鍵代碼實現(xiàn)步驟與分析。分析如下。
第一步,打開串口。
在OpenCOM()函數(shù)中設置打開串口,并以二進制方式讀取數(shù)據(jù)及清除緩沖區(qū)殘留數(shù)據(jù)。
第二步,將變量和串口分別進行初始化。
首先,我們在_Dlg::_Dlg(CWnd*pParent/*=NULL*/)
:CDialog(_Dlg::IDD,pParent)函數(shù)中將變量初始化。本例中約定使用PC機的COM3,波特率為2400b/s,數(shù)據(jù)格式為8個數(shù)據(jù)位,1個停止位,無奇偶校驗位。
其次,在OnInitDialog()中添加初始化語句,用于設置串口通信的屬性和打開串口。
((CComboBox*)GetDlgItem(IDC_COMBO_COM))->SetCurSel(m_nCom);//設置默認打開串口
UpdateData(FALSE);
第三步:串口讀寫。
雙擊MSComm控件,創(chuàng)建OnComm()函數(shù),實現(xiàn)數(shù)據(jù)讀寫。使用VARIANT數(shù)據(jù)結構即VARIANT GetInput() 和 void SetOutput(const Variant&new Value)函數(shù)原型來完成串口的讀寫,其中GetInput()讀取接收緩沖區(qū)的字符,SetOutput()向發(fā)送緩沖區(qū)寫數(shù)據(jù)流。
第四步,雙擊發(fā)送按鈕,創(chuàng)建發(fā)送函數(shù)OnButtonSend(),設置字符數(shù)據(jù)發(fā)送方式及位數(shù)。
利用MSComm控件順利實現(xiàn)了PC機與單片機之間的串口通信,實現(xiàn)了數(shù)據(jù)穩(wěn)定可靠的傳輸。
1.2.2 利用NTGraph控件實現(xiàn)波形顯示及實時描點
NTGraph控件因其接口函數(shù)簡單,只需要調用少數(shù)函數(shù)就能實現(xiàn)我們想要的功能,故是用來繪圖的很好的控件。本文就是利用NTGraph控件來實現(xiàn)波形顯示及實時描點的。應用NTGraph控件顯示波形的工作流程圖如圖3所示。
圖3 NTGraph控件工作流程圖
(1)NTGraph控件的插入。因為NTGraph控件不是Windows自帶的控件,故需注冊以后才可使用。點擊開始→運行→輸入regsvr32/X NTGraph.ocx(/X是控件路徑)→確定,完成注冊。然后在之前添加的MSComm控件RS232對話框上點擊右鍵→選擇Insert ActiveX Control→選擇 NTGraph Control,點擊OK,NTGraph控件即添加完成。右鍵點擊NTgraphCtrl1選擇屬性,即可根據(jù)需要選擇修改一些屬性,或者在程序里修改也行。修改完屬性的完整界面如圖4所示。
圖4 NTGraph控件添加完成后對話框界面
控件添加完成后,再給控件添加一個對象,這樣對象就可以訪問NTGraph類中的成員函數(shù)了。點擊菜單欄上的View→Classwizard→Member Variables→選擇IDC_NTGRAPHCTRL→點擊Add Variable添加變量m_Graph→點擊OK,即完成了對象的添加,添加完對象后,寫程序控制NTGraph控件,使其實現(xiàn)實時描點和顯示波形。
(2)部分關鍵代碼實現(xiàn)步驟與分析。首先,在OnInitDialog()的末尾添加NTGraph控件的初始化設置語句m_Graph.Set,用于設置X軸、Y軸及線條顯示的屬性等。然后,在OnComm()函數(shù)中加入自定義str_change_int(Cstring)函數(shù),用來數(shù)據(jù)類型的轉換,并利用一個for循環(huán)來實現(xiàn)實時描點及顯示波形。
8051單片機上有UART(通用異步發(fā)送接收器)用于串口通信,由TXD端發(fā)送數(shù)據(jù),RXD端接收數(shù)據(jù),并有2個緩沖器,一個用作發(fā)送緩沖器,一個用作接收緩沖器。8051采用C語言進行的程序設計。51單片機的RS232串口數(shù)據(jù)收發(fā)流程圖如圖5所示。
圖5 51單片機的工作流程圖
本文講解了在基于VC++6.0的開發(fā)環(huán)境下,通過利用MSComm控件及NTGraph控件,成功完成了十六進制數(shù)據(jù)的收發(fā)及波形顯示:從PC機輸入十六進制數(shù),PC機通過串口將數(shù)據(jù)發(fā)送到單片機上,單片機RXD端接收完成并產生響應后,再將數(shù)據(jù)從TXD端發(fā)送到PC機,PC機接收數(shù)據(jù)并以方波的形式顯示,成功實現(xiàn)了51單片機與PC機之間的串口通信與方波的產生。圖6是從PC機輸入兩位十六進制數(shù),其接收情況及波形顯示情況(延時100 ms)。由此可見用MSComm控件實現(xiàn)串口通信軟件的開發(fā)是穩(wěn)定、可靠的。系統(tǒng)整體工作流程圖如圖7所示。
圖6 結果展示圖
圖7 系統(tǒng)整體工作流程圖
本文利用ActiveX控件MSComm實現(xiàn)對串口的訪問及對數(shù)據(jù)的采集,編程簡單,可移植性強,穩(wěn)定性好,可靠性高。和NTGraph控件聯(lián)合使用,順利實現(xiàn)了對串口數(shù)據(jù)的實時描點及波形顯示。
[1] 劉書智.VC++實踐與提高—串口通信與工程應用篇(第二版)[M].北京:中國鐵道出版社,2009.
[2] 陳細軍,譚民.VC編程中的串口通信技術[J].計算機應用,2001(9):94-95.
[3] 趙軍.利用VC++下MSComm開發(fā)的串口通信軟件[J].中國測試技術,2006(6):97-99.
[4] 岳志高.MSComm控件在VC++6.0串口通信中的應用[J].長春工程學院學報,2009(1):72-73.
[5] 韓中合.用ActiveX控件實現(xiàn)串口通信編程[J].山東電力技術,2003(2):15-17.
[6] 邱建華,彭志豪.串口通信技術在Visual C++中的實現(xiàn)[J].技術,2005(5):94-95.