目錄
摘要1
關鍵詞1
1前言2
1.1 Matlab實時串口數據采集研究現狀及發展趨勢2
1.2研究的目的和意義4
1.3論文的組織結構5
2 Matlab下實時串口數據采集概要5
2.1 Matlab的Serial類5
2.2 數據采集6
2.3曲線顯示7
3實時串口數據采集與曲線顯示的實現8
3.1實時串口通信的實現8
3.2數據采集的實現9
3.3曲線顯示GUI的實現10
4基于MATLAB的實時串口數據采集與曲線顯示的具體做法12
4.1數據采集的一般流程12
4.1.1創建接口對象并設置屬性12
4.1.2打開串口設備對象12
4.1.3讀寫串口操作13
4.1.4關閉并清除設備對象13
4.2基于Matlab中斷方式的實時串行通信編程13
4.3繪制采集數據的曲線波形和數據顯示14
4.3.1繪制曲線波形14
4.3.2數據顯示15
4.3.3采集圖像15
4.4擴展功能——發送數據17
5結論17
參考文獻 18
致謝19
附錄19
附錄120
摘 要:數據采集是獲取信息的基本手段,數據采集技術作為信息科學的一個重要分支,它研究信息數據的采集、存儲、處理及控制等作業,具有很強的實用性,與傳感器、信號測量與處理、微型計算機等技術為基礎而形成的一門綜合應用技術。本設計是在Matlab R2008a版本中以串口通信實時接收目標系統數據,將采集的數據進行時間同步和字對齊處理,并在MATLAB的數據采集工具箱支持下,利用圖形界面GUI的設計,直觀的實時顯示數據曲線。設計得重點在于在Matlab上實現串口數據同步采集與處理,接收數據的時間同步和字對齊,同時擴展了發送數據的功能。
隨著科學技術的發展,數據采集系統得到了越來越廣泛得應用,同時人們對數據采集系統的各項技術指標,如:采樣率、線性度、精度、輸入范圍、控制方法以及抗干擾能力等提出了越來越高的要求,特別是精度和采樣率更是使用者和設計者所共同關注的重要問題,于是,高速及超高速數據采集系統應運而生并且得到了快速發展。今天,數據采集技術己經在雷達、水聲、振動工程、無損監測、智能儀器、自動控制以及生物工程等眾多領域得到廣泛的應用并且收到了良好的效果。高速數據采集系統在國防、航天、邊緣科學研究中及國民經濟的各個領域的成功的應用,進一步引起了各方的關注,推動了它的研制和發展。隨著科學技術的發展,數據采集系統得到了越來越廣泛的應用。目前,國外很多公司與廠商都投入巨資進行數據采集系統的研制開發與生產銷售,其中比較著名的有 NEFF, NI、HP,TEK 等。
從數據采集系統產品來看,各大公司提供的系列產品都包括了完成數據采集的諸如信號放大、濾波、多路開關、模數轉換和接口等各種模塊。現有的高速數據采集器件和開發的產品中,目前還沒有完全實現高速、高分辨率。在雷達、通信、譜分析、瞬態分析、等應用領域,為滿足實時檢測和高速采集的日益更新的需要,實現數據采集的高速、高分辨率已成為數據采集系統的一個發展方向。現有的高速 ADC 器件和產品價格都比較昂貴,有些高速、高分辨率的器件本身還存在著不穩定性,因此,在數據采集系統向高速、高分辨率發展的同時,開發和研制的器件和產品應不斷地提高可靠性,降低,提高性價比,以便使之得到更廣泛的應用。
數據采集與分析一直是生產實踐研究與應用領域的一個熱點和難點。隨著微制造工藝水平的飛速提高及數據分析理論的進一步完善與成熟,目前國內外對數據采集系統的高性能方面的研究上取得了很大的成就。就 A/D 轉換的精度、速度和通道數來說,采樣通道從單通道發展到雙通道、多通道,采樣頻率、分辨率、精度逐步提高,為分析功能的加強提供了前提條件。而在數據分析的微處理器上,最初的數據采集系統以 8 位單片機為核心,隨著微電子技術的不斷發展,新興單片機的不斷問世,十六位、三十二位單片機也為數據采集系統研制廠家所采用,近年來采用具有 DSP 功能的數據采集系統也己投入市場。同時,通用 PC 機的 CPU 用于數據處理也較為常見。總之,伴隨著高性能微處理器的采用和用戶技術要求的不斷提高,數據采集系統的功能也越來越完善。
數據采集系統的發展主要體現在以下幾個趨勢:
首先,在專業測控方面,基于 PC 計算機的數據采集系統越來越成熟和智能化。在過去的二十年中,開放式架構 PC 機的處理能力平均每十八個月就增強一倍。為了充分利用處理器速度的發展,現代開放式測量平臺結合了高速總線接口,如 PCI和 PXI/Compact PCI,以便獲得性能的進一步提升。計算機的性能提升和由此引起的基于計算機的測量技術的創新,正在持續不斷地模糊傳統儀器和基于計算機的測量儀器之間的界線。
其次,在通用測控方面,采用嵌入式微處理器的方案也由早期的采用 A/D 器件和標準單片機組成應用系統發展到在單芯片上實現完整的數據采集與分析,即目前極為熱門的 SOC (System On Chip)。通常在一塊芯片上會集成一個,可以采樣多路模擬信號的 A/D 轉換子系統和一個硬CPU 核(比如增強型 80_52 內核),而且其CPU 的運算處理速度和性能也較早期的標準 CPU 內核提高了數倍,而且有著極低的功耗。這種單芯片解決方案降低了系統的成本和設計的復雜性。
此外,為了解決 SOC 方案中數據處理性能的不足,采用 DSP 作為數據采集系統的 CPU 的研究與應用目前也逐漸引起業內重視。但是這類產品目前僅僅處于發展的初級階段,在精度、速度或其它性能指標上并不能很好的滿足要求。因此,國內外以 DSP 作為數據采集系統的采樣控制和分析運算的研究與應用正在展開。
近年來隨著芯片技術、計算機技術和網絡技術的發展,數據采集技術取得了許多新的技術成果,市場上推出了繁多的新產品。高速數據采集技術的發展一方面是提高采集速率,另一方面不斷向兩端延伸。一端是輸入的信號調理,另一端是采集后的數字化信號的實時處理與事后處理。20世紀90年代末,隨著數字技術快速發展,數據采集技術已向著并行、高速、大量存儲、實時分析處理、集成化等方向發展。
Matlab是Mathworks公司推出的一套高性能數值計算和可視化軟件,是目前控制系統數據處理較為實用有效的工具。它不僅能解決測試與控制系統中存在的大量的數值計算和矩陣運算,而且將圖像與圖形、顯示及處理、圖形界面設計集于一身。同時,它還提供了強有力的工具箱支持,極大地方便了研究人員的學習與開發。軟件開發采用Matlab語言編程,利用Matlab中控制工具箱及仿真工具混合開發的方法,使其編寫的程序更精練,軟件功能更強大,開發周期更短,軟件形式靈活、易于擴展,用戶使用起來更容易、更方便。因此,許多工程技術人員把Matlab軟件作為數據離線處理的工具。
業內領先的工具箱極大的擴展了Matlab的應用領域,所以Matlab自推出以來就受到廣泛的關注,數據采集工具箱就是其中之一。它是為簡化和加快數據采集工作而設計的,使用該工具箱更容易將實驗測量得到的數據進行分析和可視化操作。利用該數據采集工具箱可以方便地建立數據采集系統。通過建立一個串口接口對象,可以使用 Matlab命令直接和外部設備進行通信。
1.2 研究的目的和意義
在近幾十年來 IC 技術和技術的高速發展,為數據采集與分析提供了非常良好與可靠的科學技術基礎,也提出了更高的要求和強有力的推動。隨著現代工業技術的迅猛發展,生產規模的不斷壯大,生產過程和制作工藝的日趨復雜,對自動測試和各種信息集成的要求也就越來越高。在當今社會各個領域,包括科研和實驗研究,數據采集系統有著不可代替的作用,數據采集和處理進行得越及時,工作效率就越高,取得的經濟效益就越大。數據采集系統性能的好壞主要取決于它的精度和速度,在保證精度的條件下,還要盡可能地提高采樣速度,以滿足實時采集、實時處理和實時控制的要求。
數據采集系統的好壞將直接影響自動測試系統的可靠性和穩定性,為了滿足不同的測試需求,以及減少對資源的浪費,在系統的設計上應該盡量滿足通用性和可擴展性。在高度發展的當今中,科學技術的突飛猛進和生產過程的高度自動化已成為人所共知的必然趨勢,而它們的共同要求是必須建立在有著不斷發展與提高的信息工業基礎上。人們只有從外界獲取大量準確、可靠的信息經過一系列的科學分析、處理、加工與判斷,進而認識和掌握自然界與科學技術中的各種現象與其相關的變化規律,并通過相應的系統和方法實現科學實驗研究與生產過程的高度自動化。換言之,生產過程的自動化面臨的第一個問題就是必須根據從各種傳感器得到的數據來檢測、監視現場,以保證現場設備的正常工作。所以對現場進行數據采集是重要的前期基礎工作,然后再對現場數據進行傳輸和相應的處理工作,以滿足不同的需要。
如果要對大量的實驗數據利用Matlab的數據分析處理功能進行處理,則首先要將實驗數據轉換成Matlab的數據格式,這無疑是一件十分繁雜的任務。若能直接從Matlab環境下采集實驗數據,無疑對與實驗分析和數據處理都是有益的。Matlab(Version 7.0)的數據采集箱DAQ (Data Acquisition Toolbox) 為此提供一個實現直接數據采集的平臺。利用該工具箱配以適當的數據采集卡不僅可以進行實時數據采集,而且還可以進行實時顯示和控制,由此還可以組建成為自動測試分析系統。利用該數據采集工具箱可以方便地建立數據采集系統。
基于MATLAB實時串口數據采集,將采集的數據進行時間同步和字對齊處理,并在Matlab的工具箱支持下實時顯示數據曲線,具有重要的意義。
1.3 論文的組織結構
摘要。闡述了此次設計的總思路,利用MATLAB接收目標系統串口通信實時數據,將采集的數據進行時間同步和字對齊處理,并在MATLAB的工具箱支持下實時顯示數據曲線。
1.前言。介紹了MATLAB實時串口數據采集的研究現狀及發展趨勢、研究的目的和意義,說明了此設計的實用價值。
2.MATLAB實時串口數據采集概要。對此設計中的理論知識進行概述,是設計過程中所需要的理論和條件支撐,以便設計的順利進行。
3.實時串口數據的采集與曲線顯示的實現。大致描述了該設計的設計與實現方法,是設計過程中所需要的實踐環節。
4. 基于MATLAB的實時串口數據采集與曲線顯示的具體做法。詳細的給出了完成此次設計的思路和具體做法。
有了正確的過程,便會得出結論,結論部分即是對此次設計結果的一個說明。本文總的來說是按照從抽象的概念描述到具體實現方法步驟的寫作思路來完成的。
2.1 Matlab的 serial類
串行接口(Serial Interface)簡稱串口,也稱串行通信接口(通常指COM接口),是采用串行通信方式的擴展接口。串口的出現是在1980年前后,數據傳輸率是115kbps~230kbps。串口出現的初期是為了實現連接計算機外設的目的,初期串口一般用來連接鼠標和外置Modem及老式攝像頭和寫字板等設備。串口也可以應用于由于兩臺計算機(或設備)之間的互聯及數據傳輸。
串行接口是指數據一位一位地順序傳送,其特點是通信線路簡單,只要一對傳輸線就可以實現雙向通信,并可以利用電話線,從而大大降低了成本,特別適用于遠距離通信,但傳送速度較慢。由于串口(COM)不支持熱插拔及傳輸速率較低目前部分新主板和大部分便攜電腦已開始取消該接口,目前串口多用于工控和測量設備以及部分通信設備中。
自Matlab6.0版本起,Mathworks 公司在軟件中增加了Instrument Control Toolbox,提供了對串口通信的正式支持。利用該工具箱的serial 及其相關函數,能可靠地進行串行通信。
儀器控制工具箱serial類的主要特點如下:
(1)支持基于GPIB 總線(IEEE-488、HPIB 標準)、VISA 總線、串行接口(RS-232、RS-422、RS-485)的通信標準;
(2)支持二進制和文本(ASCII)兩種數據的通信,文本方式支持(standard commands for programmable instruments)語言;
(3)支持異步通信和同步通信;
(4)支持基于事件驅動的通信。
2.2 數據采集
數據(Data)也稱觀測值,是實驗、測量、觀察、等的結果,常以數量的形式給出。數據采集(Data Acquisition),又稱數據獲取,就是將被測對象(外部世界、現場)的各種參量(可以是量,也可以是化學量、生物量等)通過各種傳感元件作適當轉換后,再經信號調理、采樣、量化、編碼、傳輸等步驟,最后把系統需要的所有對象的原始數據收集、歸類、整理、錄入到系統當中去,是管理系統使用前的一個數據初始化過程。數據采集技術廣泛應用在信號檢測、信號處理、儀器儀表等領域,比如攝像頭,麥克風,都是數據采集工具,隨著數字化技術的不斷發展,數據采集技術也呈現出速度更高、通道更多、數據量更大的發展態勢。
被采集數據是已被轉換為電訊號的各種物理量,如溫度、水位、風速、壓力等,可以是模擬量,也可以是數字量。采集一般是采樣方式,即隔一定的時間(稱采樣周期)對同一點數據重復采集。采集的數據大多是瞬時值,也可是某段時間內的一個特征值。準確的數據測量是數據采集的基礎。數據測量方法有接觸式和非接觸式,檢測元件多種多樣。不論哪種方法和元件,都以不影響被測對象狀態和測量為前提,以保證數據的正確性。數據采集含義很廣,包括對連續物理量的采集。在計算機輔助制圖、測圖、設計中,對圖形或圖像數字化過程也可稱為數據采集,此時被采集的是幾何量數據。
數據采集系統是一種應用極為廣泛的模擬量測量設備,其基本任務是把信號送入計算機或相應的信號處理系統,根據不同的需要進行相應的計算和處理。它將模擬量采集、轉換成數字量后,再經過計算機處理得出所需的數據。同時,還可以用計算機將得到的數據進行儲存、顯示和打印,以實現對某些物理量的監視,其中一部分數據還將被用作生產過程中的反饋控制量。
在數據采集中,一般將待測對象的信號通過傳感器和A/D轉換器或其它專業測試儀器(如TDS3000系列數字式示波器),把數據傳到計算機。編制計算機與測試儀器的接口程序可使用C++ Builder、VB等編程語言。數據采集到計算機后要進行各種處理。如FFT、各種方法的濾波、系統辨識、小波變換等,由于Matlab提供功能強大的各種計算,使用幾個簡單語句就能實現,因此采用Matlab編程語言非常適合。
Matlab自帶的數據采集工具箱DAQ能更容易地將實驗測得的數據進行分析和可視化操作,包括了三個模塊,其中M-File 函數是Matlab中可直接調用的數據采集命令函數,通過M-file 函數傳輸數據、參數和命令給數據采集引擎,并可從數據采集引擎中查看數據采集設備對象的狀態、參數和抽取數據,所有的實時數據采集任務都通過這些函數的調用來實現。
數據采集引擎 (Data Acquisition Engine) 是Matlab環境下進行實時數據采集的核心。它執行M-flie函數所規定的功能,并監視和控制數據采集設備對象的狀態,以及存儲和管理所采集的數據。一旦實時數據采集任務啟動,它就類似于DOS環境下后臺運行的監控程序,所有的數據采集任務就置于它的監控和管理之中。
硬件轉接驅動程序 (Hardware Driver Adaptors) 建立采集卡驅動軟件(driver)與數據采集引擎之間的數據、命令和參數的傳輸通道,對于不同的板卡,需要不同的驅動程序,可以是動態鏈接庫文件(*.DLL),也可以是Matlab下的共享庫文件(*.MEX)。
它提供了以下主要的功能:
1. 以相同的指令操作模擬輸入(AI)、模擬輸出(AO)、數字輸入輸出(DIO)和同步模擬輸入輸出轉換各式功能,不會因不同硬件而產生不同的指令。
2. 一個及時數據采集環境, 被測量的數據不需經由轉換可直接進入MATLAB 直接進行分析。
3. 支持PC聲卡和主要的數據采集卡的廠商, 如:凌華, Agilent, ComputerBoards 和 National Instruments。
4. 支持事件驅動(Event-driven)的數據采集。
Matlab具有強大的繪圖功能,在Matlab中將采集到的數據實時顯示出來,可以使用二維曲線繪圖的方法。
Plot函數是Matlab中最常見的繪圖函數,可以用來繪制單條或多條曲線,它是針對向量或矩陣的列來繪制曲線的。也就是說使用plot函數之前,必須首先定義好曲線上每一點的X及Y坐標,常用的格式有:
plot(x,y)
以向量x、y為軸,繪制曲線。其中x和y為坐標向量。
plot(x1,y1,x2,y2…)
繪制多條曲線(也可以用矩陣變量plot(x,y))。
plot(x,y1,x,y2,x,y3…)
其功能是以公共向量x為X軸,分別以y1,y2,y3…為Y軸,在同一幅圖內繪制出多條曲線。
plot(x1,y1,LineSpec1,x2,y2,LineSpec2…)
將按順序分別畫出由三參數Xi,Yi,LineSpeci定義的線條。其中參數LineSpeci指明了線條的類型,標記符號,和畫線用的顏色。
xlabel (‘frequency (Hz)’); %X軸名稱為frequency(Hz)
ylabel (‘magnitude (dB) ’); %Y軸名稱為magnitude(dB)
Matlab7.0支持面向對象技術,用一個對象把計算機串口封裝起來。創建串口對象后,對其的操作就是對串口操作,從而實現了對計算機串口操作的簡化。因此,使用Matlab7.0平臺,通過計算機串口實現對專業測試儀器的控制以及測試數據的實時采集、傳輸、處理和結果顯示。是十分有效的實時數據采集與處理方法之一。
Matlab7.0封裝的串口對象支持對串口的異步讀寫操作,計算機在讀寫串口時能同時進行其他處理工作,因而使計算機具有極高的執行效率。Matlab7.0用多線程技術實現這種異步操作,通過異步讀寫設置,計算機在執行讀寫串口函數時能立即退回,不必等待串口把數據傳輸完畢。當指定的數據傳輸結束時就觸發事件,執行事件回調函數。可以在事件回調函數中編程,進行數據處理,這樣就不會造成因等待串口傳輸數據引起的機時浪費。
Matlab 串行口對象屬性。使用 serial 函數創建串口對象后,通過對象句柄操作串口,非常方便。串口對象有很多屬性,使用如下的命令可以查看串口所有屬性
set(s) %s 是serial 創建的COM1 串口對象的標識符
通過定義串口對象的屬性,就能定義串口的通信模式,也可以了解串口的狀態。幾個比較重要的屬性如下:
1. 串口名屬性
Port 定義系統的串口名稱(一般為‘COM 1’到‘COM 7’)
2. 串口通信屬性
BaudRate 定義傳輸波特率(缺省9600bps,可設為1200,2400,4800,19200bps 等等)
DataBits 定義數據幀的比特位數(一般為7 或8 位)
Parity 定義校驗方式(可取值:none、odd、even、mark、space)
StopBits 定義數據幀停止位位數(一般為1、1.5 或2)
Terminator 定義結束字符(一般為‘LF’)
3. 串口讀數據方式
ReadAsyncMode 定義異步讀操作為連續或手工方式(continuous-連續方式(缺省),或定義為manual)
數據采集工具箱集成于MATLAB中,所以在進行數據采集的同時,可以對采集的數據進行實時分析,或者存儲后再進行處理,或者針對數據分析的需要對測試條件的設立進行不斷的更新。應用數據采集工具箱提供的命令和函數可以控制任何類型的數據采集。DAQ是由一組M-File文件格式的函數和MEX-File 等動態鏈接庫所組成的, 專門使用在數據采集方面的一組函數庫。如圖1所示,這些組成部分使得Matlab與數據采集硬件之間的信息傳遞成為可能。
圖1:數據采集引擎與硬件驅動
Fig 1:Data Acquisition Engine and Hardware Driver
將被測物理量通過傳感器連接到數據采集卡,通過采集函數命令啟動數據采集任務,在數據采集引擎管理下,數據將從采集卡流入數據引擎,臨時存儲在內存中,以便于數據的重寫,數據重寫的速度依賴于內存的大小、數據采樣的速率和采集通道數。存儲在內存中被數據采集引擎管理的數據并不能自動進入Matlab工作空間,為了在Matlab工作空間使用這些數據,必須使用get-data函數從引擎中抽取。被抽取到Matlab空間的數據,可以用Matlab中其他工具箱的函數進行進一步的分析和處理,也可以直接寫入磁盤文件。
利用數據采集工具箱,在Matlab環境下實時數據采集的步驟如圖2所示。首先利用命令函數analoginput創建設備對象,并將該設備對象賦予一個Matlab變量,以后對該設備對象的操作就轉換為對該變量操作。當設備對象建立后,即可用ad-dchannel命令給該設備按照需要添加數據采集通道。一旦采集通道添加完成,就可以用set命令為設備對象設置采集參數,不同的采集卡,具有不同的采集特性參數。當采集參數設定后,即可用start命令啟動數據采集,這時采集卡的狀態就置于數據采集引擎的管理中,數據采集引擎會自動按照設定的參數監管和響應采集卡,并將其所采集的數據輸入數據引擎管理的內存區,通過相應的命令可以從Matlab中查看數據采集任務的狀態和抽取數據到Matlab工作空間,并可對抽取到Matlab工作空間的數據進行處理分析。當采集到數據滿足設定參數時,采集任務即告結束。這時必須利用delete和clear命令清除設備對象,否則,該設備將會一直處于采集引擎的監管之中,再次創建該設備對象時,系統將會報告一個錯誤。
圖2:數據采集命令流程圖
Fig 2: Command Flow Chart of Data Acquisition
3.3曲線顯示GUI的實現
利用MATLAB軟件中GUI模塊可以方便地設計出基于對話框的圖形用戶界面,它提供了諸如編輯框、按鈕、滾動條等圖形對象,通過對這些圖形對象的有機組合,再對相應的圖形對象編寫程序,就可以設計出界面友好、操作方便的系統軟件。 在Matlab的命令窗口輸入:guide,就可以進入圖形用戶界面的設計向導,在向導控制面板中,鼠標單擊左邊用戶界面控制對象面板中所需的按鈕對象,分別把它們放在圖形窗口中,并且可以通過拖動來改變其位置和大小。然后雙擊各個按鈕對象,就可以打開其屬性編輯器,拖動屬性編輯器右邊的滑塊,改變各個按鈕對象屬性,這樣就可以設計出對話框的外觀。設計效果圖如圖3所示。
MALTAB的GUI主要有兩個文件,當設置好GUIDE時點擊保存,這時將在當前路徑自動產生兩個名字相同的文件,但擴展標識符不同,一個為.fig文件,一個為.m文件,.fig主要是GUI圖形文件,和GUIDE設計的圖像相同,.m文件為程序文件,所有事件響應和計算功能都在這里實現。
MATLAB在創建每一個圖形對象時,都為該對象分配唯一的一個值,稱其為圖形對象句柄(Handle)。句柄是圖形對象的唯一標識符。在進行對話框設計時,要讓對話框實現輸入輸出功能,就要通過其句柄值調用一些函數文件,而當句柄未知時,可以用標識標簽‘Tag’屬性和函數findobj確定。其方法是通過給期望的圖形對象提供唯一的‘Tag’屬性字符串,用findobj函數來查找帶了期望的標識標簽的句柄。
圖3:GUI界面
Fig 3:GUI Interface
MATLAB的按鈕以及各種控件事件響應是依靠一種叫做回調函數(Callback Function)來實現的。GUI可以包括兩個方面:控件和回調函數(use interface components & callbacks);回調函數間數據的傳遞,也就是程序結構的問題。Matlab提供了兩種方法構造控件:用uicontrol系列的函數,或者用guide直接添加。控件有回調函數callback屬性,這實際上是一個字符串,包括函數名和參數,它應該是可以在workspace里面執行的表達式或者M文件名。
考慮M文件形式的回調函數,因為它需要能夠在workspace中執行,那么它的參數就必須在workspace中存在,它執行的結果也在workspace中。這樣所有需要的數據都必須是全局的,甚至比全局還要糟糕,它可能會與workspace中其他程序的數據沖突。matlab提供了一個巧妙的途徑:把數據跟圖形(.fig文件)聯系起來。fig上的控件,是以句柄(handles)的形式存在的,handles=guihandles(fig)可以得到fig的所有句柄。matlab是把圖形的數據也作為fig的句柄保存起來。
- 基于MATLAB的實時串口數據采集與曲線顯示的具體做法
4.1 數據采集的一般流程
4.1.1 創建接口對象并設置屬性
handles.S=serial(com); %創建串口對象
set(handles.S, BaudRate ,9600, StopBits ,1); %設置波特率缺省9600bit/s和停止位
set(handles.S, Parity , none,). %設置無奇偶校驗
set(handles.S, FlowControl , none );%無流控制
set(handles.S, DataBits ,8); %設置8位數據位
set(handles.S, InputBufferSize ,receivelen*10);%設置緩沖區大小
設置串口設置對象的屬性也可以用一條指令完成,如:
set(handles.S,'COM3','BaudRate',3600,'Parity','none','DataBits',8,'StopBits',1)
創建了對象后可以在Matlab命令窗口直接敲對象名并回車,看到其基本屬性和當前狀態,若需要知道其全部的屬性,可以用get(s)命令。
有些屬性只有在對象沒有被打開時才能改變其值,如InputBufferSize、OutputBufferSize屬性等。對于一個RS-232/RS-422/RS-485串口設備對象,其屬性的缺省值為波特率9 600b/s,異步方式,通信數據格式為8位數據位,無奇偶校驗位,1位停止位。如果要設置的串口設置對象的屬性值與缺省值的屬性值相同,可以不用另行設置。
4.1.2 打開串口設備對象
fopen(handles.s);
4.1.3 讀寫串口操作
初始化并打開串口調協對象之后,現在可以對串口設備對象進行讀寫操作,串口的讀寫操作支持二進制和文本(ASCII)兩種方式。當Matlab通信數據采用西方(ASCII)方式時,讀寫串口設備的命令分別是fscanf、fpritf;當Matlab通信數據采用二進制方式時,讀寫串口設備的命令分別是fread、fwrite。下面以文本方式讀寫串口為例:
讀串口。A=fscanf(s,'%d',[10,100]); %從串口設備對象s中讀入10*100個數據填充到數組A[10,100]中,并以整型的數據格式存放。
寫串口。Fprintf(s,'%s','RS232','async'); %將字符串‘RS232?’以字符的數據格式寫入到串口設備s,寫操作以異步的方式進行。
4.1.4 關閉并清除設備對象
fclose(handles.s); %關閉串口設備對象
delete(handles.s); %刪除內存中的串口設備對象
clear handles.s; %清除工作空間中的串口設備對象
當不再使用該串口設備對象時,順序使用以上3條命令,可以將所創建的串口對象對象清除,以免占用系統資源。
4.2基于Matlab中斷方式的實時串行通信編程
在Matlab環境下,讀取串口數據的方式可以分為兩種—查詢和中斷。以查詢的方式進行串行通信時,如下位單片機有大量的數據分時分批傳送給PC機,就需要不停查詢串行口的緩沖區,有數據就讀取;雖然編程容易,但這樣做不能對數據進行實時處理,系統實時性不高,而且會極大地占用系統的資源。以中斷的方式對串口進行控制實現串行通信,就可以實時處理下位機傳送的數據;但編程相對復雜一些,需要采用Matlab的事件和回調函數機制。
在Matlab環境下以中斷的方式進行串行通信,實際上是采用事件驅動的方法實現的。Matlab提供了instrcallback (obj, event)回調函數,用戶根據需要可以自行設置具體的串行通信事件。Matlab常用的串行口通信中斷事件有:緩沖區有指定字節數目的數據可用事件(bytes-available event)、串口接收到的數據長時間處于非激活狀態事件(break-interrupt event)、串行口引腳狀態改變事件(pin-status event)、輸出緩沖區為空事件(output empty event)等。當串口上有監視的事件發生時,Matlab會自動調用回調函數進行通信事件的處理。因此,事件驅動實質上是一種中斷機制,而回調函數實質上相當于一個中斷服務子程序。Matlab端實時串行通信的程序流程如圖4所示。以下是具體的編程步驟。
1.建立一個串行通信主程序:SerialPortCommunication.m文件,在主程序中進行串口設備初始化操作,并指定回調函數中串行通信的事件。
程序主要源代碼如下(創建串口設備對象、設備串口設備屬性及打開串口等初始化操作的代碼與前述的查詢方式下的初始化代碼相同):
%設置串口事件回調
o_SerialPort.BytesAvailableFcnMode='byte' %中斷觸發事件為‘bytesAvailable Event’
o_SerialPort.BytesAvailableFcnCount=10 %接收緩沖區每收到10個字節時,觸發回調函數
o_SerialPort.BytesAvailableFcn={@EveBytesAvailableFcn,handles} %得到回調函數句柄
2.修改instrcallback(obj,event)回調函數,對所發生的串口通信事件進行處理。
Matlab缺省的回調函數instrcallback (obj, event)存在于instrcallback.m文件中。該文件實際上是一個有待于用戶修改的程序模塊。其中只有一些最基本的程序代碼,能夠顯示導致串口中斷發生的是哪一類事件,中斷事件所發生的時間以及導致事件發生的對象名等信息(修改回調函數文件時,注意要取消文件中相應信息后的分號,才能夠在Matlab的命令窗口(command window)中將這些信息顯示出來)。中斷發生后的通信事件處理以及通信數據的分析處理任務,需要用戶自行添加相應的服務程序代碼。
4.3繪制采集數據的曲線波形與數據顯示
在MATLAB的二維繪圖指令中,最重要、最基本的指令是PLOT,其他許多特殊的繪圖指令都是以它為基礎而形成的。作為繪制線性坐標平面圖形的函數PLOT,對于不同的輸入參數,該函數用不同的形式可以實現不同的功能。
4.3.1繪制曲線波形
在GUI設計中,拖拽出Axes控件即可在界面上顯示曲線坐標,再使用命令plot(x,y)將采集到的數據曲線波形顯示出來。其中x,y是同維向量,那么plot將繪制出以x,y元素為橫、縱坐標的曲線。
plot(handles.axes_main,1:length(number),number); %確立該圖在界面上的位置并按照比例縮放顯示
為了更好地觀察曲線波形,可以使用grid on命令,該命令主要用于在坐標平面上加上網格,從而更有利于觀察和分析。
grid on; %加坐標網格
4.3.2數據顯示
在GUI界面設計中拖拽出TXT控件,然后修改其Tag屬性為edit_ReceiveData,用以顯示接收到的串口所發送過來的數據,String留空,并把MAX改為2.0,以便可以多行顯示數據。
4.3.3 采集圖像
實現串口通信需要借助COMTOOLS工具向做好的SerialPortCommunication程序發送數據,此工具可以將發送的數據記錄在指定的文件目錄。其界面如圖4所示,此時已打開COM4,輸入了要發送的數據。
圖4:串口助手
Fig 4: Comtools
打開SerialPortCommunication的COM3串口,即可顯示COMTOOLS發送過來的數據的曲線波形,如圖5。
如果要實現實時串口數據采集,則使用COMTOOLS工具里面的“定時發送”-“循環發送”功能即可實現。效果圖如圖6所示。
圖5:接收的曲線波形和數據
Fig 5: Received waveform and the data curve
圖6:實時串口數據曲線波形和數據顯示
Fig 6: Real-time serial data waveforms and data curve
4.4擴展功能——發送數據
在Matlab中實現SerialPortCommunication的發送數據功能其實也很簡單,同接收數據一樣,在GUI界面設計中拖拽出TXT控件,然后修改其Tag屬性為edit_SendData,用以顯示發送到的串口的數據,String留空,并把MAX改為2.0,以便可以多行顯示數據。發送8次后的應用效果如圖7。
圖7:發送數據
Fig 7:Send Data
可以看出,在Matlab中進行串行通信是十分方便的,編程較為簡單。而且,在Matlab中串行通信的失誤率很低,通信較為可靠,也可以采用增加握手信號以及數據校驗等的方式進一步增加通信的可靠性。建立基于MATLAB的實時串口數據采集與曲線顯示,能夠實現信號采集、設備控制以及結果顯示等功能。
實踐證明該功能具有精度高、實時性好、性價比高、人機界面友好、升級修改簡單等優點。在進行項目研究過程中,常常需要進行多次實驗,采集大量的數據,并且要求對數據能實時地進行分析處理,該功能能很好地滿足這種研究需要。此外,這一功能還可以擴展應用到其他相關的領域中,如在語音識別工作中可以用該系統采集語音信號并且加入語音處理的相關分析等。因此,該功能不僅具有良好的實用性,還可為其他的相關研究提供理論和應用基礎。
致 謝
本論文是在老師的悉心指導和熱情關懷下完成的,老師淵博的學識、嚴謹的治學態度、精益求精的工作作風和誨人不倦的高尚師德,都將深深地感染和激勵著我,也為我提供了良好的實驗條件,在開展實驗、撰寫論文等方面提供了很多專業性的指導,在此謹向老師致以誠摯的感謝!
生我者父母。感謝生我養我,含辛茹苦的父母。是你們,為我的學習創造了條件;是你們,一如既往的站在我的身后默默的支持著我,沒有你們就不會有我的今天。
感謝學術界的前輩們,為我在這篇論文的完成中提供了大量的參考資料,使我學習到了很多知識。
附錄
附錄1:MATLAB實時串口數據采集與曲線顯示源代碼
附錄1
- function figure1_CloseRequestFcn(hObject, eventdata, handles)
- global number;
- global o_SerialPort;
- %--------------關閉串口------------------------
- if strcmp(o_SerialPort.Status,'open')
- fclose(o_SerialPort);
- end
- number=[];
- clear number;
- delete(hObject);
- %---------------按鈕顯示切換設置--------------
- set(hObject,'Visible','off');
- set(handles.pb_CloseSerialPort,'Position',get(handles.pb_OpenSerialPort,'Position'));
- %-----------------端口初始化-------------------
- set(handles.pb_CloseSerialPort,'Visible','on');
- int_Index_COM=get(handles.pop_SerialPort,'Value');
- string_COM=get(handles.pop_SerialPort,'String');
- string_Select_COM=string_COM{int_Index_COM};
- o_SerialPort=serial(string_Select_COM);
- %---------------設置緩沖區大小為1M----------------
- set(o_SerialPort,'InputBufferSize',1024000);
- %--------------- EveBytesAvailableFcn事件回調函數-------------------
- function EveBytesAvailableFcn( t,event,handles )
- global o_SerialPort;
- global number;
- number=[number fread(o_SerialPort,10)'];
- set(handles.edit_ReceiveData,'String',num2str(number));
- % -------------------發送按鈕回調------------------
- unction pb_SendData_Callback(hObject, eventdata, handles)
- global o_SerialPort;
- string_edit_SendData=get(handles.edit_SendData,'String');
- if(get(handles.cb_CharOrHex,'Value')==get(handles.cb_CharOrHex,'Max'))
- fprintf(o_SerialPort,string_edit_SendData);
- else
- double_edit_SendData=str2num(string_edit_SendData);
- fwrite(o_SerialPort,double_edit_SendData);
- end
- %--------------------串口下拉位選擇-----------------
- function pop_SerialPort_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
- %------------------------------------------發送數據-------------------------------------
- function edit_SendData_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
- %------------------------------------------接收數據-------------------------------------
- function edit_ReceiveData_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
復制代碼完整的Word格式文檔51黑下載地址: