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。
我正在开发一个 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。