MATLAB - 在没有guidata的情况下在回调和主程序之间传输变量
MATLAB - transfer variables between callback and main program without guidata
我在没有 GUI 的 matlab 中设置串行通信。
串行初始化如下所示(主程序):
handles.s = serial('COM10' ,'BaudRate', 9600);
set(handles.s,'Terminator','CR');
set(handles.s,'Timeout',1);
set(handles.s, 'BytesAvailableFcnMode', 'byte');
set(handles.s, 'BytesAvailableFcnCount', 1);
set(handles.s, 'BytesAvailableFcn', {@serialEventHandler, handles});
fopen(handles.s);
我正在使用回调函数 (serialEventHandler) 读取缓冲区
function serialEventHandler(serialConnection, ~, handles)
bytes = get(serialConnection, 'BytesAvailable');
if(bytes > 0 ) % we may have alread read the data
handles.data = fscanf(serialConnection)
% fwrite(handles.appenderFile, handles.data); (not relevant here)
end
end
出于某种原因,回调没有更新我的句柄结构,我无法访问主代码的串行数据。我知道这是 guidata(hobject, handles) 在 GUI 应用程序中的作用,但是有没有办法在没有 GUI 的情况下做到这一点?
非常感谢,
您需要查看 Sharing Data Between Workspaces 的文档。其中两个选项应该适合您,具体取决于 serialEventHandler
相对于您的主要代码的位置:
对于单独文件中的函数: 您将需要使用 global
变量在它们之间共享您的 handles
结构。在您的主程序中:
global handles
%... Initialize handles ...
set(handles.s, 'BytesAvailableFcn', @serialEventHandler); % Don't have to pass it
并且在 serialEventHandler
中:
function serialEventHandler(serialConnection, ~) % Don't have to pass it
global handles
%... Rest of code ...
end
对于同一文件中的函数:您可以nest one function inside the other,允许它们共享对变量的访问而不必将它们作为输入传递或输出参数:
function main
%... Initialize handles ...
set(handles.s, 'BytesAvailableFcn', @serialEventHandler); % Don't have to pass it
%... Rest of main code ...
function serialEventHandler(serialConnection, ~) % Don't have to pass it
%... serialEventHandler code ...
end
end
还有第三种选择(上面关于共享数据的文档中没有提到),但实施起来可能需要做更多的工作:Creating your own class to use in place of your handles
structure and deriving from the handle
class 给它类似参考(即类似指针的)行为。虽然创建一个新的 class 会更加复杂,但它允许您将 handles
对象传递给任何函数而无需 return 修改版本。您上面的代码可能会保持不变。
作为@gnovice 详细描述的替代方法,您始终可以将变量内容写入文件并在代码的其他部分读取它们。
我在没有 GUI 的 matlab 中设置串行通信。
串行初始化如下所示(主程序):
handles.s = serial('COM10' ,'BaudRate', 9600);
set(handles.s,'Terminator','CR');
set(handles.s,'Timeout',1);
set(handles.s, 'BytesAvailableFcnMode', 'byte');
set(handles.s, 'BytesAvailableFcnCount', 1);
set(handles.s, 'BytesAvailableFcn', {@serialEventHandler, handles});
fopen(handles.s);
我正在使用回调函数 (serialEventHandler) 读取缓冲区
function serialEventHandler(serialConnection, ~, handles)
bytes = get(serialConnection, 'BytesAvailable');
if(bytes > 0 ) % we may have alread read the data
handles.data = fscanf(serialConnection)
% fwrite(handles.appenderFile, handles.data); (not relevant here)
end
end
出于某种原因,回调没有更新我的句柄结构,我无法访问主代码的串行数据。我知道这是 guidata(hobject, handles) 在 GUI 应用程序中的作用,但是有没有办法在没有 GUI 的情况下做到这一点? 非常感谢,
您需要查看 Sharing Data Between Workspaces 的文档。其中两个选项应该适合您,具体取决于 serialEventHandler
相对于您的主要代码的位置:
对于单独文件中的函数: 您将需要使用
global
变量在它们之间共享您的handles
结构。在您的主程序中:global handles %... Initialize handles ... set(handles.s, 'BytesAvailableFcn', @serialEventHandler); % Don't have to pass it
并且在
serialEventHandler
中:function serialEventHandler(serialConnection, ~) % Don't have to pass it global handles %... Rest of code ... end
对于同一文件中的函数:您可以nest one function inside the other,允许它们共享对变量的访问而不必将它们作为输入传递或输出参数:
function main %... Initialize handles ... set(handles.s, 'BytesAvailableFcn', @serialEventHandler); % Don't have to pass it %... Rest of main code ... function serialEventHandler(serialConnection, ~) % Don't have to pass it %... serialEventHandler code ... end end
还有第三种选择(上面关于共享数据的文档中没有提到),但实施起来可能需要做更多的工作:Creating your own class to use in place of your handles
structure and deriving from the handle
class 给它类似参考(即类似指针的)行为。虽然创建一个新的 class 会更加复杂,但它允许您将 handles
对象传递给任何函数而无需 return 修改版本。您上面的代码可能会保持不变。
作为@gnovice 详细描述的替代方法,您始终可以将变量内容写入文件并在代码的其他部分读取它们。