matlab中instr,MATLAB 串口通信
matlab 串口編程
由于項目需要,用matlab 做了一個串口通信工具,也碰到不少坑。這里總結(jié)一下。
讀取串口數(shù)據(jù)
matlab 支持串口通信,因此直接調(diào)用串口的結(jié)構(gòu)體serial就可以,在調(diào)用之前,需要對串口屬性進(jìn)行設(shè)置。
delete(instrfindall) %%關(guān)閉沒用的,這句很重要
s=serial('COM5');%創(chuàng)建串口
set(s,'BauRate',115200); %設(shè)置波特率
set(s,'inputBufferSize',1024000) %設(shè)置輸入緩沖區(qū)域為1M
%串口事件回調(diào)設(shè)置
set(s,'BytesAvailabelFcnMode','bytes');%設(shè)置中斷響應(yīng)函數(shù)對象
set(s,'BytesAvailabelFcnCount',10);%設(shè)置終端觸發(fā)方式
s.BytesAvailabelFcn=@ReceiveCallback;%ReceiveCallback是中斷的觸發(fā)函數(shù),這里我是自定義的。系統(tǒng)的回調(diào)函數(shù)為instrcallback;
fopen(s);%打開串口
%data=fread(s)%讀取二進(jìn)制字節(jié) fwrite二進(jìn)制寫入 相應(yīng)文本用fscanf 和fpintf
%data %進(jìn)行數(shù)據(jù)處理
%fclose(s);
%delete(s);
%clear s;
以上的代碼是MATLAB 串口讀取的基本函數(shù),對串口操作的整個過程可以概括為:“設(shè)置串口參數(shù)”->"打開串口“->"讀取串口數(shù)據(jù)”->“關(guān)閉串口”。
串口通信方式選擇
serial 中斷方式參數(shù)為BytesAvailabelFcnMode,它的方式有Terminator 和bytes 兩種。Terminator 為查詢方式中斷方式。其值有“LR(換行符)” 和“CR(回車符)” 兩種。
查詢方式中斷
查詢方式中斷方式為Terminator,值有CR和LF兩個。查詢中斷的含義是在緩存區(qū)讀取數(shù)據(jù),當(dāng)讀取到存在CR和LF之后,觸發(fā)中斷,調(diào)用回調(diào)函數(shù)。查詢中斷簡單但不適用。具體例子可以看http://blog.sina.com.cn/s/blog_6163bdeb0102e8qc.html
set(s,'BytesAvailabelFcnMode','Termiator');% 查詢中斷
set(s,'Terminator','CR');%設(shè)置中斷方式
基于matlab 方式實(shí)時串行通信編程
matlab更多的采用的事事件驅(qū)動方法中斷。中斷參數(shù)為"bytes"。即按字節(jié)中斷。如設(shè)定緩存區(qū)域達(dá)到10個字節(jié),就觸發(fā)中斷,調(diào)用回調(diào)函數(shù),進(jìn)行處理。
set(s,'BytesAvailabelFcnMode','bytes');%設(shè)置中斷響應(yīng)函數(shù)對象
set(s,'BytesAvailabelFcnCount',10);%設(shè)置終端觸發(fā)方式
s.BytesAvailabelFcn=@ReceiveCallback;
我們可以對系統(tǒng)的instrcallback 函數(shù)進(jìn)行修改調(diào)用系統(tǒng)的回調(diào)函數(shù),但是系統(tǒng)的回調(diào)函數(shù)matlab 安裝包下,可以右鍵打開,或者直接用which 命令查找它的位置,另外我們也可以自己寫相應(yīng)的回掉函數(shù)。比如我這里自己定義回調(diào)函數(shù)ReceiceCallback。
function ReceiveCallback( obj,event) %創(chuàng)建中斷響應(yīng)函數(shù)
global s a fid;
str = fread(s);%讀取數(shù)據(jù)
% hex=dec2hex(str)
a=[];IMU_data = [];Motion_data=[];
sign_head1=hex2dec('A5');sign_head2 = hex2dec('5A');
sign_finish=hex2dec('AA');sign_IMU=hex2dec('A1');sign_Motion=hex2dec('A2');
a= [a;str];
j=1;
while (~isempty(a))
if j>size(a,1)
break;
end
if a(j)==sign_head1 && a(j+1) == sign_head2
if (j+a(j+2)+1) > size(a,1)
break;
end
index_start = j+2;
index_finish= index_start + a(j+2)-1;
pack = a(index_start:index_finish);
if ~isempty(pack) &&pack(pack(1))== sign_finish
if pack(2) == sign_IMU
IMU_data(1,:) = Get_IMU(pack);
j = index_finish;
continue;
end
if pack(2) ==sign_Motion
Motion_data(1,:) = Get_Motion(pack);
j = index_finish;
end
if ~isempty(IMU_data) && ~isempty(Motion_data)
act_data = [IMU_data,Motion_data]
fprintf(fid,'%8.1f%8.1f%8.1f%8.1f%8.1f%8.1f%8d%8d%8d%8d%8d%8d%8d%8d%8d\n',act_data);
Motion_data=[];IMU_data=[];
a(1:index_finish)=[];
j=1;
end
end
else
j=j+1;
end
end
end
回調(diào)函數(shù)包含兩個參數(shù),這個必須要,不能少。其中obj 是傳遞串口參數(shù)的。event暫時沒用到。這里回調(diào)函數(shù)是從還從去讀取二進(jìn)制數(shù)據(jù)。然后解算出姿態(tài)傳感器的姿態(tài)數(shù)據(jù)和傳感器數(shù)據(jù)。并且存到txt中。姿態(tài)上報數(shù)據(jù)格式為A5 5A 開頭,第三位為傳遞數(shù)據(jù)位(不包含A55A),第四位為A1/A2,A1。A1 表示的是姿態(tài)數(shù)據(jù),A2表示傳感器數(shù)據(jù)。數(shù)據(jù)以AA結(jié)尾。因此算法的思路是每次有姿態(tài)數(shù)據(jù)和傳感器數(shù)據(jù)然后就保存到文本中。
代碼已上傳到我的github
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的matlab中instr,MATLAB 串口通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web 前端 如何分享到instagra
- 下一篇: pta段错误是什么意思_用Python执