WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

set Befehl aus eigener function gibt fehelermeldung

 

Butzel
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2010, 11:56     Titel: set Befehl aus eigener function gibt fehelermeldung
  Antworten mit Zitat      
Hi,
muss über eine serielle schnittstelle daten empfangen und sie direckt in einem gui anzeigen lassen....
Das läuft auch alles super, ich kann sie mir auch schon in matlab anzeigen lassen, leider funzt der set-Befehl in meiner function, die ich selbst im gui geschrieben habe, nicht.
Fehlermeldung:


??? Reference to non-existent field 'text_motordrehzahl1'.
Error in ==> Aktuell>empfangen at 890
set(handles.text_motordrehzahl1,'String',num2str(motordrehzahl1));
Error in ==> instrcb at 36
feval(val{1}, obj, eventStruct, val{2:end});
Error in ==> gui_mainfcn at 239
figure(gui_hFigure);
Error in ==> Aktuell at 42
gui_mainfcn(gui_State, varargin{:});
Warning: The BytesAvailableFcn is being disabled. To enable the callback property
either connect to the hardware with FOPEN or set the BytesAvailableFcn property.

Mein Befehl:
set(handles.text_motordrehzahl1,'String',num2str(motordrehzahl1));

Die Function heißt "empfangen" und wird automatisch über die BytesAvailableFcn aufgerufen, immer wenn genügend Bytes vorhanden sind:
sid.BytesAvailableFcnCount = 14;
sid.BytesAvailableFcnMode = 'byte';
sid.BytesAvailableFcn = @empfangen;

So, jetzt zu meiner frage, warum nicht?????
Bitte helft mir, bin so kurz vorm ziel....
Liebe grüße Butzel
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.03.2010, 12:57     Titel:
  Antworten mit Zitat      
Hallo,

es sieht so aus, als ob das Feld text_motordrehzahl1 nicht existiert. Bist du sicher, dass es in der GUI ein Element mit diesem Tag gibt? Vielleicht ein Tipp- oder Übertragungsfehler?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Butzel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2010, 13:01     Titel:
  Antworten mit Zitat      
Hab ich auch schon geprüft. Das feld existiert und ein tippfeheler ist es auch nicht...
Aber woran könnte es noch liegen?
Liebe grüße butzel
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2010, 13:32     Titel:
  Antworten mit Zitat      
Ich hab eigentlich die selbe Vermutung wie Harald...

Mal ne ganz dumme Frage...du arbeitest aber nur mit einer GUI oder hast du mehrere Fenster?

Ansonsten solltest du vielleicht deinen function Code posten, damit man mal nen Überblick bekommt...
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.03.2010, 13:33     Titel:
  Antworten mit Zitat      
Hallo

Das kann ich mir nicht glauben,
Matlab sagt doch eindeutig, dass dieses Feld fehlt.

Hast du wirklich genau bei dieser Zeile geprüft, dass das Feld noch da ist?

setze z.B vor dieser Zeile so eine Abfrage rein, was wird ausgegeben?
Code:

if isfield(handles,'text_motordrehzahl1')
  fprintf('Das Feld ist doch da\n\n')
else
   fprintf('Matlab hat recht, das Feld ist nicht da\n\n')
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Butzel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2010, 14:50     Titel:
  Antworten mit Zitat      
Hi,
ich arbeite nur mit einer gui...

Hab den code eingefügt und in den anderen callbacks findert er das feld, nur in der function "empfangen" nicht. Ich vermute, das hat was mit der übergabe vom handles zu tun. Wie kann ich der function die vom gui erstellten handles beibringen?
Danke schon mal für eure hilfe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2010, 14:56     Titel:
  Antworten mit Zitat      
Ich denke wirklich der Function-Code sollte von dir gepostet werden, wen der Fehler nur dort auftritt und in anderen Callbacks nicht...

Du übergibst deiner Funktion aber handles, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Butzel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2010, 15:16     Titel:
  Antworten mit Zitat      
Code:

function empfangen(hObject, eventdata, handles)
        global sid ser_dat_in finder1 finder2 begin1 begin2 motordrehzahl1 motordrehzahl2;
%         handles.output = hObject;
%         handles.text_motordrehzahl1 = guidata(handles);
%         guidata(hObject,handles);
         if isfield(handles,'text_motordrehzahl1')
          disp('Das Feld ist doch da\n\n')
         else
           disp('Matlab hat recht, das Feld ist nicht da\n\n')
         end
%         set(handles.text_motordrehzahl1,'String',num2str(motordrehzahl1));  
        %Auslesen der seriellen Schnittstelle:
        ser_dat_in = fread(sid, 14, 'uint8');
%         disp ('COM-Port erfolgeich ausgelesen');
       
       
        if size (ser_dat_in) ~= 0 %(nicht gleich)
           
        finder1 = find(ser_dat_in(:,1)==250); % gibt mir die Zeilen an wo 250 (Markierungsbyte) steht
       
        if finder1 ~= 0
            begin1 = finder1(1);                    % erste stelle des finder-vektors

            wert1_0 = ser_dat_in(begin1+1);
            wert1_1 = ser_dat_in(begin1+2);
            wert1_2 = ser_dat_in(begin1+3);
            wert1_3 = ser_dat_in(begin1+4);
            wert1_4 = ser_dat_in(begin1+5);
            wert1_5 = ser_dat_in(begin1+6);

            motordrehzahl1 = ((wert1_0 * 16 + wert1_1) * 256 + (wert1_2 * 16 + wert1_3))
           
%             assignin('base','motordrehzahl1',motordrehzahl1);
            clear wert1_0 wert1_1 wert1_2 wert1_3 wert1_4 wert1_5;          

        end
       
        clear finder1;
       
        %Motor2:
        finder2 = find(ser_dat_in(:,1)==251); % gibt mir die Zeilen an wo 250 (Markierungsbyte) steht
       
        if finder2 ~= 0
            begin2 = finder2(1);                    % erste stelle des finder-vektors

            wert2_0 = ser_dat_in(begin2+1);
            wert2_1 = ser_dat_in(begin2+2);
            wert2_2 = ser_dat_in(begin2+3);
            wert2_3 = ser_dat_in(begin2+4);
            wert2_4 = ser_dat_in(begin2+5);
            wert2_5 = ser_dat_in(begin2+6);

            motordrehzahl2 = ((wert2_0 * 16 + wert2_1) * 256 + (wert2_2 * 16 + wert2_3))
%             assignin('base','motordrehzahl2',motordrehzahl2);
            clear wert2_0 wert2_1 wert2_2 wert2_3 wert2_4 wert2_5;
%             set(rs232,'UserData', motordrehzahl1);
        end
        clear finder2;
%         geschw_anzeigen(motordrehzahl1, motordrehzahl2);
        end


Das ist mein Code...
Und eigentlich will ich meiner function schon die handles übergeben, leider nimmt er sie aber anscheinend nicht an.
Wie übergibt man einer function die ein bestimmtes feld nicht kennen möchte die entsprechenden handles???
Private Nachricht senden Benutzer-Profile anzeigen
 
Butzel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2010, 15:23     Titel:
  Antworten mit Zitat      
Aufgerufen wird die function durch:
Code:

function Aktuell_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to Aktuell (see VARARGIN)

% Choose default command line output for Aktuell
handles.output = hObject;



global  sid

        %Öffnen der seriellen Schnittstelle:      
        sid = serial('COM1','Baudrate', 9600,'Parity', 'none','Databits', 8, 'StopBits', 1);
                handles.sid = sid;
                guidata(hObject,handles);
        sid.BytesAvailableFcnCount = 14;
        sid.BytesAvailableFcnMode = 'byte';
        sid.BytesAvailableFcn = @empfangen;
        fopen(sid);
               
%           Slider:    
            set(handles.slider_wiederholrate,'Min',1,'Max',1024);
            set(handles.slider_wiederholrate,'Value',get(handles.slider_wiederholrate,'Min'));
            set(handles.slider_wiederholrate,'SliderStep',[1/1024 1/512]);
            set(handles.text_wiederholrate,'String',num2str(get(handles.slider_wiederholrate,'Value')));
       
        % Update handles structure
        guidata(hObject, handles);          
% UIWAIT makes Aktuell wait for user response (see UIRESUME)
% uiwait(handles.figure1);


In der Empfangen-function
fehlen noch die beiden zeilen, die zum fehler führen:
Code:

%         Empfangene Drehzahlen Anzeigen:
        set(handles.text_motordrehzahl1,'String',num2str(motordrehzahl1));
        set(handles.text_motordrehzahl2,'String',num2str(motordrehzahl2));


Lustiger weise tritt kein fehler auf, wenn ich die beiden zeilen in ein vom gui erstellten callback packe. zb:
Code:

function pushbutton_login_standby_Callback(hObject, eventdata, handles)
global  sid a1_gui b1_gui a_gui b_gui a_gui1 a_gui2 a_gui3 a_gui4 b_gui1 b_gui2 b_gui3 b_gui4 k motordrehzahl1 motordrehzahl2;

        %Statusanzeige auf aktuellen Status setzen:
        set(handles.text_status,'String',{'Login_Standby'});
                                                           
        %Serielle Verbindung überprüfen und frei machen:
        k = instrfindall;
            if ~isempty(k);
                fclose(k);
                delete(k);
            end
        clear k;
       
        %Neue Serielle Verbindung öffnen:
        sid = serial('COM1','Baudrate', 9600,'Parity', 'none','Databits', 8, 'StopBits', 1);
                handles.sid = sid;
                guidata(hObject,handles);
     
        sid.BytesAvailableFcnCount = 14;
        sid.BytesAvailableFcnMode = 'byte';
        sid.BytesAvailableFcn = @empfangen;
       
        fopen(sid);
       
        %Empfangene Drehzahlen Anzeigen:
        set(handles.text_motordrehzahl1,'String',num2str(motordrehzahl1));
        set(handles.text_motordrehzahl2,'String',num2str(motordrehzahl2));
           
        %Login Senden:
        fwrite(sid, [1,0,0,0,0,0,0,0,0], 'uint8');
       
        %Variable und Anzeige für Vor&Zurück auf Null setzen:
        a_gui  = 0;
                handles.a_gui = a_gui;
                guidata(hObject,handles);
        a1_gui = 0;
                handles.a1_gui = a1_gui;
                guidata(hObject,handles);            
        set(handles.text_vor_rueck,'String',num2str(a1_gui));
       
        %Variable und Anzeige für Links&Rechts auf Null setzen:
        b_gui  = 0;
                handles.b_gui = b_gui;
                guidata(hObject,handles);
        b1_gui = 0;
                handles.b1_gui = b1_gui;
                guidata(hObject,handles);      
        set(handles.text_links_rechts,'String',num2str(b1_gui));
       
        %Die SendeVariablen für Vor&Zurück und Links&Rechts auf Null setzen:
        a_gui1 = 0;
                handles.a_gui1 = a_gui1;
                guidata(hObject,handles);
        a_gui2 = 0;
                handles.a_gui2 = a_gui2;
                guidata(hObject,handles);
        a_gui3 = 0;
                handles.a_gui3 = a_gui3;
                guidata(hObject,handles);
        a_gui4 = 0;
                handles.a_gui4 = a_gui4;
                guidata(hObject,handles);
        b_gui1 = 0;
                handles.b_gui1 = b_gui1;
                guidata(hObject,handles);
        b_gui2 = 0;
                handles.b_gui2 = b_gui2;
                guidata(hObject,handles);
        b_gui3 = 0;
                handles.b_gui3 = b_gui3;
                guidata(hObject,handles);
        b_gui4 = 0;
                handles.b_gui4 = b_gui4;
                guidata(hObject,handles);
% hObject    handle to pushbutton_login_standby (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.03.2010, 15:48     Titel:
  Antworten mit Zitat      
Habe vorigen Betrag gelöscht,
da du schon den ganzen Code gepostet hast.


versuch mal so Definition von empfangen-Fkt zu ersetzen:

Code:
 
 sid.BytesAvailableFcn = {@empfangen,guidata(hObject)};
 




sonst wenn es nicht klappt direkt handles= guidata(hObject); in empfangen-Fkt reinsetzen
Code:

function empfangen(hObject, eventdata, handles)
handles= guidata(hObject);
 


Aber warum machst du Definition auch noch an anderer Stelle(ich meine Callback pushbutton_login_standby_Callback)?
Private Nachricht senden Benutzer-Profile anzeigen
 
Butzel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2010, 16:06     Titel:
  Antworten mit Zitat      
Das erste funzt, wie geil seid ihr den... Danke erstmal.

Hab sie aus den anderen wieder raus genommen, das hatte mal andere gründe, ist jetzt aber wirklich besser nur einmal die serielle verbindung zu öfnen...

Vielen dank noch mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.