Matlab - Problema con ventana grafica generada en una guide en Matlab

 
Vista:

Problema con ventana grafica generada en una guide en Matlab

Publicado por Josibeth Cedeño (1 intervención) el 07/01/2015 04:30:14
Soy nueva en el foro y tengo un problema con una guide de matlab, Yo genero una gráfica usando un pushbutton (Función) y el comando figure. Cuando pulso el botón la primera vez me genera la gráfica sin ningún tipo de error, el problema esta cuando cierro la ventana gráfica (Usando otro pusbutton) y pulso nuevamente el botón que me genera la gráfica. Cuando hago esto me dice que la variable f (variable utilizada para crear la ventana gráfica) es indefinida.

He intentado solucionar esto pero no veo el origen del problema, ya que la primera vez el programa corre sin ningún tipo de error :/

Este es la parte del código que me genera problemas :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
function Sismograma_Callback(hObject, eventdata, handles)
% hObject    handle to Sismograma (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
pause(2);
fwrite(handles.s1,'B');
a = fscanf(handles.s1,'%d');
set(handles.sismo,'String',a);
 
if a==2
 
        a=fscanf(handles.s1,'%d');
        set(handles.recibiendo,'String',a);
        % parámetros de medidas
        tmax = handles.Tiempo;                                              % tiempo de captura en s
        rate = 33;                                                          % Numero de capturas por segundo
        % preparar la figura
        f = figure('Name','Captura');
        a = axes('XLim',[0 tmax],'YLim',[0 5.1]);
        l1 = line(nan,nan,'Color','b','LineWidth',1);                       %Linewidth especifica el ancho de línea
        xlabel('Tiempo (s)')
        ylabel('Amplitud')                                                  %Velocidad del desplazamiento del suelo
        title('Sismograma')
        grid on
        hold on
        % inicializar
        v1 = zeros(tmax*rate,1);
        time = cell(tmax*rate,1);                                           %Crear la celda para guardar la hora
        i = 1;
        t = 0;
        % ejecutar bucle cronometrado
        tic;
        while t<tmax
        t = toc;
        t1 = clock;
        Hora = datestr(t1);
        H=Hora(13:14);
        M=Hora(16:17);
        S=Hora(19:20);
        P=':';
        Time=[H P M P S];                                   %Concatenar las variables de hora, minutos y segundos en un solo vector
        time(i)={Time};
 % leer del puerto serie                                                    
        a = fscanf(handles.s1,'%d',8);
        pause(0.01);
        v1(i)=a(1)*5/1024;
             % dibujar en la figura
             x = linspace(0,i/rate,i);
             set(l1,'YData',v1(1:i),'XData',x);
             drawnow
             % seguir
             i = i+1;
        end
%enviar la letra D al microcontrolador
        fwrite(handles.s1,'D');
        % resultado del cronometro
        fprintf('%g s de captura a %g cap/s \n',t,i/t);
        gtext(time(1));
 
 
end
% Guardar las variables para su uso en otras funciones
handles.f=f;
handles.v1=v1;
handles.time=time;
guidata(hObject,handles);
 
function Cerrar_Callback(hObject, eventdata, handles)
% hObject    handle to Cerrar (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
delete(handles.f)                                                           %Cierra la ventana grafica creada para el sismograma
clear handles.f
guidata(hObject,handles);

Como verán falta gran parte del código pero todo lo demás funciona correctamente, el problema esta al querer ejecutar la función Sismograma nuevamente. El programa básicamente se comunica con un microcontrolador a través del puerto serie (handles.s1), al presionar un botón se envía la letra B al micro y se espera que este envié el numero 2, cuando esto sucede matlab recoge en un vector los datos enviados por el micro junto con un vector donde almacena la hora en la cual recibió cada dato y mientras realiza esto va dibujando los datos en una ventana gráfica (f). handles.tiempo es el tiempo en segundos en que se realizará la gráfica (Este dato es ingresado por el usuario). Ahora la idea es que yo pueda generar la grafica y cerrarla tantas veces como yo quiera, pero cuando intento hacerlo la segunda vez me muestra el siguiente error :
??? Undefined function or variable "f".

Error in ==> Interfaz>Sismograma_Callback at 223
handles.f=f;

Error in ==> gui_mainfcn at 96
feval(varargin{:});

Error in ==> Interfaz at 42
gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)Interfaz('Sismograma_Callback',hObject,eventdata,guidata(hObject))


??? Error while evaluating uicontrol Callback

Espero me puedan ayudarrr :S
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder