基于MATLAB GUI界面的串口小助手


将单片机传感器采集到的数据直接输入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平台设计的串口助手,目前已实现发送指令、接收相应数据、绘制图像、保存数据等功能。后面将进一步完善,将数据分析可视化展示。

  • 7
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大强强小强强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值