2014-03-21 3 views
0

Я использую fscanf для чтения данных из постоянного потока информации, поступающего с датчика, подключенного к ардуину, и для построения графика в реальном времени.Matlab, читающий сериал без паузы

Проблема заключается в том, что matlab занимает слишком много времени, чтобы построить живую информацию, и это связано с тем, что fscanf считывает последовательную информацию, а следующий вызов fscanf считывает следующие последовательные данные, а не тот, который в настоящее время отображается.

Я хотел бы знать, как я могу прочитать информацию последнее получил от последовательного порта, вместо следующего один. Любые идеи о том, как сделать показания более «реальными», будут очень полезными. Вот мой код:

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

Несколько комментариев/предложений:

1) Одна вещь, которая отсутствует в коде обновления индекса i в конце вашего while цикла.
2) Рассмотрите предварительное выделение пространства для «буфера построения» a и использование его в качестве кругового буфера для ускорения выполнения (так как оно равно a продолжает расти в размере неопределенно).
3) Попробуйте положить drawnow в конце цикла.
4) Попробуйте сделать set(s, 'InputBufferSize', 3) перед открытием последовательного порта.

Надеюсь, что эта помощь.

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 данные и оси ограничены каждый раз, оставьте их нетронутыми и просто измените метки меток (или просто полностью отказаться от ярлыков метки, не оставляя ничего для обновления, кроме данных y).

Смежные вопросы