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