MATLAB - 在没有guidata的情况下在回调和主程序之间传输变量

时间:2017-06-22 15:16:51

标签: matlab callback serial-communication

我在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的情况下做到这一点? 非常感谢,

2 个答案:

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