《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > C#下串口通信編程的開發(fā)和擴(kuò)展
C#下串口通信編程的開發(fā)和擴(kuò)展
來源:微型機(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ù)采集,通過實(shí)例化graphic類在picturebox控件中實(shí)現(xiàn)數(shù)據(jù)的圖樣化表達(dá)。在數(shù)據(jù)的閾值報(bào)警和Excel數(shù)據(jù)保存方面進(jìn)行了研究,較好地解決了生產(chǎn)實(shí)踐中的關(guā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ù)采集,通過實(shí)例化graphic類在picturebox控件中實(shí)現(xiàn)數(shù)據(jù)的圖樣化表達(dá)。在數(shù)據(jù)的閾值報(bào)警和Excel數(shù)據(jù)保存方面進(jìn)行了研究,較好地解決了生產(chǎn)實(shí)踐中的關(guān)鍵問題。
關(guān)鍵詞: C#編程;串口;數(shù)據(jù)處理

    在工業(yè)現(xiàn)場進(jìn)行作業(yè)和實(shí)驗(yàn)時,需要對一些工業(yè)設(shè)備的狀態(tài)進(jìn)行監(jiān)測。為了方便快速搭建檢測平臺、達(dá)到靈活操作的目的,可以采用帶微控制器的傳感器采集所需要的狀態(tài)信息,通過串口直接把這些信息傳送給個人電腦,然后在電腦上編程接收處理數(shù)據(jù)。
    目前,大多數(shù)微控制器芯片(如8051系列單片機(jī))都支持串口的輸入輸出[1-2],本文研究使用個人電腦外接USB轉(zhuǎn)串口線來接收信息,通過C#編程,運(yùn)用電腦做上位機(jī)來完成采集分析記錄工作。近年來,C#編程已經(jīng)幫助企業(yè)解決了很多工業(yè)問題,同時在串口通信領(lǐng)域也有很好的應(yīng)用前景。
1 Visual Studio數(shù)據(jù)串口通信
    串口是一種比較簡單的通信形式。介紹通過Visual Studio 2010的C#進(jìn)行編程使得PC能接收串口發(fā)來的信息。
    C#是一種強(qiáng)勁的編程語言[3],且Visual Studio也封裝了串口收發(fā)的模塊,這易于實(shí)現(xiàn)串口數(shù)據(jù)采集和處理。這里運(yùn)用C#創(chuàng)建Windows窗體應(yīng)用程序,首先在窗體加載時觸發(fā)串口的讀取功能,遍歷電腦的每一個串口。在窗體應(yīng)用程序的combobox預(yù)設(shè)一系列與串口通信有關(guān)的參數(shù),根據(jù)所連接的單片機(jī)來預(yù)先選擇正確的參數(shù),通過Button的click屬性來讀取這些參數(shù)打開新的串口連接。隨后串口數(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())
//遍歷并識別所有串口,之后添加至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();//開啟串口
        comport.DiscardInBuffer();
        comport.DiscardOutBuffer();
2 數(shù)據(jù)的圖表顯示
    在接收到串口數(shù)據(jù)之后,還要對串口讀入的字節(jié)串進(jìn)行分析判斷,這里需要運(yùn)用C#的控制流來分析字節(jié)串的內(nèi)容,分離出自己需要的字節(jié),再對應(yīng)各種傳感器的信號值與實(shí)際監(jiān)測值的關(guān)系單位化后得到實(shí)際的工業(yè)信息。為了能建立操作指導(dǎo)控制系統(tǒng)[4],方便監(jiān)測人員更加直觀地觀測工業(yè)設(shè)備的狀態(tài)變化,本文通過C#編程實(shí)現(xiàn)數(shù)據(jù)圖表的繪制。在Visual Studio中調(diào)用其中的graphic類來操作,通過實(shí)例化graphic類,采用畫直線的方式建立數(shù)據(jù)實(shí)時的折線圖和柱狀圖。
    (1)折線圖的畫法
    在picturebox控件中,以次數(shù)為橫坐標(biāo),單位化后的數(shù)據(jù)為縱坐標(biāo)不斷生成點(diǎn),依次畫直線連接前后生成的兩點(diǎn),待畫滿圖框后自動清屏,實(shí)現(xiàn)數(shù)據(jù)的折線圖顯示。圖1為用該方法記錄某次加速度數(shù)據(jù)的效果。
    (2)柱狀圖的畫法
    在picturebox控件中,以采集數(shù)據(jù)的序號確立橫坐標(biāo),單位化后的數(shù)據(jù)為縱坐標(biāo),采取在該坐標(biāo)點(diǎn)至picturebox底部畫粗線,該點(diǎn)至picturebox頂部畫與picturebox背景色相同的粗線的方式來刷新柱狀圖數(shù)據(jù)。這種圖像化的顯示可以為工業(yè)現(xiàn)場進(jìn)行直觀、多維的指導(dǎo)操作。圖2為用該方法畫某次加速度數(shù)據(jù)的效果。


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

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

    利用開發(fā)效率高的Visual Studio來編寫上位機(jī)程序,在串口數(shù)據(jù)采集處理方面有著很好的優(yōu)勢,它簡化了開發(fā)負(fù)擔(dān),簡化了設(shè)備。便于一般工程系統(tǒng)的數(shù)據(jù)采集和處理。
參考文獻(xiàn)
[1] 童長飛.C8051F系列單片機(jī)開發(fā)與C語言編程[M].北京:北京航空航天大學(xué)出版社,2005.
[2] 張毅剛,彭喜元.單片機(jī)原理及接口技術(shù)[M].北京:人民郵電出版社,2008.
[3] STELLMAN A,GREENE J.Head First C#中文版[M].林琪,譯.北京:中國電力出版社,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)載。