我在Matlab中有一个功能,它从硬件中获取连续的传感器值。它在新值可用时给出一个标志,我们可以更新包含这些值的变量。以下是模拟此函数正在执行的操作的虚函数。
function example( )
% Example function to describe functionality of NatNetOptiTrack
% Hardware initialization,
% Retriving real time information continuously
for i = 1:100 %in real time this loop runs for ever
data = rand(3,6);
% Send the updated data to gui in each iteration
end
end
我使用指南做了一个gui,如图所示:
因此要显示的数据是3x6矩阵,其中列对应于X Y Z Roll Pitch和Yaw值,而行对应于Objects。
我想在gui上显示此函数的持续更新值。有没有办法可以在我的示例函数中初始化gui并使用循环内的句柄更新输出值。我尝试将示例函数中的gui代码复制为脚本,它能够初始化但无法识别句柄。 我还想在按下按钮时在命令窗口显示当前值。
由于
答案 0 :(得分:2)
如果启动GUI然后运行该功能,您应该能够获得GUI上控件的句柄,前提是您可以使GUI图形句柄可见并将其标记/名称设置为适当的值。在GUIDE中,打开GUI的Property Inspector并将 HandleVisibility 属性设置为 on ,将 Tag 属性设置为 MyGui (或其他名称)。然后在example.m
文件中执行以下操作
function example( )
% Example function to describe functionality of NatNetOptiTrack
% get the handle of the GUI
hGui = findobj('Tag','MyGui');
if ~isempty(hGui)
% get the handles to the controls of the GUI
handles = guidata(hGui);
else
handles = [];
end
% Hardware initialization,
% Retriving real time information continuously
for i = 1:100 %in real time this loop runs for ever
data = rand(3,6);
% update the GUI controls
if ~isempty(handles)
% update the controls
% set(handles.yaw,…);
% etc.
end
% make sure that the GUI is refreshed with new content
drawnow();
end
end
另一种方法是将example
功能代码复制到GUI中 - 硬件初始化可能发生在GUI的_OpeningFcn
中,您可以创建一个(周期性)定时器来与硬件进行通信,获取要在GUI上显示的数据。
对于在按下GUI按钮时显示当前数据,您可以通过使用fprintf
将GUI控件的内容写入命令行/窗口来轻松完成此操作。您将需要使example
函数可中断,以便按钮可以中断连续运行的循环。你可以通过在循环的每次迭代结束时添加pause
调用(一定的毫秒数)来执行此操作,或者只使用上面的drawnow
调用(这就是为什么我把它放在if
语句之外 - 这样它就会在循环的每次迭代中被调用。
尝试以上操作,看看会发生什么!