BytesAvailableFcn回调未接收更新的句柄

时间:2015-04-09 08:47:51

标签: callback serial-port matlab-guide handles

我创建了一个自动通过串口读取数据的接口,因此我实现了BytesAvailableFcn回调的原因

handles.fileID.BytesAvailableFcnMode = 'terminator';
handles.fileID.BytesAvailableFcn = {@streamData_fastTrak, handles};

读取的数据显示在用户选择的表格中(通过使用GUI中的单选按钮)。选择选项时,会发生回调以将选定的单选按钮保存到保存在句柄结构中的变量。我已经按照程序步骤进行了步骤,我确信这个回调确实发生了,并且保存了变量。但是,当串行回调发生时,句柄结构仍然具有旧的选项值。

这是串行回调代码:

function handles = streamData_fastTrak(hObject, eventdata, handles)

handles.num = handles.num + 1;

%receive data through serial
line = transpose(fscanf(handles.fileID, ' %f ' ));
table_data = get(handles.uitable1, 'data');
table_data_style = get(handles.uitable4, 'data');

display(handles.butt_state);
display(handles.num);

if(fix(line(1)) == 1 && strcmp(handles.butt_state, 'style_button'))

    table_data_style(handles.select_Indices(1), 2:(length(line)+1)) = num2cell(line);
    set(handles.uitable4, 'data', table_data_style);
    display(handles.select_Indices);

elseif(fix(line(1)) > 1 && strcmp(handles.butt_state, 'stat_button'))

    table_data(line(1)-1, 1:length(line)) = num2cell(line);
    set(handles.uitable1, 'data', table_data);

    if(line(1) == countStates(handles))
        streamSensor_1_2_3(hObject, handles);
        handles.time_step = handles.time_step + 1;
    end
end

单选按钮回调:

function uipanel2_SelectionChangeFcn(hObject, eventdata, handles)

handles.butt_state =  get(get(handles.uipanel2,'SelectedObject'), 'tag');
display(handles.butt_state);
guidata(hObject, handles);

2 个答案:

答案 0 :(得分:0)

我认为有两种方法可以解决问题:

第一种方式(我不建议第二种方式)是将您想要更新的数据传递给字符串控件,并通过串口功能将其读回。

我建议的另一种方法是包含一个带回调的虚拟按钮,调用

handles.fileID.BytesAvailableFcn = {@streamData_fastTrak, handles};

再次 - 这将更新新的"句柄"数据到回调函数

例如

假设带有标签PB1的虚拟按钮

function handles = streamData_fastTrak(hObject, eventdata, handles)

%% do stuff here

%% update handles data

PB1_Callback (handles.PB1,event,dat)

guidata(handles.PB1,handles) %% function ends


%% dummy button callback function%%
function PB1_Callback(hObject,event,handles)

handles.fileID.BytesAvailableFcn = {@streamData_fastTrak, handles};

guidata(hObject,handles) %% dummy button function ends

您可以通过使按钮的背景颜色与UI的背景颜色相同来使虚拟按钮不可见。

答案 1 :(得分:0)

首次为行中的ByteAvailableFcn声明回调函数时:

handles.fileID.BytesAvailableFcn = {@streamData_fastTrak, handles};

Matlab为事件分配函数句柄,并在此时传递handles结构 。现在,冻结进入回调的私有工作空间。如果您稍后在代码中更改handles结构(就像您尝试附加变量handles.butt_state时那样),则回调不知道它,它仍使用handles声明回调时传递的结构。

有几种方法可以正确获取此值,但我会给出其中两种:

1)在需要时从单选按钮获取值

streamData_fastTrak回调函数中,直接从uicontrol查询按钮状态(而不是检查保存的值)

handles.butt_state =  get(get(handles.uipanel2,'SelectedObject'), 'tag');

这样您就可以确保获得单选按钮的最新状态。

2)将值存储在appdata

每次更改按钮状态时,都会将值存储在某处,但是当您的回调想要执行时,仍然需要查询此值。保存值的好地方在appdata(使用setappdatagetappdata访问)。 所以在你的按钮回调中:

function uipanel2_SelectionChangeFcn(hObject, eventdata, handles)
   butt_state =  get(get(handles.uipanel2,'SelectedObject'), 'tag');
   setappdata(handles.uipanel2, 'butt_state' , butt_state );
   display(butt_state);

在您的streamData_fastTrak回调中:

function handles = streamData_fastTrak(hObject, eventdata, handles)
   butt_state = getappdata(handles.uipanel2, 'butt_state' );
   %// and the rest of your code ...