2014-09-02 2 views
0

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

while (get(serial, 'BytesAvailable')~=0) 
    storeAndPlot() 
end 

но программа не может выполнять другие задачи в то же время.

В этом question они используют таймер для указания задержки в секундах между выполнением функции. Это может быть решение с использованием короткого периода, например 0,1, для вызова функции getDataFromSerialFunction() и обновления графика.

Есть ли какая-то функция обратного вызова для вызова, как только данные доступны из сериала?

+1

ну, я ничего не знаю о серийном; но, возможно, использование функции change-change-listener может помочь-> [undocumented_matlab: property-value-change-listener] (http://undocumentedmatlab.com/blog/property-value-change-listeners) –

+1

вы можете попробовать «пауза (0.1)» или втянуть внутри цикла while. Настройка слушателя была бы правильным способом сделать это, хотя. Если у вас есть панель сбора данных, см. [Здесь] (http://www.mathworks.com/help/daq/ref/dataavailable.html) для функции прослушивателя, которая может помочь. – Trogdor

+0

@LuciusDomitiusAhenobarbus, я почтительно не согласен: «pause (n) приостанавливает выполнение в течение n секунд, прежде чем продолжить, где n - любое неотрицательное действительное число». [источник] (http://www.mathworks.com/help/matlab/ref/pause.html) – Trogdor

ответ

1

ОК Я использовал объект таймера, как предлагается в этом question.

global timerXbee; 

% When the connect to serial button is pressed 
timerXbee = timer('ExecutionMode','FixedRate','Period',0.1,'TimerFcn',{@storeDataFromSerial}); 
start(timerXbee); 
% Polling 
fprintf(xbee,'M') ; 
disp ('Connection established.'); 

В функции обратного вызова

function storeDataFromSerial(obj,event,handles) 
    try 
     while (get(xbee, 'BytesAvailable')~=0 && tenzo == true) 
      % read until terminator 
      sentence = fscanf(xbee, '%s'); 
       %decodes "sentence" seperated (delimted) by commas 
       decode(sentence); 

       % Gets Magnetometer and Estimated Kalman estimated angles 
       Tdata = [ Tdata(2:end) ; theta ]; 
       Pdata = [ Pdata(2:end) ; pitch ]; 
       Ydata = [ Ydata(2:end) ; yaw ]; 
       EKXdata = [ EKXdata(2:end) ; kr ]; 
       EKYdata = [ EKYdata(2:end) ; kp ]; 
      end 
     end 
    end 
end 

Когда кнопка отключения нажимается просто остановить таймер и удалить его

stop(timerXbee); 
delete(timerXbee); 

Rock & Ролл!

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