摘 要:數(shù)據(jù)采集系統(tǒng)應(yīng)用于工業(yè)控制各個(gè)領(lǐng)域,如何提高采集軟件的穩(wěn)定性和數(shù)據(jù)采集效率成為一個(gè)技術(shù)難點(diǎn)。利用C#語(yǔ)言程序設(shè)計(jì)的ADC數(shù)據(jù)采集上位機(jī),可以通過(guò)RS232接口讀取、轉(zhuǎn)換、存儲(chǔ)并實(shí)時(shí)顯示外圍數(shù)據(jù)源中的數(shù)據(jù)。另外,使用VS2013.NET編程環(huán)境類庫(kù)中Serial Port類和Timer類,可以提高數(shù)據(jù)采集效率、優(yōu)化容錯(cuò)機(jī)制和系統(tǒng)界面。
關(guān)鍵詞:C#;ADC;數(shù)據(jù)采集;串口通信;RS232
中圖分類號(hào):TP311.11
在計(jì)算機(jī)廣泛應(yīng)用的今天,數(shù)據(jù)采集系統(tǒng)在計(jì)算機(jī)各個(gè)領(lǐng)域都具有重要的作用和影響,而串行口是計(jì)算機(jī)和外圍數(shù)據(jù)設(shè)備之間進(jìn)行數(shù)據(jù)交換的重要介質(zhì)。串口通信正是由以PC作為上位機(jī)而以單片機(jī)作為下位機(jī)組成的數(shù)據(jù)采集系統(tǒng)最可靠,最簡(jiǎn)單、靈活的通信方式[1-2]。本系統(tǒng)的上位機(jī)設(shè)計(jì)主要是把特定的數(shù)據(jù)有單片機(jī)組成的數(shù)據(jù)存儲(chǔ)裝置中讀取出來(lái),而作適當(dāng)處理后存儲(chǔ)到文本文件中。由于使用Windows API編程非常繁瑣,本系統(tǒng)上位機(jī)采用了C#語(yǔ)言在Visual Studio 2013.NET環(huán)境下完成[3]。.NET集成了大量的實(shí)用類庫(kù),本系統(tǒng)上位機(jī)部分主要使用了Serial Port類和Timer類進(jìn)行串口同信與多線編程,使得上位機(jī)軟件編程部分大為輕松[4]。
1 系統(tǒng)的整體設(shè)計(jì)
系統(tǒng)整體是由外圍電路和飛思卡爾K60芯片組成的ADC數(shù)據(jù)采集系統(tǒng),通過(guò)串口RS232將數(shù)據(jù)送到PC機(jī),由上位機(jī)將數(shù)存儲(chǔ)到文本庫(kù)里面。
圖1 整體系統(tǒng)設(shè)計(jì)
2 上位機(jī)的設(shè)計(jì)與實(shí)現(xiàn)
上位機(jī)軟件通過(guò)RS232串行口與外圍數(shù)據(jù)模塊通信,完成數(shù)據(jù)的采集工作,然后做適當(dāng)數(shù)據(jù)處理后,進(jìn)行數(shù)據(jù)存儲(chǔ)與顯示。本設(shè)計(jì)中采用的上位機(jī)軟件是在Windows 7操作系統(tǒng)下Visual Studio 2013.NET編程環(huán)境中,利用C#語(yǔ)言編程完成,通過(guò)Serial Port類來(lái)實(shí)現(xiàn)串口通信功能,通過(guò)Timer類來(lái)完成定時(shí)采集功能,最后使用TXT文本文件來(lái)存儲(chǔ)數(shù)據(jù)。其中,Serial Port類為應(yīng)用程序提供了通過(guò)串口收發(fā)數(shù)據(jù)的簡(jiǎn)便方法,具有功能強(qiáng)大,通信快速,實(shí)時(shí)性好的特點(diǎn)[4]。
上位機(jī)設(shè)計(jì)的重難點(diǎn)在于如何通過(guò)串口從下位機(jī)接收到數(shù)據(jù)將采集的數(shù)據(jù)實(shí)時(shí)存儲(chǔ)、顯示出來(lái)。上位機(jī)總體設(shè)計(jì)流程圖如圖2所示。
圖2 上位機(jī)程序流程圖
從串口接收的數(shù)據(jù)主要采用Serial Port控件,在Visual Studio 2013中添加該控件,需要設(shè)置COM口(可修改),波特率(9600),數(shù)據(jù)位(8)、停止位(1)、校驗(yàn)位(0),通過(guò)事件驅(qū)動(dòng)方式接收數(shù)據(jù)。
2.1 主要涉及步驟
(1)先在VS開(kāi)發(fā)環(huán)境下新建一個(gè)window工程,然后在窗體上安放一些必須的控件,如按鍵(button)、文本框(Textbox)等;
(2)添加timer控件和Serial Port控件分別實(shí)現(xiàn)數(shù)據(jù)采集的定時(shí)和數(shù)據(jù)采集的鏈接。
2.2 上位機(jī)程序設(shè)計(jì)(程序段)
2.2.1 串口處理程序
if (serialPort1.IsOpen)//判斷
{serialPort1.Close();//此處可不加try catch
TrackBar[] MyProgeressBar=GetTrackBar();
foreach(TrackBar theBar in MyProgeressBar)//遍歷,每個(gè)progressbar歸零
theBar.Value=0;
button1.Text=\"打開(kāi)串口\";}
else
{try{
serialPort1.PortName=comboBox1.Text;//串口號(hào)
serialPort1.Open();//打開(kāi)
groupBox2.Visible=true;//第二個(gè)框框可見(jiàn)
button1.Text=\"關(guān)閉串口\";}//按鍵標(biāo)題
此處的難點(diǎn)在于要將串口接收到的數(shù)據(jù)依次通過(guò)TrackBar將數(shù)據(jù)動(dòng)態(tài)顯示。
2.2.2 獲取系統(tǒng)時(shí)間程序
textBox2.Text=DateTime.Now.ToString();
通過(guò)DataTime.Now獲取當(dāng)前電腦系統(tǒng)的時(shí)間,采用ToString方法會(huì)返回一個(gè)“以文本方式表示”此對(duì)象的字符串。
2.2.3 存儲(chǔ)數(shù)據(jù)程序
System.IO.StreamWriter swobj=System.IO.File.AppendText(\"E:\\1.txt\");
swobj.WriteLine(this.textBox1.Text);
swobj.Flush();
swobj.Close();
通過(guò)System.IO獲取軟件與系統(tǒng)的通道,再通過(guò)WriteLine函數(shù),將數(shù)據(jù)一行一行寫(xiě)入(\"E:\\1.txt\")這個(gè)文件中。最后通過(guò)swobj.Flush(),swobj.Close()兩個(gè)函數(shù)將數(shù)據(jù)不斷的存和儲(chǔ)。
3 運(yùn)行效果及主要界面
本軟件經(jīng)過(guò)長(zhǎng)期運(yùn)行,數(shù)據(jù)采集正常,能夠?qū)⑼鈬臄?shù)據(jù)源中的數(shù)據(jù)正確讀取并按規(guī)定格式處理,取得了較好的數(shù)據(jù)此采集效率,達(dá)到了設(shè)計(jì)預(yù)期效果,其中主要運(yùn)行界面及效果圖如下:
圖3 初始界面圖
圖4 運(yùn)行效果屆面圖
由圖4可知,該上位機(jī)具有良好的系統(tǒng)界面,TrackBar實(shí)時(shí)顯示當(dāng)前采集動(dòng)態(tài)數(shù)據(jù),同時(shí)通道1實(shí)時(shí)顯示當(dāng)前所采集的數(shù)據(jù),同時(shí)顯示系統(tǒng)當(dāng)前運(yùn)行時(shí)間。
圖5 存儲(chǔ)數(shù)據(jù)界面
由圖5可知,TXT文本中顯示當(dāng)前的數(shù)據(jù)和采集的時(shí)間,每隔1/6s采集的數(shù)據(jù),避免了數(shù)據(jù)丟失,提高了采集效率。
由表1,我們可知道,上位機(jī)通過(guò)長(zhǎng)時(shí)間的運(yùn)作,發(fā)現(xiàn)數(shù)據(jù)采集一直維持在萬(wàn)分之幾,都在誤差允許范圍內(nèi),說(shuō)明該軟件具有良好的容錯(cuò)機(jī)制。
4 結(jié)束語(yǔ)
利用C#語(yǔ)言程序設(shè)計(jì)的ADC數(shù)據(jù)采集上位機(jī),可以通過(guò)RS232接口讀取、轉(zhuǎn)換、存儲(chǔ)并實(shí)時(shí)顯示外圍數(shù)據(jù)源中的數(shù)據(jù)。另外,使用VS2013.NET編程環(huán)境類庫(kù)中Serial Port類和Timer類,可以提高數(shù)據(jù)采集效率、優(yōu)化容錯(cuò)機(jī)制和系統(tǒng)界面。
經(jīng)過(guò)長(zhǎng)時(shí)間測(cè)試,本文所設(shè)計(jì)的上位機(jī)軟件運(yùn)行良好、性能穩(wěn)定,操作簡(jiǎn)便,較好的滿足了數(shù)據(jù)采集系統(tǒng)對(duì)上位機(jī)的要求。
參考文獻(xiàn):
[1]李強(qiáng).基于API函數(shù)的Windows多線程串口通信[J].科技信息,2008(17):404-405.
[2]吳興中,歐青立.一種PC與單片機(jī)RS232串口通信設(shè)計(jì)[J].應(yīng)用天地,2009(01):74-75.
[3]韓中華,趙貞麗,丁志文.基于C#串行類的PC機(jī)與IC卡讀寫(xiě)器串行通信的實(shí)現(xiàn)[J].科技廣場(chǎng),2007(03):79-81.
[4]張立.C#程序設(shè)計(jì)編程經(jīng)典[M].北京:清華大學(xué)出版社,2008.
作者簡(jiǎn)介:甘亞鵬(1990-),男,湖北崇陽(yáng)人,本科,電子與信息科學(xué)與技術(shù)專業(yè),研究方向:非線性理論控制(PID,混沌控制)、智能機(jī)器人控制算法研究、C#、C++、VB上位機(jī)的編程與應(yīng)用;方磊(1992-),男,湖北鄂州人,本科,電子與信息科學(xué)與技術(shù)專業(yè),研究方向:C#、C++、VB上位機(jī)的編程與應(yīng)用。
作者單位:湖北科技學(xué)院 電子與信息工程學(xué)院,湖北咸寧 437100