Matlab並不具備直接訪問硬件的能力,但是支持面向對象技術,通過調用Instrument Control Toolbox中的serial類函數來創建串口對象,對串口對象操作就是對串口操作,
使用起非常方便。同時,Matlab封裝的串口對象支持對串口的異步讀寫操作,使得計算機在讀寫串口時能同時進行其他處理工作,因而能大大提高計算機執行效率。Matlab用
多線程技術實現這種異步操作,通過異步讀寫設置,計算機在執行讀寫串口函數時能立即返回不必等待串口把數據傳輸完畢,當指定的數據傳輸結束時就觸發事件,執行事件
回調函數,可以在事件回調函數中編程,進行數據處理,這樣就不會造成因等待串口傳輸數據引起的時間浪費。
MATLAB的Instrument Control Toolbox提供了 MATLAB與儀器儀表通信的功能 ,它支持 GPIB 通用接口總線 、VISA、TCP/ IP、UDP、RS2232等多個協議 ,具有同步和異步讀寫功能以
及事件處理和回調操作功能,可讀寫和記錄二進制和ASCII文本數據。與串口有關的主要函數如下[3]:
(1)建立串口對象函數:obj=seril(’port’,’property name’,propertyvalue……),其中主要的屬性有:baudrate(波特率),databits(數據位),parity(校驗方式),
stopbits(終止位)等,可以在初始化時進行賦值或者使用set函數。 (2)打開串口設備對象:fopen(obj) (3)串口讀寫操作:當matlab通信數據采用二進制格式時,讀寫串口設備的命令為fread()和fwrite();當通行數據采用文本(ASCII)格式時,讀寫串口設備的命令為fscanf()和
fprintf()。 (4)關閉並清除設備對象: Fclose(obj);%關閉串口設備對象 Delete(obj);%刪除內存中的串口設備對象
基於本系統串口通信協議,對串口對象的讀寫部分程序如下(簡單例程),查詢方式
Obj=serial(’com1’,’baudrate’,9600,’parity’,’none’,’databits’,8,’stopbits’,1);%初始化串口 Fopen(obj);%打開串口對象 Fwrite(obj,256);%向串口發送握手信號0xff TMP=fread(obj,3,’unit8’);%從串口讀取3字節數據,后2個即是16bit溫度數據 If TMP(1)= =256 %判斷第一個字節受否是握手信號 For i = 1:3 Dat(i)=TMP(i+1);%剔除第一個握手信號字節 End End Fclose(obj);%關閉串口設備對象 Delete(obj);%刪除內存中的串口設備對象
2.中斷方式通信
參考:http://blog.sina.com.cn/s/blog_62de76a90100fhbw.html
從Matlab6.0版本開始,Mathworks公司在軟件中增加了設備控制箱(instrument control toolbox),提供了對RS-232/RS-485通信標准串口通信正式支持。利用該工具箱serial類及instrcallback()回調函數,能可靠地進行實時串地通信。為此,筆者充分結合單片機和Matlab優點,基於事件驅動中斷通信機制,提出了一種Matlab環境下PC機與單片機實時串行通信數據處理方法,極大地簡化開發流程,提高了系統開發效率。另外,與目前普遍采用基於Matlab查詢方式下非實時串行通信技術相比,這種方法實用性也大大增強了
在Matlab6.0中新增設備控制工具條(instrument control toolbox)用來負責上、下位機之間通信。該設備控制工具箱特色如下:
①支持基於串行接口(RS-232、RS-422、RS-485)、GPIB總線(IEEE2488、HPIB標准)、VISA總線通信;
②通信數據支持二進制和文本(ASCII)兩種方式,文本方式支持SCPI(Standard Commands for Programmable Instruments)語言;
③支持異步通信和同步通信;
④支持基於事件驅動通信。
從以上Matlab設備控制工具箱特點可以看到,Matlab完全可以滿足我們實現串行通信要求。
3.1 Matlab對串行口控制基礎知識
Matlab對串行口編程控制主要分為四個步驟。
①創建串口設備對象並設置其屬性。
scom=serial(‘com1’);%創建串口1設備對象scom
scom.Terminator=’CR’;%設置終止符為CR(回車符),缺省為LF(換行符)
scom.InputBufferSize=1024;%輸入緩沖區為256B,缺省值為512B
scom.OutputBufferSize=1024;%輸出緩沖區為256B,缺省值為512B
scom.Timeout=0.5;%Y設置一次讀或寫操作最大完成時間為0.5s,缺省值為10s
s.ReadAsyncMode=’continuous’(缺省方式);%在異步通信模式方式下,讀取串口數據采用連續接收數據(continuous)缺省方式,那么下位機返回數據會自動地存入輸入緩沖區中.
注意:在些屬性只有在對象沒有被打開時才能改變其值,如InputBufferSize、OutputBufferSize屬性等。對於一個RS-232/RS-422/RS-485串口設備對象,其屬性缺省值為波特率9 600b/s,異步方式,通信數據格式為8位數據位,無奇偶校驗位,1位停止位。如果要設置串口設置對象屬性值與缺省值屬性值相同,用戶可以不用另行設置。
另外,設置串口設置對象屬性也可以用一條指令完成,如:scom=serial(‘COM1’,’BaudRate’,38400,’Parity’,’none’,’DataBits’,8,’StopBits’,1)。也可以用set命令,如set(scom,’BaudRate’,19200,’Parity’,’even’)。創建了對象后可以在Matlab命令窗口直接敲對象名並回車,看到其基本屬性和當前狀態。若需要知道其全部屬性,可以用get(scom)命令。
②打開串口設備對象。
fopen(scom);
③讀寫串口操作。初始化並打開串口調協對象之后,現在可以對串口設備對象進行讀寫操作,串口讀寫操作支持二進制和文本(ASCII)兩種方式。當Matlab通信數據采用西方(ASCII)方式時,讀寫串口設備命令分別是fscanf、fpritf;當Matlab通信數據采用二進制方式時,讀寫串口設備命令分別是fread、fwrite。下面以文本方式讀寫串口為例:
a.讀串口。A=fscanf(scom,’%d’,[10,100];%從串口設備對象scom中讀入10*100個數據填充到數組A[10,100]中,並以整型數據格式存放。PCbfans.cn提示請看下圖:Matlab環境下PC與單片機的串行通信及數據處理 - huzoy - mylearning
h.寫串口。Fprintf(scom,’%s’,’RS232’,’async’);%將字符串‘RS232?’以字符數據格式寫入到串口設備scom,寫操作以異步方式進行。
④關閉並清除設備對象。
fclose(scom);%關閉串口設備對象
delete(scom);%刪除內存中串口設備對象
clear scom; %清除工作空間中串口設備對象
當不再使用該串口設備對象時,順序使用以上3條命令,可以將所創建串口對象對象清除,以免占用系統資源。
可以看出,在Matlab中進行串行通信是十分方便,編程較為簡單。而且,在Matlab中串行通信失誤率很低,通信較為可靠,也可以采用增加握手信號以及數據校驗等方式進一步增加通信可靠性。
3.2 Matlab實現串行通信軟件設計
在Matlab環境下,讀取串口數據方式可以分為兩種—查詢和中斷。以查詢方式進行串行通信時,如下位單片機有大量數據分時分批傳送給PC機,就需要不停查詢串行口緩沖區,有數據就讀取;雖然編程容易,但這樣做不能對數據進行實時處理,系統實時性不高,而且會極大地占用系統資源。以中斷方式對串口進行控制實現串行通信,就可以實時處理下位機傳送數據;但編程相對復雜一些,需要采用Matlab事件和回調函數機制。
(1)基於Matlab查詢方式異步串行通信編程
Matlab查詢方式串行通信編程雖然簡單,但這種方法在實際應用中實用價值不高,下面只作簡單介紹。通信源程序如下:
clc;%初始化串口設備對象,設置串口屬性為:PC機com2口,輸入緩沖區為1024,讀寫最大完成時間為0.6s,波特率為115 200b/s,1位停止位,遇到換行符中止,硬件流控制
g=serial(‘com2’);
g.InputBufferSize=4096;
g.timeout=0.6;
g.BaudRate=115200;
g.Parity=’none’;
g.StopBits=1;
g.Terminator=’LF’;
g.FlowControl=’hardware’;
fopen(g);%打開串口設備對象s
fwrite(g,255);%以二進制方式發送握手信號0xFF,缺省為異步通信方式
out=fread(g,33,’uint8’)%接收單片機發送33個數據(8位),並存入out數組中
%釋放串口設備對象
fclose(g);
delete(g);
clear g;
(2)基於Matlab中斷方式實時串行通信編程
在Matlab環境下以中斷方式進行串行通信,實際上是采用事件驅動方法實現。Matlab提供了instrcallback(obj,event)回調函數,用戶根據需要可以自行設置具體串行通信事件。Matlab常用串行口通信中斷事件有:緩沖區有指定字節數目數據可用事件(bytes-available event)、串口接收到數據長時間處於非激活狀態事件(break-interrupt event)、串行口引腳狀態改變事件(pin-status event)、輸出緩沖區為空事件(output empty event)等。當串口上有監視事件發生時,Matlab會自動調用回調函數進行通信事件處理。因此,事件驅動實質上是一種中斷機制,而回調函數實質上相當於一個中斷服務子程序。Matlab端實時串行通信程序流程如圖4所示。以下是具體編程步驟。
①建立一個串行通信主程序:serial.m文件,在主程序中進行串口設備初始化操作,並指定回調函數中串行通信事件。
程序主要源代碼如下(創建串口設備對象、設備串口設備屬性及打開串口等初始化操作代碼與前述查詢方式下初始化代碼相同):
%設置回調函數觸發事件—當串口緩沖區中有33字節數據時,觸發中斷事件,此后主程序自動調用instrcallback(obj,event)回調函數
g.BytesAvaibleFcnMode=’byte’;%中斷觸發事件為‘bytes-available Event’
g.BytesAvailableFcnCount=33;%接收緩沖區每收到33個字節時,觸發回調函數
g.BytesAvailableFcn=@instrcallback;%得到回調函數句柄
fopen(g);%連接串口設備對象
fwrite(g,255);%寫串口,發送握手信號0xFF(等價於十進制下數值255)
②修改instrcallback(obj,event)回調函數,對所發生串口通信事件進行處理。
Matlab缺省回調函數instrcallback(obj,event)存在於instrcallback.m文件中。該文件實際上是一個有待於用戶修改程序模塊。其中只有一些最基本程序代碼,能夠顯示導致串口中斷發生是哪一類事件,中斷事件所發生時間以及導致事件發生對象名等信息(修改回調函數文件時,注意要取消文件中相應信息后分號,才能夠在Matlab命令窗口(command window)中將這些信息顯示出來)。中斷發生后通信事件處理以及通信數據分析處理任務,需要用戶自行添加相應服務程序代碼。
PCbfans.cn提示請看下圖:Matlab環境下PC與單片機的串行通信及數據處理 - huzoy - mylearning
Matlab安裝目標下有兩個instrcallback.m文件,我們只需要修改@instrument目錄下instrcallback.m文件即可。當然,在修改instrcallback.m文件之前,最好對其做一個備份。另外,需要注意是:程序調試過程中如果再次修改了該回調函數,要重新啟動Matlab配置該文件,才能使得新回調函數文件生效。
修改后instrcallback.m文件見網站www.dpj.com.cn。該修改后回調函數能夠完成如下任務:
①實時接收單片機實時5ms發送33個串行通信數據,其中包括1個握手信號和32個A/D轉換數據(這些數據是PIC單片機系統采集到傳感器信號,每個數據占1字節),並存儲在out數組中;
②對接收到數據進行處理,由於PIC單片機A/D轉換值為10位,占2字節,而單片機每次只能傳送1個字節數據,故將收到每兩個通信數據整合成為1個真實A/D轉換數據,共16個A/D轉換數據,並存儲在Dataout數組中;
③將接收到串口數據存儲到serialdata.txt文件中,將整合后單片機A/D轉換數據存儲到一個以中斷事件發生時間為文件名txt文件中;
④根據A/D轉換數據,利用Matlab求其最大值、最小值和平均值,並利用FIR濾波器對傳感器信號A/D轉換值作FIR濾波處理,得到窗格為5滑動濾波平均值;
⑤利用Matlab中plot()函數實時繪制單片機采集到傳感器信號原始波形圖和FIR濾波后波形圖,如圖5所示,可以看到經過FIR濾波后傳感器動態信號值較為穩定,精度大幅提高。
實驗證明,基於Matlab中斷方式PC機與單片機實時串行通信穩定可靠,處理數據方便,編程簡單,開發效率大大提高。
4 結論
本文介紹基於Matlab環境下PC機與PIC單片機串行通信實現方法,利用MatlabInstrument Control Tollboxserial類及instrcallback()回調函數,實現基於事件驅動實時中斷通信。使開發人員可以充分利用Matlab工具箱中現有函數,方便地實現串行通信、數據分析處理和圖形顯示,大大簡化系統上位機軟件編程工作量。
