Matlab从串口实时绘制多个数据
我的应用程序通过ARDUINO UNO平台从传感器读取数据,然后通过串行端口读取我在MATLAB中需要的所有数据。现在我有3个数据要在同一个图形上实时绘制(数据、数据2、数据3) 我还使用在mathworks上找到的一些代码一次绘制一个数据,并对其进行了一些修改,这不适合我的项目 下面是我用来绘制其中一个数据的matlab代码:Matlab从串口实时绘制多个数据,matlab,plot,serial-port,arduino,Matlab,Plot,Serial Port,Arduino,我的应用程序通过ARDUINO UNO平台从传感器读取数据,然后通过串行端口读取我在MATLAB中需要的所有数据。现在我有3个数据要在同一个图形上实时绘制(数据、数据2、数据3) 我还使用在mathworks上找到的一些代码一次绘制一个数据,并对其进行了一些修改,这不适合我的项目 下面是我用来绘制其中一个数据的matlab代码: clear clc %User Defined Properties serialPort = 'COM7'; % define COM por
clear
clc
%User Defined Properties
serialPort = 'COM7'; % define COM port #
baudeRate = 115200;
plotTitle = 'Serial Data Log'; % plot title
xLabel = 'Elapsed Time (s)'; % x-axis label
yLabel = 'Data'; % y-axis label
plotGrid = 'on'; % 'off' to turn off grid
min = -200; % set y-min
max = 200; % set y-max
scrollWidth = 10; % display period in plot, plot entire data log if <= 0
delay = .01; % make sure sample faster than resolution
%Define Function Variables
time = 0;
data = 0;
data2 = 0;
data3 = 0;
count = 0;
%Set up Plot
plotGraph = plot(time,data,time,data2,time,data3);
title(plotTitle,'FontSize',25);
xlabel(xLabel,'FontSize',15);
ylabel(yLabel,'FontSize',15);
axis([0 10 min max]);
grid(plotGrid);
%Open Serial COM Port
s = serial(serialPort, 'BaudRate',baudeRate)
disp('Close Plot to End Session');
fopen(s);
tic
while ishandle(plotGraph) %Loop when Plot is Active
dat = fscanf(s,'%f'); %Read Data from Serial as Float
if(~isempty(dat) && isfloat(dat)) %Make sure Data Type is Correct
count = count + 1;
time(count) = toc; %Extract Elapsed Time
data(count) = dat(1); %Extract 1st Data Element
data2(count) = dat(2);
data3(count) = dat(3);
data(count);
data2(count);
data3(count);
%Set Axis according to Scroll Width
if(scrollWidth > 0)
set(plotGraph,'XData',time(time > time(count)-scrollWidth),'YData',data3(time > time(count)-scrollWidth));
%plot(time(time > time(count)-scrollWidth),data3(time > time(count)-scrollWidth));
axis([time(count)-scrollWidth time(count) min max]);
%set(plotGraph,'XData',time(time > time(count)-scrollWidth),'YData',data3(time > time(count)-scrollWidth));
%axis([time(count)-scrollWidth time(count) min max]);
else
set(plotGraph,'XData',time,'YData',data);
axis([0 time(count) min max]);
end
%Allow MATLAB to Update Plot
pause(delay);
end
end
%Close Serial COM Port and Delete useless Variables
fclose(s);
clear count dat delay max min baudRate plotGraph plotGrid plotTitle s ...
scrollWidth serialPort xLabel yLabel;
disp('Session Terminated...');
清除
clc
%用户定义属性
串行端口='COM7';%定义COM端口#
波特率=115200;
plotTitle='串行数据日志';%情节标题
xLabel=‘经过的时间’;%x轴标签
yLabel=‘数据’;%y轴标签
plotGrid='在';%上'“关闭”以关闭栅格
最小值=-200;%设置y-min
最大值=200;%设置y-max
滚动宽度=10;%在绘图中显示期间,如果为0,则绘制整个数据日志)
设置(绘图仪,'XData',时间(时间>时间(计数)-滚动宽度),'YData',数据3(时间>时间(计数)-滚动宽度));
%绘图(时间>时间(计数)-滚动宽度),数据3(时间>时间(计数)-滚动宽度);
轴([时间(计数)-滚动宽度时间(计数)最小值最大值];
%设置(绘图仪,'XData',时间(时间>时间(计数)-滚动宽度),'YData',数据3(时间>时间(计数)-滚动宽度));
%轴([时间(计数)-滚动宽度时间(计数)最小值最大值];
其他的
设置(绘图仪、‘扩展数据’、时间、‘YData’、数据);
轴([0时间(计数)最小-最大]);
结束
%允许MATLAB更新绘图
暂停(延迟);
结束
结束
%关闭串行COM端口并删除无用变量
fclose(s);;
清除计数数据延迟最大最小波特率绘图仪绘图仪栅格绘图仪标题。。。
scrollWidth串行端口xLabel yLabel;
disp('会话终止…');
我需要用不同的颜色在图形上绘制所有3个数据(数据、数据2、数据3)。请在这里帮助我。使用
line
函数在同一绘图上再创建一条线。从帮助->MatLab->图形->处理图形对象->高级与低级 如果再次调用line函数,MATLAB将在当前轴上绘制第二条线,而不会删除第一条线
只需使用以下命令:
plotGraph = plot(time(time > time(count) - scrollWidth), data(time > time(count) - scrollWidth),...
time(time > time(count) - scrollWidth), data2(time > time(count) - scrollWidth),...
time(time > time(count) - scrollWidth),data3(time > time(count) - scrollWidth));
grid on;
axis([time(count) - scrollWidth time(count) min max]);
实际上,我在我的一个项目中使用了与您相同的源代码。如果您仍然需要帮助,这里是我用来绘制加速度计三条数据线的代码的修改版本。它情节优美。但是,由于执行fscanf()所需的时间,如果不进行混叠,则无法以每50毫秒左右的速度实时获取和绘制信号
clear
clc
%User Defined Properties
serialPort = 'COM7'; % define COM port #
plotTitle = 'Serial Data Log'; % plot title
xLabel = 'Elapsed Time (s)'; % x-axis label
yLabel = 'Acceleration'; % y-axis label
plotGrid = 'on'; % 'off' to turn off grid
min = -1.5; % set y-min
max = 2.5; % set y-max
scrollWidth = 10; % display period in plot, plot entire data log if <= 0
delay = .0000001; % make sure sample faster than resolution
%Define Function Variables
time = 0;
data = zeros(3,1);
count = 0;
%Set up Plot
plotGraph = plot(time,data(1,:),'-r',...
'LineWidth',2,...
'MarkerFaceColor','w',...
'MarkerSize',2);
hold on
plotGraph1 = plot(time,data(2,:),'-m',...
'LineWidth',1,...
'MarkerFaceColor','w',...
'MarkerSize',2);
hold on
plotGraph2 = plot(time,data(3,:),'-b',...
'LineWidth',1,...
'MarkerFaceColor','w',...
'MarkerSize',2);
title(plotTitle,'FontSize',25);
xlabel(xLabel,'FontSize',15);
ylabel(yLabel,'FontSize',15);
axis([0 10 min max]);
grid(plotGrid);
%Open Serial COM Port
s = serial(serialPort, 'BaudRate', 115200)
disp('Close Plot to End Session');
fopen(s);
tic
while ishandle(plotGraph) && ishandle(plotGraph2) && ishandle(plotGraph1) %Loop when Plot is Active
dat = fscanf(s,'%f'); %Read Data from Serial as Float
if(~isempty(dat) && isfloat(dat)) %Make sure Data Type is Correct
count = count + 1;
time(count) = toc; %Extract Elapsed Time in seconds
data(:,count) = dat(:,1); %Extract 1st Data Element
%Set Axis according to Scroll Width
if(scrollWidth > 0)
set(plotGraph,'XData',time(time > time(count)-scrollWidth),...
'YData', data(3,time > time(count)-scrollWidth));
set(plotGraph1,'XData',time(time > time(count)-scrollWidth),...
'YData', data(2,time > time(count)-scrollWidth));
set(plotGraph2,'XData',time(time > time(count)-scrollWidth),...
'YData', data(1,time > time(count)-scrollWidth));
axis([time(count)-scrollWidth time(count) min max]);
else
set(plotGraph,'XData',time,'YData',data(3,:));
set(plotGraph1,'XData',time,'YData',data(2,:));
set(plotGraph2,'XData',time,'YData',data(1,:));
axis([0 time(count) min max]);
end
%Allow MATLAB to Update Plot
pause(delay);
end
end
%Close Serial COM Port and Delete useless Variables
fclose(s);
clear count dat delay max min plotGraph plotGraph1 plotGraph2 plotGrid...
plotTitle s scrollWidth serialPort xLabel yLabel;
disp('Session Terminated');
prompt = 'Export Data? [Y/N]: ';
str = input(prompt,'s');
if str == 'Y' || strcmp(str, ' Y') || str == 'y' || strcmp(str, ' y')
%export data
csvwrite('accelData.txt',data);
type accelData.txt;
else
end
clear str prompt;
清除
clc
%用户定义属性
串行端口='COM7';%定义COM端口#
plotTitle='串行数据日志';%情节标题
xLabel=‘经过的时间’;%x轴标签
yLabel=‘加速度’;%y轴标签
plotGrid='在';%上'“关闭”以关闭栅格
最小值=-1.5;%设置y-min
最大值=2.5;%设置y-max
滚动宽度=10;%在绘图中显示期间,如果为0,则绘制整个数据日志)
设置(绘图仪,'XData',时间(时间>时间(计数)-滚动宽度),。。。
“YData”,数据(3,时间>时间(计数)-滚动宽度);
设置(绘图1,'XData',时间(时间>时间(计数)-滚动宽度),。。。
“YData”,数据(2,时间>时间(计数)-滚动宽度);
设置(绘图2、'XData',时间(时间>时间(计数)-滚动宽度),。。。
“YData”,数据(1,时间>时间(计数)-滚动宽度);
轴([时间(计数)-滚动宽度时间(计数)最小值最大值];
其他的
设置(绘图仪,'XData',时间,'YData',数据(3,:);
设置(绘图1,'XData',时间,'YData',数据(2,:);
设置(绘图2、'XData',时间、'YData',数据(1,:);
轴([0时间(计数)最小-最大]);
结束
%允许MATLAB更新绘图
暂停(延迟);
结束
结束
%关闭串行COM端口并删除无用变量
fclose(s);;
清除计数数据延迟最大最小绘图仪绘图仪绘图仪1绘图仪2绘图仪栅格。。。
plotTitle s scrollWidth serialPort xLabel yLabel;
disp(“会话终止”);
prompt='导出数据?[Y/N]:';
str=输入(提示,'s');
如果str='Y'| | strcmp(str,'Y')| | str='Y'| | strcmp(str,'Y'))
%导出数据
csvwrite('accelData.txt',data);
输入accelData.txt;
其他的
结束
str提示清晰;
请先尝试按住
。另外,请查看并关注X/Y/Z/Data
。保持不动不动代码中的输入格式是什么?加速计的三轴值。