matlab检测串口数据帧头,MATLAB 串口读取姿态数据及GUI实时动态显示设计
上一篇實現了Matlab 對串口數據的讀取,數據可以讀取并且保存到本地。本文主要設計GUI并且動態的顯示曲線。可以更直觀的觀察實時的姿態數據和傳感器數據。
GUI設計效果:
姿態GUi.png
分別設置三個區域,分別為數據接收顯示區域,串口設置區域和區域顯示區域。
串口參數設置與上一篇基本一直,只是將串口號和波特率設置為全局變量。matlab GUI 編程可以看其他教程,主要調用函數參數與hObject,eventdata,handles。
hObject 和handles 都可以設置相應的空間的性能,但是區別在于hObject只是一個局部變量,而handles 相當于一個全局變量。當要在函數中設置另外控件的性能,只能調用handles。
參數設置區域
參數設置區域主要實現的是串口的選擇和波特率的設置。GUI上通過下拉菜單選擇。在相應空間的callback 函數中添加初始化代碼:
COM callback 函數設置
% --- Executes on selection change in ppcom.
function ppcom_Callback(hObject, eventdata, handles)
% hObject handle to ppcom (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns ppcom contents as cell array
% contents{get(hObject,'Value')} returns selected item from ppcom
global COM;
val=get(hObject,'value');
switch val
case 1
COM='COM1';
fprintf('ceshi_COM=1\n');
case 2
COM='COM2';
case 3
COM='COM3';
case 4
COM='COM4';
case 5
COM='COM5';
case 6
COM='COM6';
case 7
COM='COM7';
case 8
COM='COM8';
case 9
COM='COM9';
end
波特率callback 函數設置
function ppbandrate_Callback(hObject, eventdata, handles)
% hObject handle to ppbandrate (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns ppbandrate contents as cell array
% contents{get(hObject,'Value')} returns selected item from ppbandrate
global rate;
val=get(hObject,'value');
switch val
case 1
rate=9600;
case 2
rate=19200;
case 3
rate=38400;
case 4
rate=115200;
end
打開串口:
function activityReco_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to activityReco (see VARARGIN)
global COM;
global rate;
global act a;
global count;
global act_data t;
global p x;
count=1;x=-15;
act=zeros(12,1);
t=0;
p = plot(t,act,...
'EraseMode','background','MarkerSize',5);
% axis([x x+20 -200 200]);
% grid(handles.axplotact,'on');
set(handles.axplotact,'XLim',[x x+20],'YLim',[-200 200]);
set(handles.axplotact,'XTickLabel',[]);
legendaxes=legend(handles.axplotact,{'Yaw','Pitch','Roll','Accx','Accy','Accz','GYROx','GYROy','GYROz','Magx','Magy','Magz'},1);
set(legendaxes,'Location','northeastoutside');
act_data=[]; a=[];
COM='COM5'
rate = 115200;
set(handles.ppcom,'value', 5);
set(handles.ppbandrate,'value',4);
set(handles.pbcloseserial,'Enable','off');
% Choose default command line output for activityReco
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
關閉串口:
function pbcloseserial_Callback(hObject, eventdata, handles)
% hObject handle to pbcloseserial (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global s;
fclose(s);
delete(s);
set(handles.pbcloseserial,'Enable','on');
set(handles.pbopenserial,'Enable','off');
fprintf('close com');
串口參數設置部分基本與上一篇博客一致,有問題可以對照理解。
姿態數據動態顯示
姿態和傳感器數據總共12位。具有不同的單位,為了顯示效果,特地將各個數據歸一在[-200,200]的范圍顯示,整體實現單線程串行顯示。這里實現動態顯示的方法是背景擦除方法。
姿態gui2.png
【源方法】
t=[0]
m=[sin(t);cos(t)]
p = plot(t,m,...
'EraseMode','background','MarkerSize',5);%%定義數據種類,因此t和m不能為空
x=-1.5*pi; %坐標初始設置小于數據起始位置,任意設置
axis([x x+2*pi -1.5 1.5]); %繪圖坐標設置,橫坐標設置為x的參數
grid on;
for i=1:1000
t=[t 0.1*i]; %Matrix 1*(i+1)
m=[m [sin(0.1*i);cos(0.1*i)]]; %Matrix 2*(i+1)
set(p(1),'XData',t,'YData',m(1,:))
set(p(2),'XData',t,'YData',m(2,:))
drawnow
x=x+0.1;
axis([x x+2*pi -1.5 1.5]);
pause(0.5);
end
這里我用的是采用背景擦除的方法,顯示動態的曲線,并且動態改變坐標系。整體思路是顯示的橫坐標t和縱坐標act_data只存儲400個數據,當大于400 ,則刪除前端數據保持整體為400個。然后每次解算則顯示一次。
function ReceiveCallback( obj,event,handles) %創建中斷響應函數
global s a fid;
global count;
global act;
global act_data;
global t x p;
str = fread(s,100,'uint8');%讀取數據
hex=dec2hex(str);
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)
count=count+1;
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);
t=[t 0.1*count];
act=[act,[act_data(1:3);act_data(7:9)*100/16384;act_data(10:12)*pi/180;act_data(13:15)]];%%繪圖數據歸一化-200-200
set(handles.edshowdata,'string',num2str(act_data));
axis(handles.axplotact);
if ~get(handles.rbpause,'Value')
if get(handles.rbshowangles,'Value')
set(p(1),'XData',t,'YData',act(1,:));
set(p(2),'XData',t,'YData',act(2,:));
set(p(3),'XData',t,'YData',act(3,:));
end
if get(handles.rbshowacc,'Value')
set(p(4),'XData',t,'YData',act(4,:));
set(p(5),'XData',t,'YData',act(5,:));
set(p(6),'XData',t,'YData',act(6,:));
end
if get(handles.rbshowgyro,'Value')
set(p(7),'XData',t,'YData',act(7,:));
set(p(8),'XData',t,'YData',act(8,:));
set(p(9),'XData',t,'YData',act(9,:));
end
if get(handles.rbshowmag,'Value')
set(p(10),'XData',t,'YData',act(10,:));
set(p(11),'XData',t,'YData',act(11,:));
set(p(12),'XData',t,'YData',act(12,:));
end
drawnow
x=x+0.1;
set(handles.axplotact,'ytick',-200:50:200);
axis(handles.axplotact,[x x+20 -200 200]);
% set(handles.axplotact,'xtick',x:x+20);
if size(t,2) >400
t(1)=[];
act(:,1)=[];
end
end
end
% set(handles.edshowdata,'String',num2str(act));
Motion_data=[];IMU_data=[];
a(1:index_finish)=[];
j=1;
% pause(0.005);
end
else
j=j+1;
end
end
需要注意axes 和axis的區別,axes 是GUI控件名,axis用來設置figure的坐標。這里
axis(handles.axplotact);
是用來鎖定后面操作的對象,即后面幾個set函數都是對handles.axplotact進行設置,就不必要每個set前面都添加handles.axplotact了。drawnow用來繪制,使整個過程更流暢。下面留了兩個axes控件,用來實現三維傳感器空間位置顯示和相對坐標系解算的顯示。
【源代碼】上傳到github
總結
整體來說MATLAB GUI設計還是挺好入手,了解一點callback就能入手了。基本需要注意的函數為hObject 和handles,get和set(屬性獲取和設置)。暫時只是顯示數據,但是存在一點延時,還不確定是中斷和fread的問題還是單線程串行顯示的問題。后面打算實現三維空間顯示和地球三維坐標解算和顯示。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的matlab检测串口数据帧头,MATLAB 串口读取姿态数据及GUI实时动态显示设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学作图工具_科研论文作图系列-从PPT
- 下一篇: 安卓文本编辑器php cpp,开源的An