基于RS232接口的數(shù)據(jù)采集分析系統(tǒng)研究 于碩_第1頁
基于RS232接口的數(shù)據(jù)采集分析系統(tǒng)研究 于碩_第2頁
基于RS232接口的數(shù)據(jù)采集分析系統(tǒng)研究 于碩_第3頁
基于RS232接口的數(shù)據(jù)采集分析系統(tǒng)研究 于碩_第4頁
基于RS232接口的數(shù)據(jù)采集分析系統(tǒng)研究 于碩_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、3班級(jí)050811學(xué)號(hào)08081068題目:基于RS232接口的數(shù)據(jù)采集分析系統(tǒng)研究學(xué)院:技術(shù)物理學(xué)院專業(yè):電子科學(xué)與技術(shù)學(xué)生姓名:于碩摘要RS232接口作為計(jì)算機(jī)通訊的一個(gè)標(biāo)準(zhǔn)接口在設(shè)備的通信傳輸,控制和狀態(tài)監(jiān)測等領(lǐng)域具有廣泛的應(yīng)用。本文首先介紹了在windows下對(duì)串口的控制,并使用API設(shè)計(jì)軟件控制串口實(shí)現(xiàn)收發(fā)數(shù)據(jù)、指令。最后,根據(jù)需求,利用Visual Studio 2010設(shè)計(jì)上位機(jī)軟件對(duì)基于RS232接口的激光功率計(jì)實(shí)現(xiàn)控制,數(shù)據(jù)采集以及實(shí)時(shí)分析。關(guān)鍵字:串口 RS232 上位機(jī)ABSTRACTRS232 interface as standard computer communi

2、cation interface is widely used in the device's data transmission, control and status monitoring.This paper first introduced how to control of the serial port under Windows, then use API to design software to control serial port sending, receiving data and instructions. Finally, according to the

3、 demand, we designed PC software by Visual Studio 2010 to control a laser power meter based on RS232 interface, realized data acquisition and real-time analysis.Keywords: SerialPort RS232 PC Software目錄目錄緒論10.1關(guān)于數(shù)據(jù)采集10.2數(shù)據(jù)采集分析系統(tǒng)概述2第一章 RS232接口51.1 關(guān)于串行傳輸51.2 RS232接口簡介61.3 串口通信原理71.4 RS-232串口通信基本方法8第二章

4、 Windows下串口通信的實(shí)現(xiàn)112.1 概述112.2 MSComm控件介紹112.3 Windows API 串口編程13第三章 3-激光功率計(jì)的操作方法153.1 指令、數(shù)據(jù)的基本格式要求153.2 功率計(jì)的基本命令及使用153.3 功率計(jì)常用命令一覽16第四章 數(shù)據(jù)采集上位機(jī)軟件的設(shè)計(jì)194.1 程序通信核心:TSigma類194.2 程序主要功能的設(shè)計(jì)24第五章 程序功能的測試31第六章 結(jié)束語35參考文獻(xiàn)37附錄 程序部分代碼39TSigma 類39程序的視類(View類)48程序的文檔類(Document類)60附錄 程序部分代碼63緒論0.1 關(guān)于數(shù)據(jù)采集自從人類開始對(duì)自然界

5、開始認(rèn)識(shí)以來,就有了測量、記錄。從古時(shí)的結(jié)繩計(jì)數(shù),到近代的各種指針式儀器,再到現(xiàn)在的各種數(shù)字式儀表、儀器,以及虛擬儀器,每一次測量技術(shù)的革新,都直接推動(dòng)了科技的進(jìn)步。科技的發(fā)展不僅僅受制于理論的發(fā)展,也受制于測量、記錄、工程加工的方式。例如伽利略式望遠(yuǎn)鏡的發(fā)明直接催動(dòng)了一系列天文界的重大發(fā)現(xiàn),扭秤的使用為萬有引力系數(shù)的測量奠定了基礎(chǔ)。直到現(xiàn)在,我們也不能說我們的測量技術(shù)達(dá)到了成熟,仍然有各種各樣的物理量要通過很復(fù)雜的方式才能測量。這些不可避免的催生了數(shù)據(jù)采集技術(shù)。數(shù)據(jù)采集(DAQ),是指從傳感器和其它待測設(shè)備等模擬和數(shù)字被測單元中自動(dòng)采非電量或者電量信號(hào),送到上位機(jī)中進(jìn)行分析,處理。數(shù)據(jù)采集系

6、統(tǒng)是結(jié)合基于計(jì)算機(jī)或者其他專用測試平臺(tái)的測量軟硬件產(chǎn)品來實(shí)現(xiàn)靈活的、用戶自定義的測量系統(tǒng)。數(shù)據(jù)采集的目的是為了測量電壓、電流、溫度、壓力或聲音等物理現(xiàn)象?;赑C的數(shù)據(jù)采集,通過模塊化硬件、應(yīng)用軟件和計(jì)算機(jī)的結(jié)合,進(jìn)行測量。盡管數(shù)據(jù)采集系統(tǒng)根據(jù)不同的應(yīng)用需求有不同的定義,但各個(gè)系統(tǒng)采集、分析和顯示信息的目的卻都相同。數(shù)據(jù)采集系統(tǒng)整合了信號(hào)、傳感器、激勵(lì)器、信號(hào)調(diào)理、數(shù)據(jù)采集設(shè)備和應(yīng)用軟件。在計(jì)算機(jī)廣泛應(yīng)用的今天,數(shù)據(jù)采集的重要性是十分顯著的。它是計(jì)算機(jī)與外部物理世界連接的橋梁。各數(shù)據(jù)采集種類型信號(hào)采集的難易程度差別很大。實(shí)際采集時(shí),噪聲也可能帶來一些麻煩。數(shù)據(jù)采集時(shí),有一些基本原理要注意,還有

7、更多的實(shí)際的問題要解決。0.2數(shù)據(jù)采集分析系統(tǒng)概述在科研工作和學(xué)習(xí)中,我們經(jīng)常用到一些儀器儀表。隨著科技的發(fā)展,以前的指針式儀器儀表逐漸被現(xiàn)代化的電子儀器代替,并且很多都帶有功能齊全的數(shù)據(jù)采集、顯示功能。在新的工具給我們帶來便利的同時(shí),我們也會(huì)產(chǎn)生這樣的疑問,以前我們采集了數(shù)據(jù)記錄在紙上,現(xiàn)在是否可以直接將儀器與電腦連接,將數(shù)據(jù)直接傳輸?shù)轿覀兊碾娔X中?答案是肯定的,我們通過智能儀器提供的數(shù)據(jù)接口與PC機(jī)連接,不但實(shí)現(xiàn)的數(shù)據(jù)采集,并且還可以對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)分析、并永久的保存下來。這樣一個(gè)系統(tǒng)就是我們所需要的數(shù)據(jù)采集分析系統(tǒng)。一般說來,數(shù)據(jù)采集系統(tǒng)由傳感器、信號(hào)調(diào)理電路、數(shù)據(jù)采集電路三部分組成,如圖

8、0-1所示。 圖 0-1 數(shù)據(jù)采集系統(tǒng)的基本組成數(shù)據(jù)采集分析系統(tǒng)的任務(wù)就是采集傳感器輸出的模擬信號(hào)并轉(zhuǎn)換成計(jì)算機(jī)能識(shí)別的數(shù)據(jù)信號(hào),然后送入計(jì)算機(jī)進(jìn)行相應(yīng)的計(jì)算和處理,得出所需的數(shù)據(jù)。并計(jì)算得到的數(shù)據(jù)經(jīng)行顯示或打印,以便實(shí)現(xiàn)對(duì)某些物理量的實(shí)時(shí)控制。在生產(chǎn)生活的各個(gè)領(lǐng)域,數(shù)據(jù)采集分析系統(tǒng)幾乎無處不在,凡是有自動(dòng)檢測及控制的地方都會(huì)有數(shù)據(jù)集采機(jī)系統(tǒng)的身影出現(xiàn);從簡單到復(fù)雜,從空中,地面到地下,凡是能想象到的地方都有使用數(shù)據(jù)采集分析系統(tǒng)的需求。因此,對(duì)本課題的研究有極其廣闊的發(fā)展前景和巨大的經(jīng)濟(jì)價(jià)值。數(shù)據(jù)采集分析系統(tǒng)的發(fā)展起始于20世紀(jì)50年代,1956年美國首先研究了用在軍事上的數(shù)字采集系統(tǒng)。20世

9、紀(jì)70年代中后期,隨著微型機(jī)的發(fā)展,誕生了采集器,儀表同計(jì)算機(jī)溶為一體的數(shù)據(jù)采集分析系統(tǒng)。由于這種數(shù)據(jù)采集分析系統(tǒng)的性能優(yōu)良,超過了傳統(tǒng)的自動(dòng)檢測儀表和專用數(shù)據(jù)采集分析系統(tǒng),因此獲得了驚人的發(fā)展。到了80年代隨著計(jì)算機(jī)的普及應(yīng)用,數(shù)據(jù)采集分析系統(tǒng)的到了極大的發(fā)展,開始出現(xiàn)了通用的數(shù)據(jù)采集與自動(dòng)測試系統(tǒng)。該階段的數(shù)據(jù)采集分析系統(tǒng)主要有兩類,一類以儀器儀表和采集器,通用接口總線和計(jì)算機(jī)等構(gòu)成。第二類以數(shù)據(jù)采集卡,標(biāo)準(zhǔn)總線和計(jì)算機(jī)構(gòu)成。及至90年代至今,在國際上技術(shù)先進(jìn)的國家,數(shù)據(jù)采集技術(shù)已經(jīng)在軍事,航空電子設(shè)備及宇航技術(shù),工業(yè)等領(lǐng)域被廣泛應(yīng)用。隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展和普及,數(shù)據(jù)采集分析系統(tǒng)在多個(gè)

10、領(lǐng)域有著廣泛的應(yīng)用。數(shù)據(jù)采集是工、農(nóng)業(yè)控制系統(tǒng)中至關(guān)重要的一環(huán),在醫(yī)藥、化工、食品、等領(lǐng)域的生產(chǎn)過程中,往往需要隨時(shí)檢測各生產(chǎn)環(huán)節(jié)的溫度、濕度、流量及壓力等參數(shù)。同時(shí),還要對(duì)某一檢測點(diǎn)任意參數(shù)能夠進(jìn)行隨機(jī)查尋,將其在某一時(shí)間段內(nèi)檢測得到的數(shù)據(jù)經(jīng)過轉(zhuǎn)換提取出來,以便進(jìn)行比較,做出決策,調(diào)整控制方案,提高產(chǎn)品的合格率,產(chǎn)生良好的經(jīng)濟(jì)效益。隨著工、農(nóng)業(yè)的發(fā)展,多路數(shù)據(jù)采集勢必將得到越來越多的應(yīng)用,為適應(yīng)這一趨勢,作這方面的研究就顯得十分重要。在科學(xué)研究中,運(yùn)用數(shù)據(jù)采集分析系統(tǒng)可獲得大量的動(dòng)態(tài)信息,也是獲取科學(xué)數(shù)據(jù)和生成知識(shí)的重要手段之一??傊?,不論在哪個(gè)應(yīng)用領(lǐng)域中,數(shù)據(jù)采集與處理將直接影響工作效率和

11、所取得的經(jīng)濟(jì)效益。此外,計(jì)算機(jī)的發(fā)展對(duì)通信起了巨大的推動(dòng)作用.計(jì)算機(jī)和通信緊密結(jié)合構(gòu)成了靈活多樣的通信控制系統(tǒng),也可以構(gòu)成強(qiáng)有力的信息處理系統(tǒng),這樣對(duì)社會(huì)的發(fā)展產(chǎn)生了深遠(yuǎn)的影響。數(shù)據(jù)通信是計(jì)算機(jī)廣泛應(yīng)用的必然產(chǎn)物。數(shù)據(jù)采集分析系統(tǒng),從嚴(yán)格的意義上來說,應(yīng)該是用計(jì)算機(jī)控制的多路數(shù)據(jù)自動(dòng)檢測或巡回檢測,并且能夠?qū)?shù)據(jù)實(shí)行存儲(chǔ)、處理、分析計(jì)算以及從檢測的數(shù)據(jù)中提取可用的信息,供顯示、記錄、打印或描繪的系統(tǒng)。數(shù)據(jù)采集分析系統(tǒng)一般由數(shù)據(jù)輸入通道,數(shù)據(jù)存儲(chǔ)與管理,數(shù)據(jù)處理,數(shù)據(jù)輸出及顯示這五個(gè)部分組成。輸入通道要實(shí)現(xiàn)對(duì)被測對(duì)象的檢測,采樣和信號(hào)轉(zhuǎn)換等工作。數(shù)據(jù)存儲(chǔ)與管理要用存儲(chǔ)器把采集到的數(shù)據(jù)存儲(chǔ)起來,建

12、立相應(yīng)的數(shù)據(jù)庫,并進(jìn)行管理和調(diào)用。數(shù)據(jù)處理就是從采集到的原始數(shù)據(jù)中,刪除有關(guān)干擾噪聲,無關(guān)信息和必要的信息,提取出反映被測對(duì)象特征的重要信息。另外,就是對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,以便于檢索;或者把數(shù)據(jù)恢復(fù)成原來物理量的形式,以可輸出的形態(tài)在輸出設(shè)備上輸出,例如打印,顯示,繪圖等。數(shù)據(jù)輸出及顯示就是把數(shù)據(jù)以適當(dāng)?shù)男问竭M(jìn)行輸出和顯示。由于RS-232在微機(jī)通信接口中廣泛采用,技術(shù)已相當(dāng)成熟。在近端與遠(yuǎn)端通信過程中,采用串行RS-232標(biāo)準(zhǔn),實(shí)現(xiàn)PC機(jī)與單片機(jī)間的數(shù)據(jù)傳輸。第一章 RS232接口1.1 關(guān)于串行傳輸計(jì)算機(jī)與外界進(jìn)行通信的方式有串行通信和并行通信兩種,并行通信是一條信息的各個(gè)數(shù)據(jù)位同時(shí)被傳輸

13、的通信方式,相對(duì)應(yīng)的,串行通信就是一條信息的各個(gè)數(shù)據(jù)位按順序進(jìn)行傳輸。通常認(rèn)為,并行通信的傳輸速率要優(yōu)于并行通信,但實(shí)際上,這一優(yōu)勢只能在傳輸距離近、傳輸頻率相同的時(shí)候體現(xiàn)出來,隨著傳輸頻率的提高,并行傳輸中信號(hào)線之間的干擾愈發(fā)明顯,而串行傳輸?shù)男盘?hào)線只有一根,不存在干擾的問題。現(xiàn)在,在我們的計(jì)算機(jī)中,即使硬盤與主板、CPU之間的數(shù)據(jù)傳輸都是使用SATA進(jìn)行傳輸?shù)模⊿ATASerial Advanced Technology Attachment,串行高級(jí)技術(shù)附件)。我們最常用的U盤,計(jì)算機(jī)各種外設(shè)使用的我們?cè)僖彩煜げ贿^的USB接口也是串行接口。但是僅僅是一個(gè)串行接口,也有著各種各樣不同的標(biāo)準(zhǔn)

14、,比如:RS-232C、RS-422/RS485(這是我們一提到串口就會(huì)立刻想到的),上文中提到的SATA、USB,還有IEEE1394等等。串行通信接口的基本任務(wù)是:1、 實(shí)現(xiàn)數(shù)據(jù)的格式化2、 進(jìn)行串并轉(zhuǎn)換3、 控制數(shù)據(jù)傳輸速率4、 進(jìn)行錯(cuò)誤檢測5、 進(jìn)行TTL與EIA電平轉(zhuǎn)換6、 提供接口標(biāo)準(zhǔn)所要求的信號(hào)線1.2 RS232接口簡介圖 1.1 DB9串口外觀RS-232串行接口屬于個(gè)人計(jì)算機(jī)(PC)及電信應(yīng)用領(lǐng)域中最為成功的串行數(shù)據(jù)標(biāo)準(zhǔn);而RS-422和RS-485串行接口則是工業(yè)應(yīng)用領(lǐng)域中最為成功的串行數(shù)據(jù)標(biāo)準(zhǔn),上述這些數(shù)據(jù)標(biāo)準(zhǔn)并不直接相互兼容,但在電信、自動(dòng)控制及儀器儀表應(yīng)用中,往往需

15、要在其之間進(jìn)行數(shù)據(jù)通信。RS-232也稱標(biāo)準(zhǔn)串口,是目前最常用的一種串行通訊接口。它是在1970年由美國電子工業(yè)協(xié)會(huì)(EIA)聯(lián)合貝爾系統(tǒng)、 調(diào)制解調(diào)器廠家及計(jì)算機(jī)終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn)。它的全名是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”。傳統(tǒng)的RS-232-C接口標(biāo)準(zhǔn)有22根線,采用標(biāo)準(zhǔn)25芯D型插頭座。自IBM PC/AT開始使用簡化了的9芯D型插座。至今25芯插頭座現(xiàn)代應(yīng)用中已經(jīng)很少采用。電腦一般有兩個(gè)串行口:COM1和COM2,你到計(jì)算機(jī)后面能看到9針D形接口就是了。 RS-422由RS-232發(fā)展而來,它是為彌補(bǔ)RS-23

16、2之不足而提出的。為改進(jìn)RS-232通信距離短、速率低的缺點(diǎn),RS-422定義了一種平衡通信接口,將傳輸速率提高到10Mb/s,傳輸距離延長到4000英尺(速率低于100kb/s時(shí)),并允許在一條平衡總線上連接最多10個(gè)接收器。RS-422是一種單機(jī)發(fā)送、多機(jī)接收的單向、平衡傳輸規(guī)范,被命名為TIA/EIA-422-A標(biāo)準(zhǔn)。為擴(kuò)展應(yīng)用范圍,EIA又于1983年在RS-422基礎(chǔ)上制定了RS-485標(biāo)準(zhǔn),增加了多點(diǎn)、雙向通信能力,即允許多個(gè)發(fā)送器連接到同一條總線上,同時(shí)增加了發(fā)送器的驅(qū)動(dòng)能力和沖突保護(hù)特性,擴(kuò)展了總線共模范圍,后命名為TIA/EIA-485-A標(biāo)準(zhǔn)。由于EIA提出的建議標(biāo)準(zhǔn)都是以

17、“RS”作為前綴,所以在通訊工業(yè)領(lǐng)域,仍然習(xí)慣將上述標(biāo)準(zhǔn)以RS作前綴稱謂。 RS-232、RS-422與RS-485標(biāo)準(zhǔn)只對(duì)接口的電氣特性做出規(guī)定,而不涉及接插件、電纜或協(xié)議,在此基礎(chǔ)上用戶可以建立自己的高層通信協(xié)議。因此在視頻界的應(yīng)用,許多廠家都建立了一套高層通信協(xié)議,或公開或廠家獨(dú)家使用。如錄像機(jī)廠家中的Sony與松下對(duì)錄像機(jī)的RS-422控制協(xié)議是有差異的,視頻服務(wù)器上的控制協(xié)議則更多了,如Louth、Odetis協(xié)議是公開的,而ProLINK則是基于Profile上的。 1.3 串口通信原理串口通信的概念非常簡單,串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,

18、但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。它很簡單并且能夠?qū)崿F(xiàn)遠(yuǎn)距離通信。比如IEEE488定義并行通行狀態(tài)時(shí),規(guī)定設(shè)備線總長不得超過20米,并且任意兩個(gè)設(shè)備間的長度不得超過2米;而對(duì)于串口而言,長度可達(dá)1200米。典型地,串口用于ASCII碼字符的傳輸。通信使用3根線完成:(1)地線,(2)發(fā)送,(3)接收。由于串口通信是異步的,端口能夠在一根線上發(fā)送數(shù)據(jù)同時(shí)在另一根線上接收數(shù)據(jù)。其他線用于握手,但是不是必須的。串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)。對(duì)于兩個(gè)進(jìn)行通行的端口,這些參數(shù)必須匹配:a,波特率:這是一個(gè)衡量通信速度的參數(shù)。它表示每秒鐘傳送的bit的個(gè)

19、數(shù)。例如300波特表示每秒鐘發(fā)送300個(gè)bit。當(dāng)我們提到時(shí)鐘周期時(shí),我們就是指波特率例如如果協(xié)議需要4800波特率,那么時(shí)鐘是4800Hz。這意味著串口通信在數(shù)據(jù)線上的采樣率為4800Hz。通常電話線的波特率為14400,28800和36600。波特率可以遠(yuǎn)遠(yuǎn)大于這些值,但是波特率和距離成反比。高波特率常常用于放置的很近的儀器間的通信,典型的例子就是GPIB設(shè)備的通信。b,數(shù)據(jù)位:這是衡量通信中實(shí)際數(shù)據(jù)位的參數(shù)。當(dāng)計(jì)算機(jī)發(fā)送一個(gè)信息包,實(shí)際的數(shù)據(jù)不會(huì)是8位的,標(biāo)準(zhǔn)的值是5、7和8位。如何設(shè)置取決于你想傳送的信息。比如,標(biāo)準(zhǔn)的ASCII碼是0127(7位)。擴(kuò)展的ASCII碼是0255(8位)

20、。如果數(shù)據(jù)使用簡單的文本(標(biāo)準(zhǔn) ASCII碼),那么每個(gè)數(shù)據(jù)包使用7位數(shù)據(jù)。每個(gè)包是指一個(gè)字節(jié),包括開始/停止位,數(shù)據(jù)位和奇偶校驗(yàn)位。由于實(shí)際數(shù)據(jù)位取決于通信協(xié)議的選取,術(shù)語“包”指任何通信的情況。c,停止位:用于表示單個(gè)包的最后一位。典型的值為1,1.5和2位。由于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。適用于停止位的位數(shù)越多,不同時(shí)鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時(shí)也越慢。d,奇偶校驗(yàn)位:在串口通信中一種簡單的檢錯(cuò)方式。有四種檢錯(cuò)方式:偶、奇、高和低。當(dāng)然沒有

21、校驗(yàn)位也是可以的。對(duì)于偶和奇校驗(yàn)的情況,串口會(huì)設(shè)置校驗(yàn)位(數(shù)據(jù)位后面的一位),用一個(gè)值確保傳輸?shù)臄?shù)據(jù)有偶個(gè)或者奇?zhèn)€邏輯高位。例如,如果數(shù)據(jù)是011,那么對(duì)于偶校驗(yàn),校驗(yàn)位為0,保證邏輯高的位數(shù)是偶數(shù)個(gè)。如果是奇校驗(yàn),校驗(yàn)位位1,這樣就有3個(gè)邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡單置位邏輯高或者邏輯低校驗(yàn)。這樣使得接收設(shè)備能夠知道一個(gè)位的狀態(tài),有機(jī)會(huì)判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。1.4 RS-232串口通信基本方法1.4.1 連接器圖1.2 DB25和DB9連接器外形及引腳定義RS232C標(biāo)準(zhǔn)規(guī)定設(shè)備間使用“D”型25針連接器的電纜通信,即DB25。實(shí)際上,RS-2

22、32的25條引腳中大部分是很少用的,在計(jì)算機(jī)與終端的通信中,一般只用39條引腳。例如,本例中,我們只用到了其中的三個(gè)引腳:TXD,RXD,GND。在使用中,我們最常用的是DB9連接器,圖片給出了DB25和DB9連接器的在串口通信中的引腳定義:1.4.2 數(shù)據(jù)傳送格式串行數(shù)據(jù)通信是把并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù)按順序依次發(fā)送。接受端再將接受到的串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)。串行數(shù)據(jù)可按兩種方式進(jìn)行,即同步方式和異步方式。同步方式適用于大批量數(shù)據(jù)通信,每次傳送一組數(shù)據(jù),在每組數(shù)據(jù)前加上一定的編制信號(hào),使得雙方保持同步。異步數(shù)據(jù)通信每次發(fā)送一個(gè)字符,在每個(gè)字符的二進(jìn)制位串前加上啟動(dòng)位作為接收端的同步信號(hào),這樣每

23、發(fā)送一個(gè)字符,雙方進(jìn)行一次同步。串行異步數(shù)據(jù)傳輸有著嚴(yán)格的數(shù)據(jù)格式和時(shí)序關(guān)系。在空閑狀態(tài),線路呈現(xiàn)出高電平或者“1”狀態(tài)。傳輸時(shí),首先發(fā)送起始位,接收端接收到起始位,即開始接收過程。在后邊的整個(gè)二進(jìn)制位串傳輸過程中,都是以起始位作為同步時(shí)序的基準(zhǔn)信號(hào)。起始位以“0”表示。緊跟其后的是數(shù)據(jù)位,根據(jù)采用的編碼,數(shù)據(jù)位可能為5位到8位之間。奇偶位可以有也可以沒有。處在最后的是停止位,停止位以“1”表示,位數(shù)可能是1位、1/2位或者2位。傳送格式中的起始位和停止位在數(shù)據(jù)傳輸過程中起著十分重要的作用。通信中有兩點(diǎn)影響著數(shù)據(jù)的正確接收。一是數(shù)據(jù)發(fā)送是隨機(jī)的,接收端必須隨時(shí)準(zhǔn)備接收數(shù)據(jù)。另一方面,接收端和發(fā)

24、送端不是使用同一個(gè)時(shí)鐘,在通信線路的兩端各自具有時(shí)鐘信號(hào)源,雖然可以設(shè)定雙方的時(shí)鐘頻率一樣,但脈沖邊沿也不可能一致。脈沖周期、脈沖寬度總有誤差。開始發(fā)送時(shí),接收端必須準(zhǔn)確地檢測到起始位的下降沿,使其內(nèi)部時(shí)鐘和發(fā)送端保持同步。在對(duì)每個(gè)二進(jìn)制位接收采樣時(shí),采樣點(diǎn)應(yīng)可能接近數(shù)據(jù)位中點(diǎn)。為了能及時(shí)發(fā)現(xiàn)起始位的下降邊沿,大多數(shù)接收器使用高于發(fā)送數(shù)據(jù)波特率十六倍的頻率時(shí)鐘信號(hào)進(jìn)行采樣。這樣,接收器能夠在一個(gè)二進(jìn)制位周期的1/16時(shí)間內(nèi)檢測到起始位的下降邊。對(duì)數(shù)據(jù)位周期中心采樣的偏差也不會(huì)超過位周期時(shí)間的1/16。第二章 Windows下串口通信的實(shí)現(xiàn)2.1 概述在很多情況下,遠(yuǎn)程監(jiān)控和工業(yè)自動(dòng)化領(lǐng)域系統(tǒng)經(jīng)

25、常采用串并口通信編程,其中串行接口被廣泛地應(yīng)用于工程實(shí)踐的長距離通信中。運(yùn)用Windows通信API可以在Windows環(huán)境下進(jìn)行串口編程,不用對(duì)硬件直接進(jìn)行操作,并通過VC、VB和Delphi等語言進(jìn)行調(diào)用,大大方便了對(duì)數(shù)據(jù)的處理。在Windows下,對(duì)串口進(jìn)行控制主要有兩種方式,一是使用MSComm串口控件,其二是使用系統(tǒng)提供的API函數(shù)對(duì)串口進(jìn)行控制。另外,可以直接使用現(xiàn)有的串口類,可以從codeguru、codeproject上面下載得到許多別人寫好的較為完善的串口類,如CSerialPort類,可以極大地簡化、加速程序設(shè)計(jì)。2.2 MSComm控件介紹Microsoft Commun

26、ication Control(簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,為應(yīng)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法。使用MSComm控件時(shí),我們無需花時(shí)間了解復(fù)雜的API函數(shù),但仍使用控件間接的調(diào)用了API,只是先通過Comm.drv解釋,再傳遞給驅(qū)動(dòng)程序執(zhí)行。MScomm控件提供了兩種處理通信問題的方法,一是事件驅(qū)動(dòng),二是查詢法。利用MSComm控件實(shí)現(xiàn)計(jì)算機(jī)通信的關(guān)鍵是理解并正確設(shè)置MSComm控件眾多屬性和方法。以下是MSComm控件的常用屬性和方法: 1. Commport:設(shè)置或返回串口號(hào)。 2. Settings:以

27、字符串的形式設(shè)置或返回串口通信參數(shù)。 3. Portopen:設(shè)置或返回串口狀態(tài)。 4. InputMode:設(shè)置或返回接收數(shù)據(jù)的類型。 5. Inputlen:設(shè)置或返回一次從接收緩沖區(qū)中讀取字節(jié)數(shù)。 6. InBufferSize:設(shè)置或返回接收緩沖區(qū)的大小,缺省值為1024字節(jié)。 7. InBufferCount:設(shè)置或返回接收緩沖區(qū)中等待計(jì)算機(jī)接收的字符數(shù)。 8. Input:從接收緩沖區(qū)中讀取數(shù)據(jù)并清空該緩沖區(qū),該屬性設(shè)計(jì)時(shí)無效,運(yùn)行時(shí)只讀。 9. OutBufferSize:設(shè)置或返回發(fā)送緩沖區(qū)的大小,缺省值為512字節(jié)。 10. OutBufferCount:設(shè)置或返回發(fā)送緩沖區(qū)

28、中等待計(jì)算機(jī)發(fā)送的字符數(shù)。 11. Output:向發(fā)送緩沖區(qū)發(fā)送數(shù)據(jù),該屬性設(shè)計(jì)時(shí)無效,運(yùn)行可寫。 12. Rthreshold:該屬性為一閥值。當(dāng)接收緩沖區(qū)中字符數(shù)達(dá)到該值時(shí),MSComm控件設(shè)置Commevent屬性為ComEvReceive,并產(chǎn)生OnComm事件。用戶可在OnComm事件處理程序中進(jìn)行相應(yīng)處理。若Rthreshold屬性設(shè)置為0,則不產(chǎn)生OnComm事件。例如用戶希望接收緩沖區(qū)中達(dá)到一個(gè)字符就接收一個(gè)字符,可將Rthreshold設(shè)置為1。這樣接收緩沖區(qū)中接收到一個(gè)字符,就產(chǎn)生一次OnComm事件。 13. Sthreshold:該屬性亦為一閥值。當(dāng)發(fā)送緩沖區(qū)中字符數(shù)

29、小于該值時(shí),MSComm控件設(shè)置Commevent屬性為ComEvSend,并產(chǎn)生OnComm事件。若Sthreshold屬性設(shè)置為0,則不產(chǎn)生OnComm事件。要特別注意的是僅當(dāng)發(fā)送緩沖區(qū)中字符數(shù)小于該值的瞬間才產(chǎn)生OnComm事件,其后就不再產(chǎn)生OnComm事件。例如Sthreshold設(shè)置為3,僅當(dāng)發(fā)送緩沖區(qū)中字符數(shù)從3降為2時(shí),MSComm控件設(shè)置Commevent屬性為ComEvSend,同時(shí)產(chǎn)生OnComm事件,如發(fā)送緩沖區(qū)中字符始終為2,則不會(huì)再產(chǎn)生OnComm事件。這就避免了發(fā)送緩沖區(qū)中數(shù)據(jù)未發(fā)送完就反復(fù)發(fā)生OnComm事件。 14. CommEvent:這是一個(gè)非常重要的屬性

30、。該屬性設(shè)計(jì)時(shí)無效,運(yùn)行時(shí)只讀。一旦串口發(fā)生通信事件或產(chǎn)生錯(cuò)誤,依據(jù)產(chǎn)生的事件和錯(cuò)誤,MSComm控件為CommEvent屬性賦不同的代碼,同時(shí)產(chǎn)生OnComm事件。用戶程序就可在OnComm事件處理程序中針對(duì)不同的代碼,進(jìn)行相應(yīng)的處理。2.3 Windows API 串口編程API是附帶在Windows內(nèi)部的一個(gè)極其重要的組成部分。Windows的32位API主要是一系列復(fù)雜的函數(shù)和消息集合,可以看做是Windows系統(tǒng)為其下運(yùn)行的各種開發(fā)系統(tǒng)提供的開放式通用功能增強(qiáng)接口。Windows環(huán)境下對(duì)串行端口進(jìn)行操作,是把它作為文件來處理的,其中涉及到大量API函數(shù),操作起來比較復(fù)雜,可以概括為以

31、下的幾個(gè)操作步驟:1. 打開串行通信設(shè)備2. 指定并初始化讀寫緩沖區(qū)(可?。?. 設(shè)置串口屬性,配置DCB結(jié)構(gòu)4. 設(shè)置超時(shí)值5. 進(jìn)行串行數(shù)據(jù)通信6. 關(guān)閉串行端口串行通信一般可以分為同步和異步兩種操作方式。所謂同步方式是指在串口的接收緩沖區(qū)中讀取規(guī)定數(shù)目的數(shù)據(jù),直到規(guī)定數(shù)目的數(shù)據(jù)全部被讀出或設(shè)定的超時(shí)時(shí)間已到才返回。如果規(guī)定的待讀取數(shù)據(jù)量大且設(shè)定的超時(shí)時(shí)間也較長,而接收緩沖區(qū)較小,則可能引起線程阻塞。而異步方式是利用Windows的多線程結(jié)構(gòu),讓串口的讀寫操作在后臺(tái)進(jìn)行,而應(yīng)用程序的其他部分在前臺(tái)執(zhí)行。如果按驅(qū)動(dòng)方式分,串口通信也可分為查詢和事件驅(qū)動(dòng)兩種方式。查詢方式是指程序定期周期性地檢

32、查串口的緩沖區(qū),發(fā)現(xiàn)有數(shù)據(jù)就讀取數(shù)據(jù)。查詢的周期越小,實(shí)時(shí)性越高,越不容易丟失數(shù)據(jù),但同樣也更占CPU資源。事件驅(qū)動(dòng)方式則是一種高效的串口讀寫方式,通過設(shè)置事件來通知系統(tǒng)工作,即當(dāng)所預(yù)期的事件發(fā)生時(shí),向系統(tǒng)發(fā)出消息,系統(tǒng)調(diào)用相應(yīng)的消息響應(yīng)函數(shù)進(jìn)行處理,實(shí)時(shí)性較高,也避免了數(shù)據(jù)丟失。第三章 3-激光功率計(jì)的操作方法3激光功率計(jì)是我們實(shí)現(xiàn)數(shù)據(jù)采集的主要工具,我們使用激光功率計(jì)對(duì)激光的功率進(jìn)行測量,并使用串口將其與計(jì)算機(jī)連接,從PC機(jī)上讀取數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行處理。3.1 指令、數(shù)據(jù)的基本格式要求通過閱讀激光功率計(jì)的用戶手冊(cè)可知,PC機(jī)與激光功率計(jì)終端的通信是通過串口發(fā)送字符串來實(shí)現(xiàn)的。每條命令或數(shù)據(jù)

33、都是一個(gè)字符串,并且以回車-換行(rn)結(jié)束?;剀?換行是唯一的終止符,PC機(jī)發(fā)送指令、數(shù)據(jù)必須以回車-換行結(jié)束,否則功率計(jì)將無休止地等待終止符,同樣,功率計(jì)發(fā)送給PC機(jī)的數(shù)據(jù)也可以用回車-換行來確定是否已發(fā)送完畢。3.2 功率計(jì)的基本命令及使用功率計(jì)的命令有兩種類型,一是設(shè)置,一是查詢。查詢命令一定會(huì)用?來結(jié)束(在終止符之前)。設(shè)置命令主要用于初始化功率計(jì),并設(shè)置各種參數(shù)。參數(shù)設(shè)置命令后面加一個(gè)?就會(huì)變成查詢命令,功率計(jì)會(huì)在收到查詢命令之后,將所查詢的參數(shù)發(fā)送回來。3.3 功率計(jì)常用命令一覽說明:1、命令有兩種:設(shè)置命令和查詢命令,表中有(?)的表示兩種命令都可用,有?的表示只有查詢命令,沒

34、有?的表示只有設(shè)置命令。2、表中的命令大寫部分是必須的,功率計(jì)不區(qū)分大小寫,表中小寫部分可以省略,但是要省略必須全部省略,比如第一條命令可以寫作SYST:COMM:SERial:BAUD也可以寫作SYSTem:COMMunicate:SERial:BAUD但是不可寫作SYSTem:COMMun:SERial:BAUD通信命令命令描述SYSTem:COMMunicate:SERial:BAUD(?)串口波特率的設(shè)置、查詢SYSTem:COMMunicate:SERial:PACE(?)設(shè)置查詢主機(jī)通信低級(jí)流控制的方法SYSTem:COMMunicate:SERial:PARity(?)設(shè)置、查詢

35、校驗(yàn)位SYSTem:COMMunicate:SERial:SBITs(?)設(shè)置、查詢停止位SYSTem:COMMunicate:SERial:SERVice(?)設(shè)置、查詢終端機(jī)是否發(fā)送響鈴?fù)ㄖ@示命令命令描述DISPlay:CLEar清空顯示的文字,并使能測試數(shù)據(jù)的實(shí)時(shí)顯示DISPlay:TEXT設(shè)置文字在顯示區(qū)顯示錯(cuò)誤命令命令描述SYSTem:ERRor:ALL?查詢隊(duì)列中的所有錯(cuò)誤SYSTem:ERRor:CLEar清除隊(duì)列中的所有錯(cuò)誤SYSTem:ERRor:COUNT?詢問隊(duì)列中現(xiàn)有錯(cuò)誤的數(shù)量SYSTem:ERRor:NEXT?查詢隊(duì)列中的下一條錯(cuò)誤儀器及探針信息命令命令描述SYST

36、em:INFO:INSTrument:CALDate?查詢儀器的校準(zhǔn)日期SYSTem:INFO:INSTrument:SERNumber?查詢儀器的序列號(hào)SYSTem:INFO:PROBe:CALDate?查詢探針的校準(zhǔn)日期SYSTem:INFO:PROBe:MODEL?查詢探針的型號(hào)SYSTem:INFO:PROBe:RESPonsivity?詢問探針是否有響應(yīng)SYSTem:INFO:PROBe:SERNumber?查詢探針的序列號(hào)SYSTem:INFO:PROBe:TYPE?查詢探針的類型SYSTem:INFO:PROBe:TYPE?查詢探針的溫度測量數(shù)據(jù)采集命令命令描述ABORt終止數(shù)據(jù)

37、采集過程INITiate使能數(shù)據(jù)采集過程FETCh:ALL?查詢所有的可用數(shù)據(jù)記錄FETCh:MISSing?查詢由于緩沖區(qū)溢出而丟失的數(shù)據(jù)的數(shù)量FETCh:NEXT?查詢下一條可用的數(shù)據(jù)記錄FETCh:NRECords?查詢可用的數(shù)據(jù)記錄的數(shù)量測量設(shè)置命令命令描述CONFigure:AREA:APERture(?)設(shè)置、查詢孔徑面積CONFigure:AREA:CORRection(?)設(shè)置、查詢面積校正的使能CONFigure:ATTEnuation:CORRection(?)設(shè)置、查詢衰減校正的使能CONFigure:ATTEnuation:FACTor(?)設(shè)置、查詢已連接探針的衰減系

38、數(shù)第四章 數(shù)據(jù)采集上位機(jī)軟件的設(shè)計(jì)4.1 程序通信核心:TSigma類為了方便程序的改造以及移植,我們將功率計(jì)終端的通信、設(shè)置、數(shù)據(jù)采集封裝成為一個(gè)類。使用時(shí),只需要簡單的實(shí)例化及設(shè)置即可完成所需要的功能。我們需要這個(gè)類具有以下功能:1. 存儲(chǔ)與功率計(jì)連接的串口的相關(guān)信息(串口號(hào)、波特率、校驗(yàn)位、終止位)。2. 具有一定的緩沖區(qū),將采集回來的數(shù)據(jù)存儲(chǔ)起來,等待處理,而不丟失數(shù)據(jù)。3. 因?yàn)閿?shù)據(jù)的讀取相對(duì)于PC來說是個(gè)漫長的過程,在這過程中,PC可以完成許多其他的任務(wù),因此我們的類必須是非阻塞的可以在后臺(tái)執(zhí)行數(shù)據(jù)的傳輸。4. 有基本的命令調(diào)用函數(shù),而不必翻閱手冊(cè)查詢命令。5. 可以根據(jù)需要選擇是

39、否給父窗口發(fā)送Windows消息,以便用戶使用消息響應(yīng)函數(shù)來處理。為了實(shí)現(xiàn)功能1,我們將串口操作的API調(diào)用直接封裝到了類中,為了實(shí)現(xiàn)功能3,我們?cè)O(shè)計(jì)了多線程的數(shù)據(jù)傳輸函數(shù)。TSigma的主要成員函數(shù)設(shè)置實(shí)例的父窗口,以便發(fā)送消息:bool SetOwner(HWND hWnd);設(shè)置串口的相關(guān)參數(shù):void SetPortName(const CString& port);/設(shè)置串口號(hào)void SetBaudRate(int baud);/設(shè)置波特率連接以及斷開連接、詢問是否連接:bool Connect();void Disconnect();bool isConnected();

40、發(fā)送、收取一條信息:bool SendSigmaMsg(const char* msg);/發(fā)送一條指令、信息bool GetSigmaMsg(char* msg);有關(guān)參數(shù)的設(shè)置以及查詢:void SetApertureAera(float area);bool GetApertureAera(float& ans);void SetAreaCorrection( BOOL setValue );bool GetAreaCorrection(BOOL& ans);立即執(zhí)行一次測量并讀取測量值,成功返回true,并將結(jié)果存儲(chǔ)在ans中,否則返回false:bool GetDat

41、aImmediate(double& ans);查詢相關(guān)的器件信息:bool GetDeviceSn( char* sigma_sn );bool GetProbeSn( char* probe_sn );bool GetProbeModel( char* probe_model );子線程函數(shù):CommProc這個(gè)函數(shù)主要負(fù)責(zé)通信,并將結(jié)果存儲(chǔ)在緩沖區(qū)當(dāng)中,當(dāng)收到終止符(回車-換行)的時(shí)候,選擇是否發(fā)送消息。函數(shù)結(jié)構(gòu)如圖:開始執(zhí)行是否設(shè)置了父窗口報(bào)錯(cuò)并退出是否仍在連接狀態(tài)中檢查串口緩沖區(qū)是否有數(shù)據(jù)讀取數(shù)據(jù),并根據(jù)是否是終止符選擇是否發(fā)送消息進(jìn)入事件等待,直到收到串口的Event斷開連

42、接并退出否否否是是是圖4.1 程序CommProc線程結(jié)構(gòu)圖CommProc是通信線程函數(shù),負(fù)責(zé)整個(gè)程序與終端機(jī)的通信,同時(shí)將接收到的數(shù)據(jù)以原來的格式存儲(chǔ)到緩沖區(qū)。下面詳細(xì)介紹CommProc。1、 調(diào)用時(shí)機(jī)當(dāng)用戶點(diǎn)擊連接按鈕之后,程序執(zhí)行TSigma:Connect()函數(shù),Connect函數(shù)將串口按照指定參數(shù)設(shè)置好之后,使用AfxBeginThread()將該線程打開并掛起,然后Connect函數(shù)檢查AfxBeginThread()函數(shù)返回的指針,確認(rèn)非空后(說明打開線程正常),開始執(zhí)行。2、 函數(shù)參數(shù)由于線程函數(shù)是傳遞給windows指針,由windows調(diào)用的,所以函數(shù)必須符合規(guī)定的格

43、式,函數(shù)的參數(shù)只能有一個(gè)32位的pParam,當(dāng)然這個(gè)參數(shù)是什么內(nèi)容,由用戶來定,但是必須是LPVOID類型(可以強(qiáng)制轉(zhuǎn)換為任何類型的指針)。很明顯,當(dāng)我們有大量參數(shù)需要傳遞的時(shí)候,指針作為參數(shù)最為合適。雖然CommProc是TSigma的成員函數(shù),但因?yàn)檫@個(gè)函數(shù)的特殊性,它必須是一個(gè)Static型,否則無法由系統(tǒng)調(diào)用。Static型函數(shù)是不能直接調(diào)用它的類成員(因?yàn)樗恢朗菓?yīng)該是哪一個(gè)類,或者說類沒有實(shí)例化,static函數(shù)是沒有this指針的),所以我們需要將實(shí)例化的類指針傳遞給函數(shù),其實(shí)就是普通成員函數(shù)的this指針。3、 返回值根據(jù)stdcall函數(shù)的規(guī)定,函數(shù)調(diào)用正常,返回0,否則

44、返回非0值,表示錯(cuò)誤代碼。4、 執(zhí)行過程進(jìn)入函數(shù)之后,首先檢查是否有父窗口(僅在調(diào)試時(shí)有該過程)。完成函數(shù)變量的初始化之后就進(jìn)入線程的循環(huán),循環(huán)條件為:仍在連接狀態(tài)中,即m_bConnected的值為true。循環(huán)過程很簡單,檢查串口緩沖區(qū),有數(shù)據(jù)則讀取,并放入自己的緩沖區(qū),然后檢查是否是終止符,考慮要不要發(fā)送消息。然后就用WaitForSigleEvent等待串口事件。Get*函數(shù)這些函數(shù)有bool GetApertureAera(float& ans);bool GetAreaCorrection(BOOL& ans);bool GetDataImmediate(doubl

45、e& ans);bool GetDeviceSn( char* sigma_sn );bool GetProbeSn( char* probe_sn );bool GetProbeModel( char* probe_model );這些函數(shù)都大同小異:關(guān)閉CommProc的消息發(fā)送功能(將m_fSendMessages設(shè)置為0,由函數(shù)自己來處理消息),然后給終端機(jī)發(fā)送請(qǐng)求數(shù)據(jù)的指令,并等待接收到終止符,等待用WaitForSigleEvent函數(shù)進(jìn)行,設(shè)置最長等待時(shí)間為500ms來防止阻塞進(jìn)程。例如bool TSigma:GetDeviceSn( char* sigma_sn )m_

46、fSendMessage=false;ResetEvent(m_hReceived);SendSigmaMsg("SYST:INFO:INST:SERN?");WaitForSingleObject(m_hReceived,m_nResponseTime);m_fSendMessage=true;if( GetSigmaMsg(sigma_sn) )return true;return false;函數(shù)的返回值都是布爾型,true表示執(zhí)行成功,false表示執(zhí)行失敗,而實(shí)際的數(shù)據(jù)存儲(chǔ)在傳遞給函數(shù)的指針指向的空間中。串口連接的關(guān)閉關(guān)閉串口連接是通過標(biāo)志位來實(shí)現(xiàn)的,這個(gè)地方萬萬

47、不可以使用KillThread函數(shù)來終止線程,要否定線程內(nèi)自己的循環(huán)條件來終止,并且要等待線程內(nèi)循環(huán)的結(jié)束,否則會(huì)引起內(nèi)存泄露:void TSigma:Disconnect()if(m_bConnected=false)return;m_bConnected=false;SetCommMask(m_hPort,0);WaitForSingleObject(m_pThread->m_hThread,INFINITE);m_pThread=NULL;CloseHandle(m_hPort);4.2 程序主要功能的設(shè)計(jì)概述程序要完成數(shù)據(jù)的采集和動(dòng)態(tài)顯示,并且能將采集的數(shù)據(jù)存儲(chǔ)起來。為了快速的實(shí)

48、現(xiàn)這些功能,我們使用MFC內(nèi)建的Document-View結(jié)構(gòu),并使用其內(nèi)建的Serialize機(jī)制實(shí)現(xiàn)存儲(chǔ)功能,這樣可以方便的讓我們的程序打開自己的文件,并且就如同數(shù)據(jù)采集時(shí)那樣顯示數(shù)據(jù)圖像。程序中,采集的數(shù)據(jù)使用數(shù)組的方式存儲(chǔ),這樣明確了各個(gè)數(shù)據(jù)的時(shí)間關(guān)系,并且能夠快速的遍歷、檢索出所需要的數(shù)據(jù),實(shí)現(xiàn)高級(jí)的計(jì)算要求,為以后程序功能的擴(kuò)展提供了方便。因?yàn)槲覀儗?duì)數(shù)據(jù)采集的速率要求并不高,一般在10Hz左右,所以沒有使用復(fù)雜的方法進(jìn)行定時(shí),自動(dòng)采集,而是簡單的設(shè)置一個(gè)以采樣周期為基準(zhǔn)的定時(shí)器,定時(shí)執(zhí)行GetDataImmediate成員函數(shù),并在每次采集回?cái)?shù)據(jù)之后刷新顯示。最終我們的程序界面設(shè)計(jì)

49、如下圖圖4.2 程序界面我們使用了Visual Studio 2010提供的最新的Ribbon界面,使用時(shí),先在左側(cè)的Connect選項(xiàng)卡設(shè)置好端口號(hào)和波特率,然后進(jìn)行連接,連接成功后,程序會(huì)在下方的狀態(tài)區(qū)顯示連接成功,并顯示出功率計(jì)的序列號(hào)。連接完成后,就可以設(shè)置采樣周期,按下START按鈕開始采集。一旦開始采集后,采樣周期設(shè)置框自動(dòng)鎖死,不能再更改。采集完成后,按下STOP按鈕終止采集。采集過程中,在右上方的CurrentValue框中可以看到當(dāng)前功率,選中Hold復(fù)選框后,當(dāng)前功率數(shù)值將鎖定,取消Hold之后恢復(fù)顯示當(dāng)前功率。采集完成后,可以使用程序的存儲(chǔ)功能將數(shù)據(jù)存儲(chǔ)起來。在程序執(zhí)行的

50、任意時(shí)刻,可以使用自帶的截圖功能,將數(shù)據(jù)圖像復(fù)制到剪貼板。數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的設(shè)計(jì)因?yàn)榇鎯?chǔ)的內(nèi)容很簡單,單純的浮點(diǎn)數(shù),所以使用線性數(shù)組來存儲(chǔ),MFC提供CArray最合適不過,而且還支持Serialize功能,省去了文件存儲(chǔ)的許多麻煩。除了從終端讀取的數(shù)據(jù)需要存儲(chǔ)之外,我們還需要將讀取的周期存儲(chǔ)起來。數(shù)據(jù)和周期是必須的,另外為了加速程序的執(zhí)行,我們將最大值一并存儲(chǔ)了起來,因?yàn)樽畲笾凳且粋€(gè)頻繁使用的值,尤其是在繪圖的過程中。下面是3SigmaDoc的成員變量:public:CArray<double,double> m_dataArray;double max_ans;int m_pero

51、id;存儲(chǔ)、讀取函數(shù)void CMy3SigmaDoc:Serialize(CArchive& ar)if (ar.IsStoring()ar<<max_ans;ar<<m_peroid;m_dataArray.Serialize(ar);elsear>>max_ans;ar>>m_peroid;m_dataArray.Serialize(ar);數(shù)據(jù)的繪圖顯示在繪制的過程中,我們將當(dāng)前屏幕的位置計(jì)算出來,只繪制當(dāng)前屏幕顯示的內(nèi)容,而不是繪制所有畫幅來提高繪圖效率。繪圖的過程可以分為四步:1、 根據(jù)數(shù)據(jù)量,單位間隔計(jì)算畫幅大小,并設(shè)置畫幅

52、大小。GetClientRect(&ClientRect);sizeTotal.cx=ClientRect.Width();sizeTotal.cy=ClientRect.Height();int t_max=(ClientRect.Width()-START_X)/(axis_x_interval);if(nSize*period>t_max*1000)t_max=nSize*period/1000+1;sizeTotal.cx=(period*nSize*axis_x_interval/1000)+START_X+START_X;sizeTotal.cy=ClientRect

53、.Height();SetScrollSizes(MM_TEXT,sizeTotal);elseSetScrollSizes(MM_TEXT,sizeTotal);2、 繪制橫向表格,并添加橫坐標(biāo)(以秒為單位)t_max=GetScrollPos(SB_HORZ)/axis_x_interval+(ClientRect.Width()-START_X)/(axis_x_interval)+1;for(int t=GetScrollPos(SB_HORZ)/axis_x_interval;t<=t_max;t+)int i=t*axis_x_interval+START_X;pDC->

54、;MoveTo(i,0);pDC->LineTo(i,ClientRect.Height();sprintf_s(text,100,"%ds",t);textRect.SetRect(i,ClientRect.Height()-START_Y+5,i+50,ClientRect.Height();pDC->DrawText(text,&textRect,DT_LEFT);pDC->SelectObject(pOldPen);pen.DeleteObject();3、 根據(jù)最大值繪制縱向表格,并添加縱坐標(biāo)pen.CreatePen(PS_SOLID,

55、1,RGB(200,200,200);pOldPen=pDC->SelectObject(&pen);for(int i=0;i<=axis_y_num;i+)pDC->MoveTo(START_X,ClientRect.Height()-START_Y-axis_y_grid*i);pDC->LineTo(sizeTotal.cx,ClientRect.Height()-START_Y-axis_y_grid*i);textRect.SetRect(0,ClientRect.Height()-START_Y-axis_y_grid*i,START_X,Clie

56、ntRect.Height()-START_Y-axis_y_grid*i+50);sprintf_s(text,sizeof(text),"%1.0E",i*axis_y_interval);pDC->DrawText(text,&textRect,DT_RIGHT);pDC->SelectObject(pOldPen);pen.DeleteObject();4、 繪制曲線pen.CreatePen(PS_SOLID,2,RGB(0,255,255);pOldPen = pDC->SelectObject(&pen);pDC->MoveTo(START_X,ClientRect.Height()-START_Y);int imin=1000*GetScrollPos(SB_HORZ)/(period*axis_x_interval);int imax=min(imin+1000*ClientRect.Width()/(period*axis_x_interval)+1,pDoc->m_dataArray.GetSize();for(int i=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論