MATLAB gui 在新图形而不是指定轴中绘制数据

MATLAB gui plots the data in a new figure instead of specified axes

我正在开发一个 MATLAB GUI,它应该获取串行数据并在处理后绘制它。我用 bytesavailabefcn 当预先指定的字节数 (bytesavailablefcncount) 可用时执行的回调函数。

代码运行良好,获取串口数据。但是当使用 plotyy 绘制数据时,它会打开一个新图形并在其上绘制数据,而不是在 GUI 中绘制并标记为 axes1 的轴上绘制数据。我用axes(handles.axes1)赋值给axes1,问题依旧。我正在使用 MATLAB 2007b,无法切换到较新的版本。

这是我的代码的简化版本:

function pushbutton1_Callback(hObject, eventdata, handles)
       ...
       ...
       global s;
       s = serial('COM4');       % Create a serial object 
       s.baudrate = 9600;
       s.BytesAvailableFcnMode = 'byte';
       s.BytesAvailableFcnCount = 21;
       s.BytesAvailableFcn = {@instrcallback,gcf};
       fopen(s);
       ...
       ...
end



function instrcallback(hObject, eventdata,fignum)
       ...
       ...
       handles = guidata(fignum);
       global s;
       axes(handles.axes1);
       [ax,h1,h2] = plotyy(G1,m1,G1,m2);
       set(ax(1),'YLim',[(y1offset -zoom1-10), (y1offset +zoom1+10)]);
       set(ax(2),'YLim',[(y2offset -zoom2-10), (y2offset +zoom2+10)]);
       set(ax(1),'BOX' ,'off');
       set(ax(1),'Xgrid','on');
       set(ax(2),'Ygrid','on');  
       drawnow;
       ...
       ...
end



正确的语法是:[ax,h1,h2] = plotyy(handles.axes1, G1,m1,G1,m2);

推荐更新:

  • pushbutton1_Callback中:
    {@instrcallback,gcf}; 替换为 {@instrcallback, handles};

    function pushbutton1_Callback(hObject, eventdata, handles)
    ...
    s.BytesAvailableFcn = {@instrcallback, handles};
    
  • instrcallback: 中使用以下语法:

    function instrcallback(hObject, eventdata, handles)
    [ax,h1,h2] = plotyy(handles.axes1, G1,m1,G1,m2);
    ...
    

根据文档:

axes(cax) makes the axes or chart specified by cax the current axes and brings the parent figure into focus.

我想不通为什么要打开一个新图。


这是使用 Timer 而不是 serial 重现问题的代码:

function pushbutton1_Callback(hObject, eventdata, handles)
t = timer;
handles.t = t;
guidata(hObject, handles)
t.TimerFcn = {@instrcallback,handles};
t.ExecutionMode = 'fixedRate';
t.StartDelay = 1;
t.Period = 1;
start(t)


function instrcallback(hObject, eventdata, handles)
axes(handles.axes1);
plot(sin(-3:0.1:3 + rand(1)));

问题在 Windows 10 中重复使用 MATLAB R2019a。