我在matlab中设置了一个没有GUI的串行通信。
串行初始化看起来像这样(主程序):
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,handle)在GUI应用程序中的作用,但有没有办法在没有GUI的情况下做到这一点? 非常感谢,
答案 0 :(得分:1)
您想要查看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代替你的handles
结构和派生自handle
类以使其具有类似引用(即类似指针)的行为。虽然创建一个新类会更复杂,但它允许您将handles
对象传递给任何函数,而无需返回修改后的版本。您上面的代码可能会保持不变。
答案 1 :(得分:0)
作为@gnovice所描述的方法的替代方法,您总是可以将变量内容写入文件并在代码的其他部分中读取它们。