王 剛(天津中德應(yīng)用技術(shù)大學(xué),300350)
?
基于.net的串口示波器開發(fā)
王 剛
(天津中德應(yīng)用技術(shù)大學(xué),300350)
摘要:本文用.net中的SerialPort和Chart控件實(shí)現(xiàn)了一個(gè)簡單的串口示波器,它能夠把嵌入式系統(tǒng)采集并通過串口發(fā)送來的數(shù)據(jù),以波形圖的形式繪制在窗口界面上并實(shí)時(shí)更新,實(shí)現(xiàn)了一個(gè)簡單的上位機(jī)監(jiān)控程序。
關(guān)鍵詞:串口通信;SerialPort;Chart;示波器
在工業(yè)控制,智能家居以及物聯(lián)網(wǎng)應(yīng)用等領(lǐng)域,使用PC機(jī)或移動設(shè)備對傳感器、單片機(jī)采集發(fā)送來的數(shù)據(jù)進(jìn)行接收、顯示、存儲甚至統(tǒng)計(jì)分析是一種常用的應(yīng)用形式。
受到成本,體積以及能耗的限制,負(fù)責(zé)采集發(fā)送數(shù)據(jù)的設(shè)備,一般不是傳統(tǒng)意義的電腦而是各種類型的嵌入式系統(tǒng)。使用網(wǎng)絡(luò)、WIFI、藍(lán)牙等形式進(jìn)行數(shù)據(jù)傳輸成本較高,所以大多數(shù)情況下,人們會選擇串口通信作為嵌入式系統(tǒng)和上位機(jī)通信的方式,串口是單片機(jī)普遍支持的通信方式,可以直接和PC機(jī)的串口或通過轉(zhuǎn)換器和USB口連接(不同設(shè)備的串口規(guī)格不一樣比如RS232,RS422等,需要的USB串口轉(zhuǎn)換器也不同),如果需要無線傳輸,還可以在收發(fā)雙方使用無線串口模塊,在不改變兩端程序的情況下實(shí)現(xiàn)無線傳輸。
本文以最簡單的單通道串口示波器為例,其運(yùn)行效果如下:
圖1 上位機(jī)執(zhí)行效果圖
本文使用Arduino作為嵌入式系統(tǒng)的核心,在Arduino中模擬了一個(gè)循環(huán)生成的正弦波形狀的數(shù)據(jù),Arduino以一定的時(shí)間間隔通過串口發(fā)出一個(gè)浮點(diǎn)數(shù),程序代碼如下圖2:
Arduino可以把數(shù)據(jù)以二進(jìn)制(使用Serial.write() 命令)或者字符串(使用Serial.print()命令)的形式發(fā)送到串口,如果采集來的數(shù)據(jù)可以用整型描述就采用二進(jìn)制形式發(fā)送,處理比較簡單,如果是浮點(diǎn)數(shù)比如溫度、電壓、氣體濃度等,可以以ASCII碼的方式發(fā)送到串口,默認(rèn)浮點(diǎn)數(shù)小數(shù)點(diǎn)后保留兩位,上位機(jī)確認(rèn)數(shù)據(jù)的長度并把字符型轉(zhuǎn)化為浮點(diǎn)型就可以使用了。
Windows系統(tǒng)中實(shí)現(xiàn)串口數(shù)據(jù)收發(fā)有三種實(shí)現(xiàn)方式:(1)MFC里利用MSCOMM控件(2)利用WINAPI函數(shù)(3).NET2.0以后可以使用SerialPort類。
目前第三種是最常用的方式,更為簡便,而且利用.net框架中的控件,可以實(shí)現(xiàn)更強(qiáng)大的功能。SerialPort類的屬性主要包括: 串口名,波特率,數(shù)據(jù)位,停止位和奇偶校驗(yàn) 。SerialPort類的事件中的DataReceived方法用于異步接收串口數(shù)據(jù)事件,下圖3是串口初始化和數(shù)據(jù)接收主要代碼。
從 SerialPort 對象接收數(shù)據(jù)時(shí),會在輔助線程上引發(fā)DataReceived 事件。由于此事件在輔助線程而非主線程上引發(fā),修改主線程中的元素會引發(fā)異常,要將輔助線程中所讀到的數(shù)據(jù)顯示到主線程的Form控件上時(shí),只有通過Invoke方法來實(shí)現(xiàn)。
.net中的Chart控件功能強(qiáng)大,使用靈活,一個(gè)Chart可以繪制多個(gè)繪圖區(qū)域(ChartArea),多個(gè)ChartArea可以疊加在一起,每個(gè)ChartArea又可以繪制多條Series。series是在ChartAarea上的數(shù)據(jù)描述形式,它可以是線、點(diǎn)、柱或者餅圖等。
chart的屬性很多,支持從數(shù)據(jù)庫到數(shù)組等多種數(shù)據(jù)來源,作為示波器,我們選擇線圖的方式。首先在設(shè)計(jì)視圖中打開“工具
圖3
圖4
箱”,在“數(shù)據(jù)”類別中選擇圖表控件(Chart)拖到設(shè)計(jì)區(qū)域。然后在窗口類中創(chuàng)建一個(gè)Series對象,并用如下語句在構(gòu)造函數(shù)中初始化series對象:
series.ChartType = SeriesChartType.Spline; // Spline是利用數(shù)據(jù)生成平滑曲線的屬性
series.Name = "電壓"; //圖例,若在一個(gè)界面上繪制多條曲線,可以對其進(jìn)行標(biāo)識
this.myChart.Series.Add(series);
最后定義array_show()方法用于把串口傳來的浮點(diǎn)數(shù)作為數(shù)據(jù)點(diǎn)繪制到ChartArea中去。
在上面的程序中(如圖4),每收到一個(gè)浮點(diǎn)數(shù),就添加到圖表中,當(dāng)達(dá)到180個(gè)的時(shí)候,則移除數(shù)據(jù)點(diǎn)在序列中索引為0的點(diǎn),也就是第一個(gè)點(diǎn),那么圖中將始終只保留最后收到的180個(gè)數(shù)據(jù)點(diǎn),最后兩條語句是在圖表中顯示數(shù)據(jù)點(diǎn)的編號。
本文只繪制了一條數(shù)據(jù)線,如果需要可以繪制多條曲線在一個(gè)或多個(gè)繪圖區(qū)域中以描述多種數(shù)據(jù),比如使用姿態(tài)傳感器的開發(fā)和測試,每個(gè)時(shí)刻傳感器可以送出9個(gè)甚至更多數(shù)據(jù),圖形化的串口示波器比大段文本數(shù)據(jù)顯示方式要直觀高效的多。而對于快速變化或者長時(shí)間接收的大量數(shù)據(jù),還可以把其存儲在Access之類的數(shù)據(jù)庫中,然后利用Chart類讀取指定區(qū)間的數(shù)據(jù),這樣就可以對歷史數(shù)據(jù)進(jìn)行顯示、分析了。
作者簡介
王剛 男 民族:漢 出生年月:1978.06 籍貫:天津 職稱:講師學(xué)歷:碩士研究生 研究方向:軟件工程與嵌入式開發(fā)。
Development of serial port oscilloscope based on.Net
Wang Gang
(Tianjin Sino-German University of Applied Sciences,300350)
Abstract:In this paper, with the. Net framework serialport and chart control realized a simple serial oscilloscope,it can the acquisition embedded system and through the serial port to send data,waveform drawing in the window interface and real-time updates,realize a simple PC monitoring program.
Keywords:serial communication;SerialPort;Chart;oscilloscope