Matlab读取序列而不会暂停

时间:2014-03-21 19:16:00

标签: matlab serialization

我正在使用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

2 个答案:

答案 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数据)。