我有一些代码可以从外部设备进行测量,并且我希望在设定的时间内进行测量。我需要记录测量值和时间戳,因此我将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
有没有想到为什么在一个函数中这种行为可能会有所不同?
答案 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_data
和timer_callback
之间共享,并且当计时器触发时,循环按预期终止。