我正在使用fscanf来读取来自连接到arduino的传感器的恒定信息流中的数据,并将其绘制成实时图形。
问题是,matlab绘制实时信息的时间太长,这是因为fscanf读取了串行信息,下次调用fscanf会读取下一个串行数据,而不是当前正在显示的数据。
我想知道如何阅读从串口接收的最新信息,而不是 next 信息。关于如何使读数感觉更“实时”的任何想法都会非常有帮助。这是我的代码:
clear;
yThresh = 2.5;
delete(instrfindall);
s = serial('COM7', 'BaudRate', 57600);
fopen(s);
arq = fopen('dados.txt', 'w');
i = 1;
while ~feof(arq) %end of file
a(i, 1:3) = fscanf(s, '%f%f%f')
xValMax = i+20;
xValMin = max(1,i-20);
subplot(3,1,1);
plot( max(1,i-20):length(a(:,1)) , a(max(1,i-20):length(a(:,1)),1) );
title('AcelX','fontsize',13,'fontweight','bold');
xlabel('Tempo','fontsize',10,'fontweight','bold');
ylabel('AcelX','fontsize',10,'fontweight','bold');
axis([xValMin xValMax -yThresh yThresh])
end
答案 0 :(得分:0)
一些意见/建议:
1)代码中缺少的一件事是在i
循环结束时更新索引while
。
2)考虑为"绘图缓冲区预先分配空间" a
并将其用作循环缓冲区以加快执行速度(因为它a
无限期地不断增长)。
3)尝试在循环结束时放置drawnow
。
4)在打开串口之前尝试执行set(s, 'InputBufferSize', 3)
。
希望这些帮助。
答案 1 :(得分:0)
你的循环中发生的事情远比需要的要多得多 - 绘制一次然后更新数据要快得多,而不是每次都拆掉绘图并创建一个新的。
这是一个更有效的安排(在浏览器中组成,可能包含错误)的想法:
clear;
yThresh = 2.5;
delete(instrfindall);
s = serial('COM7', 'BaudRate', 57600);
fopen(s);
arq = fopen('dados.txt', 'w');
a = NaN(1,20);
x = -18:1;
subplot(3,1,1);
hline = plot(x, a);
haxes = gca;
title('AcelX','fontsize',13,'fontweight','bold');
xlabel('Tempo','fontsize',10,'fontweight','bold');
ylabel('AcelX','fontsize',10,'fontweight','bold');
axis([1 3 -yThresh yThresh]);
while ~feof(arq) %end of file
newdata = fscanf(s, '%f%f%f');
a = [a(2:end) newdata(1)];
x = x + 1;
% presumably you want to capture the data to that file at some point too?
set(hline, 'XData', x, 'YData', a);
xlim(haxes, [max(1,x(1)) x(end)]);
end
为了获得最大的更新速度,您可以通过欺骗x轴节省更多时间 - 而不是每次更改x数据和轴限制,保持不变,只需更改刻度标签(或者只是完全放弃刻度标签) ,没有任何更新,但y数据)。