源码在这下载:https://github.com/luckypm/matlab-serial-GUI
最近为了方便监控IMU的地磁传感器(HMC5983)数据,用matlab的GUI做了一个简易的串口助手,可实时显示地磁传感器X Y Z三轴的数据,并动态的显示曲线图。

*1. 串口助手的GUI图如下:

[外链图片转存失败(img-7ZddnqFF-1565794912664)(http://i.imgur.com/A6btBmB.jpg)]

*2. 连接串口后的数据图如下(绘图时可勾选要显示的数据):

[外链图片转存失败(img-72ARahkP-1565794912665)(http://i.imgur.com/jG1MQ0A.jpg)]

*3. 我所使用的串口发送的数据格式是

sprintf(buff,"%8f %8f %8f\n",IMU_MAGX,IMU_MAGY,IMU_MAGZ);

*4. 现将最主要的“打开串口”按钮回调函数和串口的回调函数分享出来:

"打开串口"按钮的callback函数:

function open_serial_Callback(hObject, eventdata, handles)
%   【打开/关闭串口】按钮的回调函数
%% 定义一些全局变量并初始化
global XData; %定义一全局变量,坐标轴X轴的数据
global YData1;%坐标轴IMU_MAGX的数据
global YData2;%坐标轴IMU_MAGY的数据
global YData3;%坐标轴IMU_MAGZ的数据
global Xlim;%坐标轴X轴的范围
global L1;%用来存储IMU_MAGX线的句柄
global L2;%用来存储IMU_MAGY线的句柄
global L3;%用来存储IMU_MAGZ线的句柄
global Checkbox_x;%用来判定是否选中了IMU_MAGX复选框
global Checkbox_y;%用来判定是否选中了IMU_MAGY复选框
global Checkbox_z;%用来判定是否选中了IMU_MAGZ复选框
Checkbox_x = 0;%初始化为未选中
Checkbox_y = 0;
Checkbox_z = 0;
XData = 0;%初始化坐标轴的数据为0
YData1 = 0;
YData2 = 0;
YData3 = 0;
Xlim = 0;%打开串口,并初始化相关参数
%% 若按下【打开串口】按钮,打开串口
if get(hObject,'value')
%% 获取串口的端口名
com_n = sprintf('com%d', get(handles.com, 'value'));%% 获取波特率
rates = [9600 38400 115200];
baud_rate = rates(get(handles.baudrate, 'value'));
%% 获取校验位设置
switch get(handles.jiaoyan, 'value')
case 1
jiaoyan = 'none';
case 2
jiaoyan = 'odd';
case 3
jiaoyan = 'even';
end
%% 获取数据位个数
data_bits = 5 + get(handles.data_bit, 'value');
%% 获取停止位个数
stop_bits = get(handles.stop_bit, 'value');
%% 创建串口对象
scom = serial(com_n);
%% 配置串口属性,指定其回调函数
set(scom, 'BaudRate', baud_rate, 'Parity', jiaoyan, 'DataBits',...
data_bits, 'StopBits', stop_bits,...
'BytesAvailableFcnMode', 'Terminator', 'BytesAvailableFcn', {@my_callback, handles});
%% 将串口对象的句柄作为用户数据,存入窗口对象
set(handles.figure1, 'UserData', scom);
%% 尝试打开串口
try
fopen(scom);  %打开串口
catch   % 若串口打开失败,提示“串口不可获得!”
msgbox('串口不可获得!');
set(hObject, 'value', 0);  %弹起本按钮
return;
end
%% 能够打开串口后,设定绘图的相关属性
if get(handles.checkbox1,'value')
Checkbox_x = 1;
L1 = plot(handles.axes,XData,YData1,'r','EraseMode','none','MarkerSize',5);
hold on;
end
if get(handles.checkbox2,'value')
Checkbox_y = 1;
L2 = plot(handles.axes,XData,YData2,'b','EraseMode','none','MarkerSize',5);
hold on;
end
if get(handles.checkbox3,'value')
Checkbox_z = 1;
L3 = plot(handles.axes,XData,YData3,'m','EraseMode','none','MarkerSize',5);
end
set(handles.axes,'XLim',[Xlim-400 Xlim+100],'YLim',[-2 +2]);%设定坐标轴的范围
grid on; %绘出网格
%% 设定其它按钮的属性
set(handles.pause_start,'enable','on');
set(hObject,'string','关闭串口');
set(handles.lamb,'backgroundcolor','g');else %若关闭串口
%% 删除line对象
Linehandle = get(gca,'children');%获取坐标轴的子对象的句柄
delete(Linehandle);
%% 停止并删除串口对象
scoms = instrfind;
fclose(scoms);
delete(scoms);
set(hObject,'string','打开串口');
set(handles.lamb,'backgroundcolor','r');
set(handles.pause_start,'enable','off');
set(handles.pause_start,'string','暂停显示');
set(handles.pause_start,'value',0);end

串口的回调函数:

function my_callback(obj,~,handles)
%   串口的BytesAvailableFcn回调函数
%% 定义一些全局变量global XData;global YData1;global YData2;global YData3;global Xlim;global L1;global L2;global L3;global Checkbox_x;global Checkbox_y;global Checkbox_z;
%% 每运行一次本函数X轴的数据+1Xlim = Xlim+1;XData =[XData Xlim];%% 接收串口发送过来的数据(这里有时会出现BUG,具体原因不详)outdata = fscanf(obj);%接收串口发来的ASII数据,串口发过来的数据是字符串“IMU_MAGX IMU_MAGY IMU_MAGZ ”YData = str2num(outdata);%将字符串转化成数值类型YData1 = [YData1 YData(:,1)];%存储IMU_MAGX的数据YData2 = [YData2 YData(:,2)];%存储IMU_MAGY的数据YData3 = [YData3 YData(:,3)];%存储IMU_MAGZ的数据
%% 限定坐标轴X Y的数组长度不能超过500,防止数据过多时易导致内存消耗过大卡死if (length(XData)) > 500XData = XData(:,2:end);%数组长度一旦超过500就丢弃第1列的值endif (length(YData1)) > 500YData1 = YData1(:,2:end);endif (length(YData2)) > 500YData2 = YData2(:,2:end);endif (length(YData3)) > 500YData3 = YData3(:,2:end);end
%% 通过判定勾选的复选框的值来更新相应Y轴坐标的数据
if (~get(handles.pause_start,'value'))%如果点击了暂停显示,是停止更新Y轴的数据if Checkbox_xset(L1,'Xdata',XData,'YData',YData1);endif Checkbox_yset(L2,'Xdata',XData,'YData',YData2);endif Checkbox_zset(L3,'Xdata',XData,'YData',YData3);end
end
%% 求出Y轴数据的最小最大值min_1 = min(YData1(:));min_2 = min(YData2(:));min_3 = min(YData3(:));max_1 = max(YData1(:));max_2 = max(YData2(:));max_3 = max(YData3(:));
%% 通过判定复选框的勾选值来采用相应的最小最大值,并求出整个Y轴数据的最小最大值if Checkbox_x && Checkbox_y && Checkbox_zmin_array = [min_1 min_2 min_3];max_array = [max_1 max_2 max_3];elseif Checkbox_x && Checkbox_ymin_array = [min_1 min_2];max_array = [max_1 max_2]; elseif Checkbox_y && Checkbox_zmin_array = [min_2 min_3];max_array = [max_2 max_3]; elseif Checkbox_xmin_array = min_1;max_array = max_1;elseif Checkbox_ymin_array = min_2;max_array = max_2;elseif Checkbox_zmin_array = min_3;max_array = max_3;elsemin_array = -2 + 0.2;max_array = 2 + 0.2;endmin_all = min(min_array);max_all = max(max_array);
%% 更新坐标轴范围
if (~get(handles.pause_start,'value'))%如果点击了暂停显示,是停止更新坐标轴范围set(handles.axes,'XLim',[Xlim-400 Xlim+100],'YLim',[min_all-0.2  max_all+0.2]);
end
%% 将数值数据格式化成字符串IMU_MAGX = sprintf('%f',YData(:,1));IMU_MAGY = sprintf('%f',YData(:,2));IMU_MAGZ = sprintf('%f',YData(:,3));%% 显示接收的字符串
if (~get(handles.pause_start,'value'))set(handles.display_x,'string',IMU_MAGX);set(handles.display_y,'string',IMU_MAGY);set(handles.display_z,'string',IMU_MAGZ);
end

*5. 为方便大家阅读,我对代码进行了详细的注释,希望对有需要的人有所帮助;另我这代码写得并不简洁,希望大家能优化改进

参考书籍:《MATLAB GUI设计学习手记》罗华飞著

用matlab实时读取串口数据并动态显示曲线相关推荐

  1. matlab读取串口数据并显示曲线

    matlab程序读取单片机通过串口传来的IMU角度数据,并用曲线显示出来. 上传的值为float型,每个数据后有回车符.范围90~-90 主文件 serial_test2.m %% clc;globa ...

  2. Android(Linux)实时监控串口数据

    之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...

  3. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中

    MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...

  4. 如何在QT中读取串口数据

    总是能在别人的博客中学到太多太多,谢谢各位对知识的无私共享,谢谢大家 前言 去年我使用Qt编写串口通信程序时,将自己的学习过程写成了教程(Qt编写串口通信程序全程图文讲解),但是由于时间等原因,我只实 ...

  5. python串口通信_python 读取串口数据的示例

    python3 读取串口数据 demo 最近在写一个demo,zigbee串口连接树莓派,树莓派使用串口通信接受zigbee穿过来得值.其中我是用的树莓派是3代B+,zigbee每隔三秒钟从串口输出数 ...

  6. web前端读取串口数据

    来自扫码枪应用适配的经验及扩展. 查了好多资料,发现实现思路不外乎以下几种: 1.使用服务端开发语言开发一个读取串口数据的本地服务模块,并实现websocket长连接支持,前端开启长连接到该服务,根据 ...

  7. Java读取串口数据

    本文主要实现读取员工刷卡信息 将淘宝买的刷卡IC卡读取器插入Windows笔记本的USB接口,安装驱动,设备管理器会自动添加一个模拟的COM3串口 本次使用的Java环境为 java version ...

  8. java 读取串口数据

    串口资料 链接:https://pan.baidu.com/s/1jVO47WF7pCO6kDLezsBZ0g 提取码:hgwn 这段时间遇到了读取串口数据的需求,吭哧吭哧搞了两三天才搞出来,惭愧,所 ...

  9. RXTXcomm.jar 读取串口数据时报 Underlying input stream returned zero bytes 异常解决方法

    RXTXcomm.jar 读取串口数据时报 Underlying input stream returned zero bytes 异常解决方法 一.示例程序 1.依赖 2.示例代码 3.测试读取文件 ...

最新文章

  1. OpenCV双目稠密匹配BM算法源代码详细解析
  2. 我理解的配置管理系统
  3. 【数据结构与算法-1】常用数据结构
  4. 找规律 百度之星资格赛 1001 大搬家
  5. oracle数据提交不上去,oracle数据库命令窗口执行了语句但是没有提交会有什么影响吗...
  6. .NET和Android解压缩处理
  7. C++从vector中删除指定元素
  8. 著名开源项目_著名开源项目案例研究
  9. 关于团队项目的一些感想——刘宇翔
  10. 【洛谷习题】填涂颜色
  11. Unity代码里的Position和界面上的Position
  12. linux 安装docker
  13. Qt OpenGL加载OBJ模型
  14. Shopee面试问题整理
  15. python selenium爬虫 不打开网页 不打开浏览器
  16. uniapp轻松集成极光推送自定义消息+通知 Android极光 IOS极光 两行代码集成极光SDK
  17. [1304]求圆的周长和面积(Java)
  18. Redis的应用场景
  19. 中国最大的500家外商投资企业
  20. python爬取微博数据存入数据库_Python爬取微博数据并存入mysql,excel中

热门文章

  1. [iOS @2x @3x pt px 分辨率]
  2. 所有的伟大,源于一个勇敢的开始
  3. Shell 编程入门(一)
  4. 炸裂,AI 打造了一个西部世界!
  5. 《西部世界》中“人工智能”之上的类人类嗅觉,初步实现了!
  6. 数据趣事之父亲节专辑
  7. 第六章函数,编写一个判断水仙花数的函数,从主函数输入正整数n,在主函数中调用判断水仙花数的函数,找出n以内所有的水仙花数。(水仙花数指3位数的各个数字的立方和等于这个三位数本身)。
  8. Windows CMD 黑客常用命令
  9. XML和JSON 已经常用的解析工具
  10. Kafka 的七年之痒