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 详细描述的替代方法,您始终可以将变量内容写入文件并在代码的其他部分读取它们。