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