《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > C#下串口通信編程的開(kāi)發(fā)和擴(kuò)展
C#下串口通信編程的開(kāi)發(fā)和擴(kuò)展
來(lái)源:微型機(jī)與應(yīng)用2014年第6期
朱英翔,朱福民,劉炎鳴
(上海海事大學(xué) 物流工程學(xué)院,上海201306)
摘要: 采用C#編程創(chuàng)建窗體應(yīng)用程序,結(jié)合實(shí)際應(yīng)用,實(shí)現(xiàn)工業(yè)數(shù)據(jù)的串口的采集處理。利用combobox控件進(jìn)行串口參數(shù)預(yù)設(shè)。完成串口數(shù)據(jù)采集,通過(guò)實(shí)例化graphic類在picturebox控件中實(shí)現(xiàn)數(shù)據(jù)的圖樣化表達(dá)。在數(shù)據(jù)的閾值報(bào)警和Excel數(shù)據(jù)保存方面進(jìn)行了研究,較好地解決了生產(chǎn)實(shí)踐中的關(guān)鍵問(wèn)題。
Abstract:
Key words :

摘  要: 采用C#編程創(chuàng)建窗體應(yīng)用程序,結(jié)合實(shí)際應(yīng)用,實(shí)現(xiàn)工業(yè)數(shù)據(jù)的串口的采集處理。利用combobox控件進(jìn)行串口參數(shù)預(yù)設(shè)。完成串口數(shù)據(jù)采集,通過(guò)實(shí)例化graphic類在picturebox控件中實(shí)現(xiàn)數(shù)據(jù)的圖樣化表達(dá)。在數(shù)據(jù)的閾值報(bào)警和Excel數(shù)據(jù)保存方面進(jìn)行了研究,較好地解決了生產(chǎn)實(shí)踐中的關(guān)鍵問(wèn)題。
關(guān)鍵詞: C#編程;串口;數(shù)據(jù)處理

    在工業(yè)現(xiàn)場(chǎng)進(jìn)行作業(yè)和實(shí)驗(yàn)時(shí),需要對(duì)一些工業(yè)設(shè)備的狀態(tài)進(jìn)行監(jiān)測(cè)。為了方便快速搭建檢測(cè)平臺(tái)、達(dá)到靈活操作的目的,可以采用帶微控制器的傳感器采集所需要的狀態(tài)信息,通過(guò)串口直接把這些信息傳送給個(gè)人電腦,然后在電腦上編程接收處理數(shù)據(jù)。
    目前,大多數(shù)微控制器芯片(如8051系列單片機(jī))都支持串口的輸入輸出[1-2],本文研究使用個(gè)人電腦外接USB轉(zhuǎn)串口線來(lái)接收信息,通過(guò)C#編程,運(yùn)用電腦做上位機(jī)來(lái)完成采集分析記錄工作。近年來(lái),C#編程已經(jīng)幫助企業(yè)解決了很多工業(yè)問(wèn)題,同時(shí)在串口通信領(lǐng)域也有很好的應(yīng)用前景。
1 Visual Studio數(shù)據(jù)串口通信
    串口是一種比較簡(jiǎn)單的通信形式。介紹通過(guò)Visual Studio 2010的C#進(jìn)行編程使得PC能接收串口發(fā)來(lái)的信息。
    C#是一種強(qiáng)勁的編程語(yǔ)言[3],且Visual Studio也封裝了串口收發(fā)的模塊,這易于實(shí)現(xiàn)串口數(shù)據(jù)采集和處理。這里運(yùn)用C#創(chuàng)建Windows窗體應(yīng)用程序,首先在窗體加載時(shí)觸發(fā)串口的讀取功能,遍歷電腦的每一個(gè)串口。在窗體應(yīng)用程序的combobox預(yù)設(shè)一系列與串口通信有關(guān)的參數(shù),根據(jù)所連接的單片機(jī)來(lái)預(yù)先選擇正確的參數(shù),通過(guò)Button的click屬性來(lái)讀取這些參數(shù)打開(kāi)新的串口連接。隨后串口數(shù)據(jù)送入電腦虛擬的緩存區(qū),完成數(shù)據(jù)讀取工作。
private void Form1_Load(object sender, EventArgs e)
//加載窗體
    {
      comport.ReceivedBytesThreshold=1;
//確定了觸發(fā)DataReceived事件的閾值,
      foreach(string com in System.IO.Ports.SerialPort.Get-
PortNames())
//遍歷并識(shí)別所有串口,之后添加至combobox供選擇
    }

        comport.BaudRate = int.Parse(cmbBaudRate.Text);
//int.Parse()函數(shù)將控件中的字符串轉(zhuǎn)化成了整型數(shù)
        comport.DataBits = int.Parse(cmbDataBits.Text);
// 設(shè)置各種串口參數(shù)
        comport.StopBits=(StopBits)Enum.Parse(typeof
(StopBits), cmbStopBits.Text);
        comport.Parity=(Parity)Enum.Parse(typeof(Parity),
cmbParity.Text);
        comport.PortName=cmbPortName.Text;
        comport.Open();//開(kāi)啟串口
        comport.DiscardInBuffer();
        comport.DiscardOutBuffer();
2 數(shù)據(jù)的圖表顯示
    在接收到串口數(shù)據(jù)之后,還要對(duì)串口讀入的字節(jié)串進(jìn)行分析判斷,這里需要運(yùn)用C#的控制流來(lái)分析字節(jié)串的內(nèi)容,分離出自己需要的字節(jié),再對(duì)應(yīng)各種傳感器的信號(hào)值與實(shí)際監(jiān)測(cè)值的關(guān)系單位化后得到實(shí)際的工業(yè)信息。為了能建立操作指導(dǎo)控制系統(tǒng)[4],方便監(jiān)測(cè)人員更加直觀地觀測(cè)工業(yè)設(shè)備的狀態(tài)變化,本文通過(guò)C#編程實(shí)現(xiàn)數(shù)據(jù)圖表的繪制。在Visual Studio中調(diào)用其中的graphic類來(lái)操作,通過(guò)實(shí)例化graphic類,采用畫(huà)直線的方式建立數(shù)據(jù)實(shí)時(shí)的折線圖和柱狀圖。
    (1)折線圖的畫(huà)法
    在picturebox控件中,以次數(shù)為橫坐標(biāo),單位化后的數(shù)據(jù)為縱坐標(biāo)不斷生成點(diǎn),依次畫(huà)直線連接前后生成的兩點(diǎn),待畫(huà)滿圖框后自動(dòng)清屏,實(shí)現(xiàn)數(shù)據(jù)的折線圖顯示。圖1為用該方法記錄某次加速度數(shù)據(jù)的效果。
    (2)柱狀圖的畫(huà)法
    在picturebox控件中,以采集數(shù)據(jù)的序號(hào)確立橫坐標(biāo),單位化后的數(shù)據(jù)為縱坐標(biāo),采取在該坐標(biāo)點(diǎn)至picturebox底部畫(huà)粗線,該點(diǎn)至picturebox頂部畫(huà)與picturebox背景色相同的粗線的方式來(lái)刷新柱狀圖數(shù)據(jù)。這種圖像化的顯示可以為工業(yè)現(xiàn)場(chǎng)進(jìn)行直觀、多維的指導(dǎo)操作。圖2為用該方法畫(huà)某次加速度數(shù)據(jù)的效果。


3 數(shù)據(jù)報(bào)警
    一般地,采集的數(shù)據(jù)值都有一個(gè)安全范圍,超出了安全范圍就會(huì)不利于設(shè)備的正常使用,所以要采取報(bào)警機(jī)制來(lái)提醒現(xiàn)場(chǎng)人員。這里通過(guò)Visual Studio自帶的控件——聲音控件,用if語(yǔ)句判斷,如果在數(shù)據(jù)值設(shè)定的閾值范圍外就觸發(fā)報(bào)警音樂(lè)。使用PC自帶的揚(yáng)聲器發(fā)出警報(bào)聲。
System.Media.SoundPlayer startSoundPlayer=new
System.Media.SoundPlayer(@"C:\Windows\Media\tada.wav");
//實(shí)例化音樂(lè)并選擇報(bào)警用音樂(lè)

    if(ring == 100 && number1 % 5 == 0)
//當(dāng)超出安全范圍時(shí)ring置為100,
為了降低分辨率,每5個(gè)數(shù)據(jù)判斷一次
        {
          startSoundPlayer.Play();//出聲
        }
4 數(shù)據(jù)采集記錄
    數(shù)據(jù)的采集和記錄是分析數(shù)據(jù)必不可少的過(guò)程。通過(guò)串口采集來(lái)的數(shù)據(jù),往往刷新率不會(huì)很高,最大的波特率為115 200。正因?yàn)檫@樣,使用Visual Studio開(kāi)發(fā)編程,在PC上就能實(shí)現(xiàn)串口數(shù)據(jù)的采集記錄。
    一般地,C#開(kāi)發(fā)人員會(huì)優(yōu)先想到使用文件流來(lái)導(dǎo)出數(shù)據(jù),但是為了數(shù)據(jù)查看簡(jiǎn)便,還有利于將來(lái)分析,本文采用連接office辦公自動(dòng)化軟件中的Excel[5],因?yàn)镋xcel表格直觀,且后續(xù)有分析計(jì)算的功能。在Visual Studio 2010.net框架下C#編程是完全可以來(lái)自動(dòng)化Excel 2007表格。
    首先要在項(xiàng)目中添加引用Microsoft Excel 12.0 object library,這樣就可以調(diào)出Excel類。
    在程序開(kāi)啟時(shí)就加載Excel應(yīng)用,創(chuàng)建配置Excel選項(xiàng):
    object missing = Type.Missing;
    Excel.Application oXL = null;//加載Excel應(yīng)用
    Excel.Workbooks oWBs = null;
    Excel.Workbook oWB = null;
    Excel.Worksheet oSheet = null;
    Excel.Range oCells = null;//確立單元格
    利用C#的try…catch語(yǔ)句預(yù)先在讀取數(shù)據(jù)的代碼段中設(shè)立好向Excel單元格內(nèi)填數(shù)據(jù)的語(yǔ)句。當(dāng)需要記錄時(shí)通過(guò)button控件觸發(fā)創(chuàng)建新的Excel文檔,這樣即執(zhí)行try{}中的語(yǔ)句往單元格記錄數(shù)據(jù):
    try { oCells[row / 3, index] = stringx; row += 1; }
//在指定的單元格中記錄xyz三組數(shù)據(jù),
并更改單元格坐標(biāo)
    catch { }
    更改單元格坐標(biāo)就不斷繼續(xù)向Excel里填充由串口接收的數(shù)據(jù)。
    通過(guò)簡(jiǎn)單設(shè)置名為excel和save的兩個(gè)button控件就可實(shí)現(xiàn)建立Excel表格填充數(shù)據(jù)和觸發(fā)保存Excel文檔的功能。圖3是某次加速度數(shù)據(jù)采集時(shí)生成的Excel文檔。

    利用開(kāi)發(fā)效率高的Visual Studio來(lái)編寫(xiě)上位機(jī)程序,在串口數(shù)據(jù)采集處理方面有著很好的優(yōu)勢(shì),它簡(jiǎn)化了開(kāi)發(fā)負(fù)擔(dān),簡(jiǎn)化了設(shè)備。便于一般工程系統(tǒng)的數(shù)據(jù)采集和處理。
參考文獻(xiàn)
[1] 童長(zhǎng)飛.C8051F系列單片機(jī)開(kāi)發(fā)與C語(yǔ)言編程[M].北京:北京航空航天大學(xué)出版社,2005.
[2] 張毅剛,彭喜元.單片機(jī)原理及接口技術(shù)[M].北京:人民郵電出版社,2008.
[3] STELLMAN A,GREENE J.Head First C#中文版[M].林琪,譯.北京:中國(guó)電力出版社,2010.
[4] 潘新民,王燕芳.微型計(jì)算機(jī)控制技術(shù)[M].北京:人民郵電出版社,1999.
[5] 微軟.C# app automates Excel[CP/OL].[2012-3-2].http://  code.msdn.microsoft.com/CSAutomateExcel-7f89a439.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。