MATLAB计时器在函数内部的行为与在命令窗口中的行为不同

时间:2019-01-08 17:07:23

标签: matlab while-loop timer

我有一些代码可以从外部设备进行测量,并且我希望在设定的时间内进行测量。我需要记录测量值和时间戳,因此我将while循环放在计时器执行期间运行,条件是在计时器达到零时退出循环。

“ meter”变量是外部设备的句柄,与之对话不是问题。

问题在于,即使在函数“ Finished!”中,在函数中执行代码时,while循环也不会退出。方法成功显示。如果我在命令窗口中单独运行该代码,则该代码运行良好,并且该代码中没有其他计时器实例在运行,因此我不知道为什么会发生这种不同的行为。我会暂停一下以记录时间,但我想在10秒钟内获取尽可能多的读数,以免飞行。

fprintf('\nCollecting 10 s data from detector...');
i = 1;
t1 = timer('TimerFcn','stat=false; fprintf(''\nFinished!'')','StartDelay',10);
start(t1);
stat = true;
while(stat==true)
    Timestamps{i} = datetime('now');
    fprintf(meter,':READ?');
    Current(i) = str2num(fscanf(meter));
    i = i + 1;
end

有没有想到为什么在一个函数中这种行为可能会有所不同?

1 个答案:

答案 0 :(得分:4)

您的问题与variable scoping有关。在函数中运行代码时,变量stat存在于该函数的本地工作空间中,而不存在于基本工作空间(即“命令窗口”的工作空间)中。当您向计时器函数提供字符串回调时,该字符串中的代码将在基本工作空间中执行。因此,当您的计时器触发时,它将打印一条消息并修改基本工作区中的变量stat,但是本地函数工作区中的变量stat不变。

我更喜欢处理此问题的方法是为计时器回调创建一个nested function,嵌套在包含循环的较大函数中。例如:

function Current = collect_data(meter)

  fprintf('\nCollecting 10 s data from detector...');
  i = 1;
  t1 = timer('TimerFcn', @timer_callback, 'StartDelay', 10);
  start(t1);
  stat = true;

  while (stat == true)
    Timestamps{i} = datetime('now');
    fprintf(meter, ':READ?');
    Current(i) = str2num(fscanf(meter));
    i = i + 1;
  end

  function timer_callback(~, ~)
    stat = false;
    fprintf('\nFinished!');
  end

end

在这种情况下,变量stat在函数collect_datatimer_callback之间共享,并且当计时器触发时,循环按预期终止。