matlab检测串口数据帧头,MATLAB 串口读取姿态数据及GUI实时动态显示设计

上一篇实现了Matlab 对串口数据的读取,数据可以读取并且保存到本地。本文主要设计GUI并且动态的显示曲线。可以更直观的观察实时的姿态数据和传感器数据。

GUI设计效果:

6f22c8d35961

姿态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]的范围显示,整体实现单线程串行显示。这里实现动态显示的方法是背景擦除方法。

6f22c8d35961

姿态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的问题还是单线程串行显示的问题。后面打算实现三维空间显示和地球三维坐标解算和显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]面向对象的六大原则

现在编程的主流语言基本上都是面向对象的。如C#,C,JAVA。我们在使用时,已经构造了一个个的类。但是往往由于我们在类内部或外部的设计上存在种种问题,导致尽管是面向对象的语言,却是面向过程的逻辑,甚至维护…

上下文管理、redis发布订阅、RabbitMQ发布订阅、SQLAlchemy

一、上下文管理 import contextlib contextlib.contextmanager def work_state(state_list,worker_thread):state_list.append(worker_thread)try:yieldfinally:state_list.remove(worker_thread) free_list[] current_thread"alex" with work_state(free_list,curr…

JavaScript进阶(下)

指定分隔符连接数组元素join() join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。 语法&#xff1a; arrayObject.join(分隔符) 参数说明: 注意&#xff1a;返回一个字符串&#xff0c;该字符串把数组中的各个元素串起来&#xff0c;用<…

ongl 表达式

struts.xml简单配置 <!-- &#xff08;默认false&#xff09;设置ognl表达式是否支持静态方法 --><constant name"struts.ognl.allowStaticMethodAccess" value"true"></constant><package name"ognl" namespace"/ogn…

Python开发-- Lesson 2--Python数据类型(2016/07/30)

1、文件操作 python中对文件、文件夹&#xff08;文件操作函数&#xff09;的操作需要涉及到os模块和shutil模块。 得到当前工作目录&#xff0c;即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove(…

oracle什么是重复组,规范化:“重复组”是什么意思?

扬帆大鱼英语的价值一次又一次地重复。这是重复组吗&#xff1f;不。在SUBJECT_MODULE中英语的多次出现不是重复组&#xff0c;甚至不是人们误认为重复组的两件事中的任何一个。它们也不是冗余或缺乏规范化的证据。这样的多个外观可能与冗余或规范化有关&#xff0c;但是在没有…

清除浮动php,CSS清除浮动

今天看到一篇文章关于清除浮动的&#xff0c;突然间脑袋短路了&#xff0c;咦&#xff1f;为什么要清除浮动&#xff1f;原谅我的无知&#xff0c;搜了下原来是这样&#xff0c;又倒腾出原来的笔记&#xff0c;唉&#xff0c;本来就有记录啊&#xff0c;而且也会经常用到&#…

Linux下使用Speedtest测试网速

导读Speedtest是用来测试网络性能的开源软件&#xff0c;在Linux下面安装Speedtest可以用来测试网络出口的上传和下载速度&#xff0c;帮助排查网络方面导致的故障。Speedtest介绍由于公司几个项目用户访问的时候响应较慢&#xff0c;项目本身没问题&#xff0c;服务及调用的接…

iOS开发ARC内存管理

本文的主要内容&#xff1a; ARC的本质ARC的开启与关闭ARC的修饰符ARC与BlockARC与Toll-Free BridgingARC的本质 ARC是编译器&#xff08;时&#xff09;特性&#xff0c;而不是运行时特性&#xff0c;更不是垃圾回收器(GC)。 Automatic Reference Counting (ARC) is a compile…

php 实时查看公众号加粉数据,公众号实时涨粉数据怎么查看

公众号文章发布后如何查看涨粉效果&#xff1f;怎么根据发文情况来调整公众号运营方向呢&#xff1f;这款能监控实时涨粉数据的我们在进行公众号运营时&#xff0c;除了是简单的写文、排版、推送&#xff0c;还需要通过优质的内容不断吸引新用户快速发展新用户&#xff0c;将公…

iOS - UITextField

前言 NS_CLASS_AVAILABLE_IOS(2_0) interface UITextField : UIControl <UITextInput, NSCoding>available(iOS 2.0, *) public class UITextField : UIControl, UITextInput, NSCoding 1、UITextField 的创建 Objective-C // 实例化 UITextField 对象UITextFi…

微信php翻译和天气预报整合,微信公众平台天气预报功能开发

本来是想自己直接从中国天气网获取信息并处理&#xff0c;后来发现处理起来太麻烦&#xff0c;而且要获取所有城市的城市编码&#xff0c;再有就是&#xff01;不支持国外天气&#xff01;&#xff01;(我们学校有很多毕业生在国外上学&#xff0c;所以我考虑还是做出支持国外天…

关于Jenkins找不到依赖Jar包问题

昨晚在Jenkins发布时遇到一个Jar包找不到的问题&#xff0c;控制台的报错信息如下&#xff1a; 说白了就是找不到依赖的Jar包&#xff0c;但是当我们回退到灰度的时候发现灰度的环境是构建是没有问题的&#xff0c;为什么同一套代码在两个环境却有天壤之别呢&#xff0c;本着试…

VBS基础篇 - Dictionary对象

VBS基础篇 - Dictionary对象 Dictionary是存储数据键和项目对的对象&#xff0c;其主要属性有Count、Item、Key&#xff0c;主要方法有Add、Exists、Items、Keys、Remove、RemoveAll。 建立字典 Dim Dict : Set Dict CreateObject("Scripting.Dictionary")添加键值对…

linux编译mesa,如何在Ubuntu 16.04,17.10中安装Mesa 17.3.3

最新的MESA 3D图形库17.3.3现在在Ubuntu-X team PPA存储库中为Ubuntu 16.04和Ubuntu 17.10提供。Mesa 17.3.3实现了OpenGL 4.5 API&#xff0c;但由glGetString(GL_VERSION)或glGetIntegerv(GL_MAJOR_VERSION)/glGetIntegerv(GL_MINOR_VERSION)报告的版本取决于所使用的特定驱动…

iOS开发Swift篇—(三)字符串和数据类型

一、字符串 字符串是String类型的数据&#xff0c;用双引号""包住文字内容 let website "http://www.github.com" 1.字符串的常见操作 &#xff08;1&#xff09;用加号 做字符串拼接 let scheme "http://" let path “www.github.com” le…

linux查看xml文件的配置,3、kvm虚拟机日常管理与配置

KVM虚拟机的管理主要是通过virsh命令对虚拟机进行管理。1. 查看KVM虚拟机配置文件及运行状态(1) KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/autostart目录是配置kvm虚拟机开机自启动目录。(2) virsh命令帮助# virsh -help或直接virsh命令和&#xff0c;再执行子命令。如下…

linux桌面环境是什么意思,Linux 黑话解释:什么是桌面环境?

在桌面 Linux 世界中&#xff0c;最常用的术语之一就是 桌面环境(Desktop Environment)(DE)。如果你是 Linux 的新手&#xff0c;你应该了解一下这个经常使用的术语。什么是 Linux 中的桌面环境?桌面环境是一个组件的组合体&#xff0c;为你提供常见的 图形用户界面(graphical…

Hadoop 2.5.1集群安装配置

本文的安装只涉及了hadoop-common、hadoop-hdfs、hadoop-mapreduce和hadoop-yarn&#xff0c;并不包含HBase、Hive和Pig等。 http://blog.csdn.net/aquester/article/details/24621005 1. 规划 1.1. 机器列表 NameNode SecondaryNameNode DataNodes 172.16.0.100 172.16.0.…

ubuntu14.04 x86编译upx 3.92 及so加固

的参考文章&#xff1a; http://www.cnblogs.com/fishou/p/4202061.html 1.download upx和所依赖的组件 upx3.92&#xff1a;https://www.pysol.org:4443/hg/upx.hg/archive/tip.tar.gzLZMA4.43&#xff1a;http://nchc.dl.sourceforge.net/project/sevenzip/LZMA%20SDK/4.43/l…