我创建了一个自动通过串口读取数据的接口,因此我实现了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);
答案 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
声明回调时传递的结构。
有几种方法可以正确获取此值,但我会给出其中两种:
在streamData_fastTrak
回调函数中,直接从uicontrol查询按钮状态(而不是检查保存的值)
handles.butt_state = get(get(handles.uipanel2,'SelectedObject'), 'tag');
这样您就可以确保获得单选按钮的最新状态。
appdata
每次更改按钮状态时,都会将值存储在某处,但是当您的回调想要执行时,仍然需要查询此值。保存值的好地方在appdata
(使用setappdata
和getappdata
访问)。
所以在你的按钮回调中:
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 ...