MATLAB gui отображает данные на новом рисунке вместо указанных осей - PullRequest
1 голос
/ 12 января 2020

Я разрабатываю 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



1 Ответ

1 голос
/ 13 января 2020

Правильный синтаксис: [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) делает оси или диаграмму, указанную cax, текущими осями и фокусирует родительскую фигуру.

Не могу понять, почему открыта новая фигура.


Вот код, который воспроизводит проблему, используя 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)));

Проблема повторяется при использовании MATLAB R2019a в Windows 10.

...