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