序
将单片机传感器采集到的数据直接输入MATLAB进行运算分析,不仅适合仿真,在实际测试中,也能提高调试效率。
一、简介
本文搭建的串口助手具体用于四旋翼多轴传感器数据的采集,能够发送、收集和保存数据,控制单片机只发送加速度计、陀螺仪或者磁力计的三轴数据,并对传来的数据进行绘制。
GUI界面设计主要分为两个部分,一是拖入组件,设置参数;二是编辑m文件,其实就是为组件编写回调函数。在满足必要功能的前提下追求简洁美观,即内外兼修。
二、步骤
1.创建一个空白GUI界面
在MATLAB命令窗输入guide,在弹出的界面中选择Blank GUI(Default)。
2.拖入组件,进行搭建
左侧工具栏为可选组件,鼠标放在某个组件上会有组件描述,选择需要的组件拖入工作区即可。本文串口界面如下:
双击组件,修改组件参数,主要修改Tag、String两个参数。String和Tag可以说都代表组件的名字,String在可视化界面显示,Tag在回调函数中发挥作用。Tag并非必须要改(静态文本可不修改),但是赋予每个组件ID,而不是pushputton1、pushbutton2…,可以防止写回调函数时混乱,也显得比较专业。
几点提示:
1)利用工作区上方工具栏中"串"工具,可以调整各组件相对位置。
2)想要GUI界面多一点控件,点击工作区上方工具栏中Toolbar Editor,可以选择添加。或者一键变为常见figure界面,点击Property Inspector或者GUI界面双击工作区空白地方,ToolBar选项选择figure。
3)GUI界面实现最大最小化,一种方法是:GUI界面Tools->GUI Options->Resize behavior,选择Proportional->OK!
下面简单列几个组件的设置,看图说话^ ^
多图预警!!!
也可以自己调整组件颜色、字体颜色、大小等,比较简单,不再赘述。
3.编辑m文件
GUI界面返回的m文件即是GUI界面的灵魂所在。刚开始接触GUI界面时,看着满是注释的函数一筹莫展,这都啥玩意儿!!!
但是!一旦悟到它的本质,编写起来可谓行云流水(好8,还是会因为某些逻辑问题步履蹒跚)。在m文件中,我们要做的就是编写各组件的回调函数,并实现组件间的“通信”。回调函数决定了这个组件能够实现的功能,通过鼠标点击等行为触发;各组件通过句柄函数(handles.Tag)进行参数传递,set是设置,get是获取。如果某个值需要在多个组件的回调函数中调用,可以将该值设为全局变量,需在每个回调函数中提前声明。
m文件开头有OpeningFcn函数,可以认为它是在启动GUI界面时实现对界面的初始化。本文OpeningFcn函数如下:
function SerialGUI2_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 SerialGUI2 (see VARARGIN)
% Choose default command line output for SerialGUI2
handles.output = hObject;
% handles structure with handles and user data (see GUIDATA)
global port
global baud
global datbit
global stobit
global parit
scoms = instrfind; %读取所有存在的端口
if ~isempty(scoms)
stopasync(scoms);
fclose(scoms);
delete(scoms); %停止并且删除串口对象
end
fsom = instrhwinfo('serial');
port = cell2mat(fsom.SerialPorts);
baud = 115200;
datbit = 8;
stobit = 1;
parit = 'None';
set(handles.serialcom,'String',port);
set(handles.Baud,'Value',5);
set(handles.databit,'Value',4);
set(handles.stopbit,'Value',1);
set(handles.parity,'Value',1);
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes SerialGUI2 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
为节省篇幅,现列出部分关键组件回调函数。
1)打开/关闭串口按钮:
% --- Executes on button press in openserial.
function openserial_Callback(hObject, eventdata, handles)
% hObject handle to openserial (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global scom
global go
str1 = get(handles.openserial,'String');
if(iscell(str1))
str = str1{1};
else
str = str1;
end
if str == '打开串口'
global port
global baud
global datbit
global stobit
global parit
scom = serial(port);
scom.InputBufferSize = 2000; %设置好缓冲区空间,足够最多一次指令返回数据的存储
scom.timeout = 0.1;
scom.BaudRate = baud
scom.DataBits = datbit
scom.Parity = parit
scom.StopBits = stobit
scom.ByteOrder = 'bigEndian';
fopen(scom); %打开串口设备对象
fprintf("open serial success");
set(handles.openserial,'String','关闭串口');
go = 1;
elseif str == '关闭串口'
go = 0;
set(handles.openserial,'String','打开串口');
display(scom);
fclose(scom);
delete(scom);
fprintf("close serial success");
end
2)发送数据按钮:
% --- Executes on button press in datasend.
function datasend_Callback(hObject, eventdata, handles)
% hObject handle to datasend (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global sdata
global scom
data1 = get(handles.SenDataAera,'String');
if(iscell(data1))
sdata = data1{1};
else
sdata = data1;
end
if sdata == 'acc'
set(handles.SenDataAera,'String',sdata);
fwrite(scom,'01');
elseif sdata == 'gyro'
set(handles.SenDataAera,'String',sdata);
fwrite(scom,'02');
elseif sdata == 'mag'
set(handles.SenDataAera,'String',sdata);
fwrite(scom,'03');
else
fwrite(scom,sdata);
end
3)接收数据按钮
% --- Executes on button press in datareceive.
function datareceive_Callback(hObject, eventdata, handles)
% hObject handle to datareceive (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global scom
global rdata
global go
global Rdata
i = 0;
rdata = [];
while 1
if go
rdata1 = fscanf(scom,'String'); %接收数据
if ~isempty(rdata1)
i = i + 1;
rdata = [rdata; str2num(rdata1)];
Rdata = rdata;
set(handles.RecDataArea,'String',num2str(rdata));
end
pause(0.01)
else
fprintf("over");
break
end
end
本文工程下载地址:https://download.csdn.net/download/weixin_41869763/13781154,需积分
总结
本文介绍了基于MATLAB GUI平台设计的串口助手,目前已实现发送指令、接收相应数据、绘制图像、保存数据等功能。后面将进一步完善,将数据分析可视化展示。