摘 要:Matlab不僅具有強(qiáng)大的科學(xué)計(jì)算功能,還內(nèi)置了GUI工具用于進(jìn)行界面開(kāi)發(fā)。利用Matlab的GUI工具和內(nèi)置的串口通信API,設(shè)計(jì)開(kāi)發(fā)一個(gè)可視化的串口通信例程,實(shí)現(xiàn)IMU原始數(shù)據(jù)的接收采集,并利用Matlab強(qiáng)大的科學(xué)計(jì)算功能,對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理,圖形化顯示數(shù)據(jù)處理結(jié)果。最后介紹了編譯發(fā)布Matlab程序的步驟與注意事項(xiàng)。
關(guān)鍵詞:Matlab GUI; 串口通信; IMU; 軟件編譯
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1004-373X(2010)09-0038-03
Serial Communication Program Development Based on Matlab GUI
(1. PLA 91329 Unit, Weihai 264200, China; 2. PLA 92859 Unit, Tianjin 300061, China)
Abstract: Matlab has powerful scientific computation ability, and an embedded GUI tool is used to interface development. A visualized serial communication routines is designed with the GUI tool and embedded serial communication API, the reception and acquisition of IMU original data is realized the scientific computation ability of Matlab is used for processing data real-timly and displaying result graphically. In the end, steps to compile and release the program is introduced.
Keywords: Matlab GUI; serial communication; IMU; software compiler
0 引 言
Matlab是MathWorks公司開(kāi)發(fā)的一種科學(xué)計(jì)算軟件。Matlab運(yùn)行穩(wěn)定、可靠、使用方便,是廣大科研人員進(jìn)行科學(xué)研究的得力助手。Matlab不僅具有強(qiáng)大的科學(xué)計(jì)算功能,還具有滿足一般要求的數(shù)據(jù)采集以及界面設(shè)計(jì)開(kāi)發(fā)功能。Matlab GUI(Graphic User Interface)就是內(nèi)置于Matlab的進(jìn)行圖形界面開(kāi)發(fā)的模塊。本文利用Matlab GUI設(shè)計(jì)通過(guò)串口進(jìn)行數(shù)據(jù)發(fā)送和接收的界面,并利用內(nèi)置于Matlab的串口通信API實(shí)現(xiàn)串口數(shù)據(jù)發(fā)送與接收功能。
1 Matlab GUI介紹
啟動(dòng)Matlab后,運(yùn)行g(shù)uide命令即可以啟動(dòng)Matlab GUI開(kāi)發(fā)工具。如圖1所示。
新建Blank GUI,如圖2所示。
在新建Blank GUI界面中,包含了一般的界面元素,如菜單、按鈕、坐標(biāo)軸、控件等。添加必要的串口通信參數(shù)設(shè)置按鈕。
運(yùn)行后的界面如圖3所示。
圖1 Matlab GUI開(kāi)發(fā)界面
圖2 新建Blank GUI界面
圖3 串口通信界面
2 串口數(shù)據(jù)發(fā)送與接收功能實(shí)現(xiàn)
2.1 建立串口通信流程的基本步驟
Matlab提供了對(duì)串口進(jìn)行打開(kāi)、關(guān)閉、以及串口參數(shù)設(shè)置等操作的一系列函數(shù)。利用這些函數(shù)可以選擇串口號(hào)、設(shè)置串口通信參數(shù)(波特率、數(shù)據(jù)位、停止位、校驗(yàn)位等)、進(jìn)行中斷控制、流控制。從建立串口通信到結(jié)束串口通信的完整流程包括以下幾個(gè)步驟:
(1) 為應(yīng)用程序創(chuàng)建串口對(duì)象。實(shí)現(xiàn)該功能的函數(shù)為:
obj= serial(′port′,′PropertyName′,PropertyValue,…)
其中參數(shù)port為完整的串口名稱,如com1。PropertyName為串口通信參數(shù),如baudrate,startbits等。創(chuàng)建串口對(duì)象的過(guò)程中,也可以忽略PropertyName。其函數(shù)為:
obj = serial(′port′)
(2) 連接打開(kāi)串口。實(shí)現(xiàn)該功能的函數(shù)為:
fopen(obj)
obj即為使用創(chuàng)建串口對(duì)象函數(shù)的返回值。在連接打開(kāi)串口后,可以對(duì)串口通信參數(shù)進(jìn)行修改。
(3) 設(shè)置或者修改串口通信參數(shù)。在能夠有效地進(jìn)行串口通信前,必須設(shè)置正確的串口通信參數(shù)。實(shí)現(xiàn)該功能的函數(shù)為:
props = set(obj,′PropertyName′,PropertyValue,…)
obj即為使用創(chuàng)建串口對(duì)象函數(shù)的返回值;PropertyName為串口通信參數(shù),如baudrate,startbits等。
(4) 從串口讀寫(xiě)數(shù)據(jù)。在前面三個(gè)步驟正常完成后,即可以從串口讀數(shù)據(jù)或者向串口寫(xiě)數(shù)據(jù),也就是接收或者發(fā)送數(shù)據(jù)。實(shí)現(xiàn)讀串口功能的函數(shù)有多個(gè)。其區(qū)別在于根據(jù)到達(dá)串口數(shù)據(jù)的類型選擇合適的讀函數(shù)。主要包括:fgetl,fgets,fread,fscanf。這里主要介紹fread,fread函數(shù)實(shí)現(xiàn)從串口讀入二進(jìn)制數(shù)據(jù)。fread的實(shí)現(xiàn)形式為:
A=fread(obj,size)
A為讀入的數(shù)據(jù),以數(shù)組的形式存儲(chǔ),存儲(chǔ)數(shù)據(jù)形式為字節(jié);obj即為使用創(chuàng)建串口對(duì)象函數(shù)的返回值;size指定一次讀操作讀入字節(jié)的個(gè)數(shù)。實(shí)現(xiàn)寫(xiě)串口的函數(shù)有兩個(gè),分別為fwrite和fprintf。fwrite以二進(jìn)制形式向串口寫(xiě)入數(shù)據(jù),實(shí)現(xiàn)形式為:
fwrite(obj,A)
obj即為使用創(chuàng)建串口對(duì)象函數(shù)的返回值;A為寫(xiě)入的數(shù)據(jù),以數(shù)組形式存儲(chǔ)。fwrite以文本形式向串口寫(xiě)入數(shù)據(jù),即以ASCII碼的形式向串口寫(xiě)數(shù)據(jù),實(shí)現(xiàn)形式為:
fprintf(obj,′cmd′)
obj即為使用創(chuàng)建串口對(duì)象函數(shù)的返回值;cmd為寫(xiě)入的文本數(shù)據(jù),以數(shù)組形式存儲(chǔ)。
(5) 關(guān)閉串口以及釋放串口對(duì)象占用的存儲(chǔ)空間。關(guān)閉串口函數(shù)為:fclose(obj)。釋放串口對(duì)象占用的內(nèi)存空間,函數(shù)為:delete(obj)。釋放串口對(duì)象在Matlab工作區(qū)中占用的存儲(chǔ)空間,函數(shù)為:clear obj。
以上5步是建立串口通信過(guò)程到關(guān)閉串口,釋放串口占用資源的基本步驟。基本步驟可以實(shí)現(xiàn)手動(dòng)收發(fā)數(shù)據(jù)。其例程如下:
s=serial(′COM1′);
fopen(s);
s.BytesAvailableFcnMode = ′terminator′;
s.BytesAvailableFcn = @instrcallback;
fprintf(s,′*IDN?′);
out = fscanf(s);
運(yùn)行以上語(yǔ)句后,顯示的結(jié)果如下:
BytesAvailable event occurred at 17:01:29 for the object:
Serial-COM1.
串口數(shù)據(jù)接收完畢后,需要關(guān)閉串口,并釋放串口對(duì)象占用的資源,使用的命令如下:
fclose(s);
delete(s);
clear s;
2.2 串口中斷設(shè)置及中斷處理函數(shù)
要實(shí)現(xiàn)自動(dòng)收發(fā)數(shù)據(jù),還需要定義串口中斷處理函數(shù)以及觸發(fā)串口中斷的方式。定義串口中斷處理函數(shù)也就是定義串口數(shù)據(jù)接收或者發(fā)送函數(shù)。定義觸發(fā)串口中斷的方式其目的是為了在串口檢測(cè)到接收數(shù)據(jù)的時(shí)候,通知并啟動(dòng)串口數(shù)據(jù)接收函數(shù)進(jìn)行數(shù)據(jù)接收操作;在串口輸出緩存為空的時(shí)候,通知啟動(dòng)串口數(shù)據(jù)發(fā)送函數(shù)。
(1) 觸發(fā)串口中斷的方式。在Matlab串口通信編程中,Matlab通過(guò)檢測(cè)到串口通信事件,從而觸發(fā)串口中斷。涉及到串口讀寫(xiě)的事件包括:Bytes available,Output empty。其中Bytes available事件有兩種:一種是接收到的字符數(shù)達(dá)到人工設(shè)定的數(shù)目時(shí),則系統(tǒng)產(chǎn)生該事件;另一種是當(dāng)接收到指定字符時(shí),系統(tǒng)產(chǎn)生該事件。Output empty事件是在系統(tǒng)檢測(cè)到輸出緩存區(qū)為空時(shí),產(chǎn)生該事件。
Bytes available事件需要事先設(shè)置。可以使用函數(shù):set(obj,′ BytesAvailableFcnMode′,′ byte′);set(obj,′BytesAvailableFcnCount′,240);以上兩個(gè)函數(shù)設(shè)置當(dāng)串口檢測(cè)到輸入緩存中到達(dá)了240個(gè)字符的數(shù)據(jù)時(shí),則觸發(fā)串口中斷。另外,也可以設(shè)置為當(dāng)系統(tǒng)檢測(cè)到某個(gè)字符達(dá)到串口,則觸發(fā)串口中斷。其設(shè)置函數(shù)為:set(obj,′ BytesAvailableFcnMode′,′ terminator′);set(obj,′ terminator′,′H′)。以上兩個(gè)函數(shù)設(shè)置當(dāng)串口檢測(cè)到字符H時(shí),則觸發(fā)串口中斷。
輸出緩存為空事件的產(chǎn)生。該事件由系統(tǒng)自動(dòng)檢測(cè)產(chǎn)生,不需要用戶特別設(shè)置。該事件一般在輸出緩存中的最后一個(gè)字符發(fā)送完畢后產(chǎn)生。用戶可以定義該事件引起的串口中斷處理函數(shù)。
(2) 串口中斷處理函數(shù)。串口中斷處理函數(shù)可以根據(jù)用戶需要自行定義。如串口讀中斷處理函數(shù)可以這樣定義:
obj.BytesAvailableFcn=@receiveData。
receiveData即為串口讀中斷處理函數(shù)。在讀中斷處理函數(shù)中可以進(jìn)行串口讀操作。即將輸入緩存區(qū)中的數(shù)據(jù)讀到用戶自定義的存儲(chǔ)變量中,以備后續(xù)的數(shù)據(jù)處理與分析。類似可以定義輸出緩存為空時(shí)觸發(fā)的串口中斷處理函數(shù):
obj.OutputEmptyFcn=@writeData。
本文開(kāi)發(fā)的串口通信程序用于接收采集IMU(Inertial Measurement Unit)輸出的加速度計(jì)和陀螺的測(cè)量數(shù)據(jù)。通過(guò)定義串口讀中斷事件和串口中斷處理函數(shù),實(shí)現(xiàn)了數(shù)據(jù)的自動(dòng)采集,并以Matlab圖形方式實(shí)時(shí)顯示數(shù)據(jù)。
3 串口通信程序的編譯發(fā)布
3.1 編譯程序
為了對(duì)代碼進(jìn)行保密,以及方便用戶發(fā)布可以在不同平臺(tái)運(yùn)行的可執(zhí)行程序,Matlab提供了Matlab程序編譯與發(fā)布功能。在進(jìn)行Matlab程序編譯之前,需要設(shè)置編譯工具。在Matlab命令窗口中,輸入運(yùn)行mbuild –setup,進(jìn)行編譯工具設(shè)置。如圖4所示。
mbuild-setup命令運(yùn)行后,Matlab會(huì)檢測(cè)已經(jīng)安裝在本機(jī)上的編譯器,用戶可以自行選擇任意一個(gè)編譯器,選擇完畢后,運(yùn)行編譯命令,Matlab將使用用戶選定的編譯器對(duì)程序進(jìn)行編譯。
設(shè)置完畢編譯工具后,即可以在命令窗口中運(yùn)行編譯命令,將Matlab程序編譯成可執(zhí)行程序。命令格式為:
mcc [-options] mfile1 [mfile2 … mfileN];
options為編譯參數(shù);
mfile1為待編譯的Matlab文件,如果包含多個(gè)Matlab文件,可以直接列在mfile1后面。
圖4 設(shè)置Matlab編譯工具
如將一個(gè)文件名為myfun.m的Matlab文件編譯成一個(gè)獨(dú)立可執(zhí)行程序,可以使用mcc命令:
mcc -m myfun;
mcc命令可以用使用多個(gè)編譯參數(shù),相應(yīng)參數(shù)的含義可以參見(jiàn)Matlab幫助文檔。
3.2 發(fā)布程序
Matlab文件編譯完畢后,生成的可執(zhí)行程序還需要Matlab環(huán)境的支持,要發(fā)布到?jīng)]有安裝Matlab的機(jī)器上運(yùn)行,還需要進(jìn)行最后一項(xiàng)工作,即打包Matlab組件運(yùn)行環(huán)境(Matlab Component Runtime,MCR)。將MCR與可執(zhí)行程序一起打包,拷貝到其他沒(méi)有安裝Matlab的機(jī)器上,在該機(jī)器上安裝MCR,安裝完畢即可以直接在該機(jī)器上運(yùn)行編譯的Matlab可執(zhí)行程序。MCR安裝文件位于:
Matlab Root\\\oolbox\\\\compiler\\\\deploy\\\\win32
在2008版Matlab中,已經(jīng)內(nèi)置了Matlab編譯發(fā)布工具箱,在Matlab命令窗口中運(yùn)行deploytool命令,即可以調(diào)出該工具窗口,通過(guò)該工具可以方便、快捷地編譯發(fā)布Matlab程序。
4 結(jié) 語(yǔ)
Matlab具有強(qiáng)大的科學(xué)計(jì)算功能和圖形顯示功能,選用Matlab作為數(shù)據(jù)處理與分析工具是合適的,但其界面開(kāi)發(fā)和數(shù)據(jù)采集功能相對(duì)較弱,不如Visual C++或者LabView強(qiáng)大。不過(guò),對(duì)于一般的界面開(kāi)發(fā),和普通功能的串口通信開(kāi)發(fā),Matlab是足以勝任的,同時(shí)也可以直接利用其強(qiáng)大的數(shù)據(jù)分析與處理功能。本
文基于MatlabGUI的串口通信功能的編程實(shí)現(xiàn)表明
利用Matlab GUI可以進(jìn)行包含一般界面元素的界面開(kāi)發(fā),在此基礎(chǔ)上,加入串口通信功能,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)采集與分析處理,并進(jìn)行圖形化顯示。
參考文獻(xiàn)
[1]陳垚光,毛濤濤,王正林,等.精通Matlab GUI設(shè)計(jì)[M].北京:電子工業(yè)出版社,2008.
[2]秦襄培.Matlab圖像處理與界面編程寶典[M].北京:電子工業(yè)出版社,2009.
[3]Igor Penjivrag. MatlabGUI 編程[EB/OL]. [2007-11-2]. http://Matlabstudio.yo2.cn/Matlab/Matlab-gui-programming-guide-for-beginners, 2007.
[4]陳安宇,陳偉,石彬,等.Matlab圖形用戶界面的應(yīng)用研究[J].機(jī)電工程技術(shù),2008,16(10):16-21.
[5]張立炎,張?zhí)熨R,黃亮,等.燃料電池空氣供給系統(tǒng)建模及基于Matlab GUI仿真界面設(shè)計(jì)[J].系統(tǒng)仿真技術(shù),2008,10(2):10-13.
[6]夏慶觀,盛黨紅,溫秀蘭.基于Matlab GUI的零件圖像識(shí)別[J].中國(guó)制造業(yè)信息化,2008,15(23):15-18.
[7]趙震,劉志剛,刁利軍.基于Matlab的船用螺旋槳計(jì)算機(jī)實(shí)時(shí)仿真及GUI設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用與軟件,2008,49(3):49-52.