Matlab Simulink set and refreshdata 功能
前言
matlab中与单片机进行交互时需要用到定时器timer,用它可以模拟单片机的定时器中断服务。在此基础上进行拓展,可用串口(serial)+定时器(timer)通过matlab实现上位机数据的实时显示等功能。进一步的,通过设置菜单,可以实现更为复杂的调试功能。一、set and refreshdata()
% set 可以用于很多地方,比如设置图形的相关属性,设置串口对象、定时器对象的相关属性等。在命令行输入 doc set ,回车就能看到关于set命令的官方help文档
% refreshdata() 作用:更新数据
% 拓展思路:通过这两个功能结合matlab的串口中断,可实现数据接收,接近实时显示
1.1命令行输入doc + set
doc set
显示结果如下: 蓝色表示相关的内容,红色表示具体信息(简要介绍、语法、描述、例子、技巧、等)
二、测试例子
例2.1 简单测试set 与 refreshdata()函数
%% 1、简单测试set 与 refreshdata()函数
figure
subplot(2,1,1);
index = plot(dis_data,'b');
set(index,'YDataSource','dis_data');
subplot(2,1,2);
dis_data =[1 1 1 1 1 1 1 1 1 1] ;
index2 = plot(dis_data,'r');
set(index2,'YDataSource','dis_data');
refreshdata(index)
运行结果
运行到refreshdata(index) 这一句之前打断点,数据显示为:
运行后结果为:
可以看出 ,第一行图的数据已被更新
例2.2 将set与refreshdata结合,借助队列数据结构,实现数据读入并更新
%% 2、将set与refreshdata结合,借助队列数据结构,实现数据读入并更新
global run_flag %运行状态
run_flag = 1;
%初始化句柄
figure
index = plot(dis_data,'b');
%使用set设置数据从dis_data中获取,否则无法及时刷新数据
set(index,'YDataSource','dis_data');
global update_num
update_num = 0;
global ccm
%指令提示
fprintf('0->exit\n');
fprintf('1->run\n');
ccm = input('input your ccm:');
while run_flag
switch ccm(1,1)
case 0
run_flag = 0;%退出程序
case 1
%循环刷新,显示
while update_num>=0
update_num = input('input a num:(input a num(<0) to exit current loop)');
refreshnum(update_num,10); %刷新数据
disp(dis_data); %命令行显示
refreshdata(index); %更新句柄,plot中的图像会更新
end
otherwise %指令提示
fprintf('0->exit\n');
fprintf('1->run\n');
end
if run_flag %系统运行,等待新指令
ccm = input('input your ccm:');
end
end
% 模拟队列,先进先出,更新dis_data的内容
function refreshnum(a,num)
global dis_data
for i = num : -1 : 1
if i == 1
dis_data(i) = a;
else
dis_data(i) = dis_data(i-1);
end
end
end
运行结果,没有数据输入时:
输入1,进入运行模式,依次输入 100,90 ,80,70,50,70,30,得如下结果:
再依次输入 20 ,20,20 ,20,结果为:
根据结果,说明数据随着输入的改变实时更新了。
输入负数,退出数据更新的循环。再输入0,退出程序。 当前程序只实现了大于等于0的功能,可以继续拓展,实现全实数域数字的更新,可选的一种方法是借助定时器+标志位。