【问题标题】:Can't access handles from a function无法从函数访问句柄
【发布时间】:2014-01-31 10:22:38
【问题描述】:

我正在尝试使用 GUIDE 创建一个 GUI,它通过串行通信读取字符串。之后,它会删除所需的数字并将其放在屏幕上。我创建了这个函数,每次COM口缓冲区有一行数据时执行:

function out = intcon1(hObject, eventdata, handles)
global comPort;
a=fgetl(comPort);
disp(a);

a(a==' ') = '';
indexstart=strfind(a,'[');
indexend=strfind(a,']');
measureddata=a(indexstart(1):indexend(1));
commas=strfind(measureddata,',');

re1data=measureddata(2:(commas(1)-1));
re2data=measureddata((commas(1)+1):(commas(2)-1));
im1data=measureddata((commas(2)+1):(commas(3)-1));
im2data=measureddata((commas(3)+1):(commas(4)-1));
temp1data=measureddata((commas(4)+1):(commas(5)-1));
temp2data=measureddata((commas(5)+1):(commas(6)-1));

old_str=get(handle.re1, 'String');
new_str=strvcat(old_str, re1data);
set(handles.listbox8, 'String', re1data);

现在我正在尝试将数据放入列表框中。这只是第一个值。问题是,Matlab 一直在说,没有定义句柄。但我已经使用以下代码创建了一个清除列表框的按钮:

function clearlists_Callback(hObject, eventdata, handles)
% hObject    handle to clearlists (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.listbox8, 'String', '');

有谁知道问题是什么以及如何解决?

【问题讨论】:

  • 这是使用BytesAvailableFcn的串口回调吗?如果是这样,您期望的参数完全错误。
  • 是的,它正在使用 BytesAvailableFCN。那么参数应该是什么?
  • 你能贴出创建串行对象并定义 BytesAvailableFCN 的代码吗?

标签: matlab matlab-guide handles


【解决方案1】:

Serial port callbacksGUIDE callbacks 不同。在串行端口回调的情况下,您的对象句柄是串行端口对象,并且事件是串行事件。没有第三个参数,因此 handles 未定义。

如果你想从这个函数中检索你的 GUI 句柄,你需要明确地这样做,类似于你检索 comport 句柄的方式 - 顺便说一下,以这种方式获取 comport 可能是不必要的,因为我'会想象它与回调已经收到的对象是 hObject 相同的对象。

由于在这种情况下handlesGUIDE-specific data,因此检索它的“正确”方式 应该是:

handles = guidata(gcf);

如果您的 GUI 有多个图形,您可能需要使用 findobj() 而不是 gcf() 来获得正确的图形。

【讨论】:

  • 好的。但是如何为句柄定义一个全局变量呢?根据Matlab,列表框的句柄不能定义为全局或复制到全局变量。
  • @bdvd 抱歉,我对 GUIDE 已经多年没有碰过它有点生疏了 - 我已经检查了文档并相应地更新了答案。
【解决方案2】:

你可能使用函数句柄语法定义了你的 BytesAvailableFCN,没有额外的参数,像这样

s.BytesAvailableFCN = @myfun();

相反,您需要使用元胞数组定义回调,如here in the documentation 所述。例如,

s.BytesAvailableFCN = {'myFun', handles};

handles 在运行该行时必须已经定义并在您的工作区中。

【讨论】:

  • 感谢您的帮助。这就是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多