摘 要 本文介紹MATLAB環境下上位機與下位機經過RS232接口進行串行通訊的實現方法;詳細敘述了在MATLAB環境下使用其自帶的控制工具箱中的串口事件回調函數,實時接收下位機輸出串行信號的實現過程。算法
關鍵詞 MATLAB7.0,串口通訊,回調函數編程
MATLAB是由美國MATHWORKS公司開發的面向理論分析研究和工程設計處理的一套具備強大功能的軟件系統。在設計研究單位和工業部門,MATLAB被認做進行高效研究、開發的首選軟件工具。其編程語法規則與通常的結構化編程語言大同小異,並且使用更方便,具備通常編程基礎的用戶均可以很快熟練掌握。MATLAB內置大量的數學算法函數,只要幾個語句就能實現諸如矩陣/行列式運算、FIR/IIR濾波等數據分析處理、複雜的圖形顯示等。在實際應用中經常要經過各類方式將數據傳入計算機,進而藉助MATLAB的強大分析處理能力對數據進行分析、處理和圖形顯示。數組
本文提出在上位機MATLAB 7.0環境下,使用RS232串行接口實時接收。該方法較之使用VC/VB高級語言編程,極大地縮減了開發時間,提升了開發效率。異步
1、整體框圖編程語言
本設計的整體原理框圖可見圖1, 系統主要由上位機(PC機)和下位機(PC104)部分。上位機和下位機經過RS232進行通信。上位機負責數據處理和圖形化顯示,它是在MATLAB7.0環境下進行的,應用了儀器控制工具箱中關於串行通訊的函數,經過程序控制整個系統的工做並進行數據處理。下位機負責數據採集和響應主機的控制處理信號。函數
2、通訊原理工具
在MATLAB7.0中的設備控制工具條(INSTRUMENT CONTROL TOOLBOX)用來負責上、下位機之間的通訊。該設備控制工具箱的特點以下:INSTRUMENT CONTROL TOOLBOX包括兩大部件:M文件函數和接口驅動適配器。這兩部件提供了MATLAB與外設的通信功能如圖1所示。優化
圖1 串行通信端口的通信原理ui
由圖1可見,MATLAB的兩大部件提供了一條外設與MATLAB之間的交互通道,使用戶與外設之間進行信息獲取和傳送。同許多高級語言同樣,MATLAB 經過調用M文件函數來建立設備對象,獲得設備的文件句柄,而設備驅動程序做爲操做系統中直接控制硬件的模塊,是連接操做系統內核與系統外部設備I/O操做的關鍵模塊。它將具體的硬件細節隱藏實現對外設操做的透明,所以MATLAB能夠象操做文件同樣實現對外設的讀、寫操做。同時MATLAB支持二進制和文本(ASCII)兩種串行通訊方式,文本方式支持SCPI(STANDARD COMMANDS FOR PROGRAMMABLE INSTRUMENTS)語言;支持異步通訊和同步通訊;支持查詢和基於事件驅動的兩種串行通訊方式。spa
3、MATLAB串行通訊
在MATLAB環境下,讀取串口數據的方式能夠分爲兩種:查詢法和事件驅動法。以查詢的方式進行串行通訊時,以下位有大量的數據分時分批傳送給PC機,上位機就須要不停查詢串行口的緩衝區,有數據就讀取;雖然編程容易,但這樣沒法實現對數據進行實時處理和圖形顯示,系統實時性不高,並且會極大地佔用系統的資源和出現丟幀現象。以事件驅動的方式對串口進行控制實現串行通訊,就能夠實時處理下位機傳送的數據;但編程相對複雜一些,須要採用MATLAB的事件和回調函數機制。
1.查詢法
MATLAB使用查詢法對進行串行通信的程序以下:
g =serial('com1'); %建立串口對象
g.baudrate=115200; %設置波特率,缺省9600bit/s
g.parity='none'; %設置校驗位無奇偶校驗
g.stopbits=1; %設置中止位
g.inputbuffersize=256; %設置輸入緩衝區爲256b,缺省值爲512b
g.Terminator='LF'; %設置輸入緩衝區爲256b,缺省值
recbuf=zeros(1,40); %清接收緩衝區(40)
framelen=23; %幀長度(每幀23byte)
framenum=0; %清接收幀數
rectr=0; %接收計數器清零
xctr=0; %輸入接收的數據幀數
recnum= input('請輸入要接收的數據幀數:\n');
%打開串口設備
fopen(g); %打開串口設備對象g
fwrite(g,255) ; %以二進制的方式發送握手信號0xFF
%進入接收循環
while framenum<recnum
recdta=fread(g,1,'uint8'); %以二進制的方式讀入數據
if recdta==255 %找幀頭
rectr=rectr+1; %接收計數器加1
recbuf(rectr)=recdta; %送入接收緩衝區
elseif recdta==framelen&rcbuf(1)==255 %驗證接收長度和幀頭
framelen=recdta; %取幀長度
rectr=rectr+1; %接收計數器加1
recbuf(rectr)=recdta; %送入接收緩衝區
elseif rectr>1&rectr<framelen %接收數據
rectr=rectr+1; %接收計數器加1
recbuf(rectr)=recdta; %送入接收緩衝區
if rectr==framelen %若是接收完進行處理
rectr=0; %清接收計數器
framenum=framenum+1; %幀數累加
%根據具體通信協議提取數據
…
%接收濾波後的數據
….
plot(…) %輸出顯示
end
else rectr=0; %未找到幀頭清計數器
end %接收結束
end %主循環結束
%程序結束關閉串口類
fclose(g); %關閉串口
delete(g); %刪除串口對象
clear g ; %清除變量
注意:串口的讀寫操做有文本方式和二進制方式兩種。在文本方式下,串口設備只接收能夠顯示的ASCII字符,將0X00H~0X1FH範圍內的字符解釋爲控制字符。使用文本方式對串口的讀寫函數分別爲FPRINTF()(寫)、FSCANF()(讀)。
2.事件驅動法
在MATLAB環境下以事件驅動的方式進行串行通訊,相似於VC中的MSCOMM控件中ONCOMM事件的實現方法。MATLAB7.0提供了INSTRCALLBACK(OBJ,EVENT)回調函數,用戶根據須要能夠自行設置具體的串行通訊事件。MATLAB經常使用的串行口通訊中斷事件有:緩衝區有指定字節數目的數據可用事件(BYTES-AVAILABLE EVENT)、串口接收到的數據長時間處於非激活狀態事件(BREAK-INTERRUPT EVENT)、串行口引腳狀態改變事件(PIN-STATUS EVENT)、輸出緩衝區爲空事件(OUTPUT EMPTY EVENT)等。當串口上有監視的事件發生時,MATLAB會自動調用回調函數進行通訊事件的處理。所以,事件驅動實質上是一種中斷機制,而回調函數實質上至關於一箇中斷服務子程序。MATLAB端實時串行通訊的程序流程如圖4所示,如下是具體的編程步驟。
(1)主程序
g =serial('com1'); %建立串口對象
g.baudrate=115200; %設置波特率,缺省9600bit/s
g.parity='none'; %設置校驗位無奇偶校驗
g.stopbits=1; %設置中止位
g.BytesAvaibleFcnMode='byte';% 設置中斷觸發事件爲‘bytes-available Event’
g.BytesAvailableFcnCount=30; % 設置接收緩衝區每收到30個字節時,觸發回調函數
g.BytesAvailableFcn=@instrcallback;獲得回調函數句柄
fopen(g);%鏈接串口設備對象
fwrite(g,255);%寫串口,發送握手信號0xFF(等價於十進制下的數值255)
(2)中斷調用程序
MATLAB缺省的回調函數INSTRCALLBACK(OBJ,EVENT)存在於INSTRCALLBACK.M文件中。該文件相似於VC中的ONCOMM事件函數模塊。需用戶自行添加相應的中斷處理程序代碼。
MATLAB安裝目標盤下有兩個INSTRCALLBACK.M文件,咱們只須要修改MATLAB7\TOOLBOX\MATLAB\IOFUN\@INSTRUMENT目錄下的INSTRCALLBACK.M文件便可。注意,在修改INSTRCALLBACK.M文件以前,最好對進行備份。另外,須要注意的是:程序調試過程當中若是再次修改了該回調函數,要從新啓動MATLAB,才能使得新的回調函數文件生效。
%修改後的instrcallback.m文件以下:
function instrcallback(obj, event)
%如下是用戶自行添加的通訊事件處理及通訊數據處理的中斷服務程序代碼
%定義存儲串口30個字節通訊數據的數組
Inbuffer1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
inbuffer2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
%如下程序用以對串口通訊事件處理
out= fread (obj, 30, 'uint8') %接下位機發送的30個數據(每一個數據佔一個字節)
%如下程序用以數據進行濾波
inbuffer2=filter(…., Inbuffer1);
%如下程序用以對濾波後數據進行文件存儲
fid = fopen('C:\MATLAB7\work\data.txt','a+'); %建立並data.txt文件
fprintf(fid,'%3d',inbuffer2); %將濾波後數據存儲到fid文件設備中
fclose(fid); %關閉fid文件設備
%數據計算
…
% 進行實時圖形輸出顯示
plot(…);
end
實驗證實,基於MATLAB事件驅動方式的實時串行通訊穩定可靠,處理數據方便,編程簡單,開發效率大大提升。
4、結論
本文介紹的基於MATLAB環境下PC機與PIC單片機串行通訊的實現方法,利用MATLAB的INSTRUMENT CONTROL TOLLBOX的SERIAL類及INSTRCALLBACK()回調函數,實現基於事件驅動的實時通訊。使開發人員使用MATLAB工具箱中的現有函數,方便地實現串行通訊,充分的利用MATLAB中獨有數據分析處理和圖形顯示函數,大大簡化系統上位機軟件的編程工做量,使系統開發人員能夠專一於系統的算法實現和優化。