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

mit handles Variablen rechnen?

 

flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 11:24     Titel: mit handles Variablen rechnen?
  Antworten mit Zitat      
Hi,

ich habe folgendes Problem:
Ich habe eine Variable definiert handles.r=0;
mit dieser möchte ich in einer anderen Funktion rechnen, ungefähr so:

Code:
handles.r = handles.r + 1;  
        guidata(hObject, handles);
        handles.r
 


Die Funktion, in der die Rechnung durchgeführt wird, wird alle 5 Sekunden durchlaufen, sie zeigt aber für handles.r immer 1 an. Weiß jemand, woran das liegt?
Das handles.r=0; habe ich am Anfang gesetzt, bevor das GUI sichtbar wird.

Ich hoffe, mir kann jemand helfen.

Grüße flora


dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 11:49     Titel:
  Antworten mit Zitat      
Hallo,

du musst handles.r natürlich auch immer aktualisieren.
Code:

handles = guidata (hObject); % hole aktuelle Werte
handles.r = handles.r + 1; % modifiziere Werte
guidata(hObjet, handles); % schreibe modifizere Werte


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 12:55     Titel:
  Antworten mit Zitat      
Hi,

danke für die Antwort, aber leider bringt auch das nicht den gewünschten Effekt.
Muss ich denn wirklich jedesmal, wenn ich eine handles-Variable ändere die eine Zeile Code davor und die andere danach schreiben?
Finde ich schon ziemlich umständlich...da ist das handling mit globalen Variablen ja schon fast einfacher...
....hat jemand vielleicht noch einen Tipp, warum das nicht funktioniert?

Grüße,
flora
 
flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 13:13     Titel:
  Antworten mit Zitat      
Hab jetzt erst gesehen, dass man den "Status aktuell halten" soll...
...hab ich dann mal jetzt getan, und die Frage von oben gilt immernoch Wink.
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 13:30     Titel:
  Antworten mit Zitat      
Hallo,

ja, das muss man. Das ist das Prinzip von Speichern. Erst holt man sich den Wert aus dem Speicher, dann modifiziert man ihn, und schreibt ihn zurück. Da Matlab afaik nicht mit Zeigern umgehen kann, muss du das Holen und Zurückschreiben per Hand erledigen. Ist nun mal so Smile

Kannst du etwas mehr Code anfügen? Ich sehe da gerade keinen Fehler, der muss dann schon etwas tiefer liegen.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 13:52     Titel:
  Antworten mit Zitat      
Hm. Ok. Also das Problem ist, ich kann Dir ja jetzt nicht meinen kompletten Code schicken...ist etwas viel und sicherlich unübersichtlich für Dich, abgesehen davon, hast Du bestimmt auch keine lust, Dich da durch zu wühlen Wink.
Ich habe schon überlegt, ob es vielleicht daran liegen kann, dass es eine eigene callback-Funktion ist, die ich geschrieben habe, in der das ganze stattfindet.
Es handelt sich hierbei um die BytesAvailableFcn. Ich habe der Callback-Funktion mit folgendem Code, folgendes übergeben:

Code:
s.BytesAvailableFcn={@mycallback, hObject, handles};


immer, wenn eine bestimmte Anzahl an Bytes am Comport vorhanden sind, wird mycallback aufgerufen.

Zitat:

function mycallback (obj, event, hObject, handles)
handles = guidata(hObject);
handles.r = handles.r+1;
guidata(hObject, handles);
handles.r


Sagt Dir das was?

Grüße
flora
 
flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 13:54     Titel:
  Antworten mit Zitat      
..irgendwie komme ich mit dem Forum auch noch nicht ganz zurecht, wieso habe ich da ein "Zitat" eingefügt, wo es doch "Code" sein sollte?
Also der Übersichtlichkeit wegen nochmal:

Code:

function mycallback (obj, event, hObject, handles)
handles = guidata(hObject);
handles.r = handles.r+1;
guidata(hObject, handles);
handles.r
 
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 14:22     Titel:
  Antworten mit Zitat      
Hallo,

oh, in dem Bereich kenne ich mich überhaupt nicht aus. Was du noch überprüfen kannst:
- Ist hObject wirklich ein handle auf ein Objekt in der GUI?
- Was passiert wenn du anstelle von guidata getappdata / setappdata hernimmst und handles.r in dein serielles Objekt reinschreibst?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 14:53     Titel:
  Antworten mit Zitat      
...ich kenne mich damit leider auch nicht wirklich aus...
...ich verstehe auch vieles gar nicht und versuche es einfach zu verwenden, wenn es dann allerdings zu Schwierigkeiten kommt, weiß ich natürlich nicht, woher!

Deine Tipps zB verstehe ich leider auch nicht Sad

Was bedeutet denn
Zitat:
Ist hObject wirklich ein handle auf ein Objekt in der GUI?

Was genau ist eigentlich dieses hObject?
Zitat:
Was passiert wenn du anstelle von guidata getappdata / setappdata hernimmst und handles.r in dein serielles Objekt reinschreibst?

und wie kann ich denn handles.r in mein serielles Objekt reinschreiben? Was meinst Du damit?

Grüße
flora
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2008, 10:58     Titel:
  Antworten mit Zitat      
Hallo,

du verwendest in deiner Callback-Funktion ja hObject.
Code:
function mycallback (obj, event, hObject, handles)
Damit du mit guidata Daten abrufen kannst, muss hObject (dein Aufruf ist ja handles = guidata (hObject) ) ein grafisches Objekt in deiner GUI sein, bzw. ein Handle davon (praktisch eine Zahl, die dieses Objekt repräsentiert). So ein Handle ist zum Beispiel die figure, eine Achse, ein Button oder ein Textfeld.

Du kannst mit setappdata bzw. getappdata einem Objekt irgendwelche Daten zuweisen. Ich habe gerade gesehen dass es mit seriellen Objekten anscheinend nicht geht (dein Objekt ist
Code:
s = serial('COM1');
oder so ähnlich).

Was passiert mit den anderen Werten in der Struktur handles. Bleiben die bei Änderungen auch gleich? Kannst du mal die Ausgabe von folgendem Code posten?
Code:
function mycallback (obj, event, hObject)
handles = guidata(hObject);
handles.r
handles.r=handles.r+1;
handles.r
guidata(hObject, handles);
handles2 = guidata(hObject);
handles2.r


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2008, 12:09     Titel:
  Antworten mit Zitat      
Hi,
also die Ausgabe von

Code:
function mycallback (obj, event, hObject)
handles = guidata(hObject);
handles.r
handles.r=handles.r+1;
handles.r
guidata(hObject, handles);
handles2 = guidata(hObject);
handles2.r


ist bei JEDEM durchlauf folgende:

Code:
ans =

     0


ans =

     1


ans =

     1


Und hObject sind alle meine grafischen Objekte? Oder wie? Aber ich habe doch gar kein Objekt, dem ich das zuweisen kann, oder? Es soll doch nur eine Variable sein, die in mehreren Funktionen verwendet wird.

..ich bin etwas ratlos
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2008, 13:09     Titel:
  Antworten mit Zitat      
Hallo,

nein, hObject soll ein Zeiger auf ein Element der GUI sein, egal welches. Guidata schreibt dann in die GUI benutzerdefinierte Werte, in deinem Fall eine Struktur, u.a. mit dem Feld "r".
Um guidata nutzen zu können, benötigst du aber eine GUI (deshalb auch GUIdata). Ansonsten hat das ganze natürlich keinen Sinn.

Ich glaube, bei dir liegt das Problem etwas tiefer. Zum Zeitpunkt wo du
Code:
s.BytesAvailableFcn={@mycallback, hObject, handles};
aufrufst, was genau ist da hObject? Kannst du da mal
Code:
posten?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2008, 14:03     Titel:
  Antworten mit Zitat      
Meinst Du das da:

BackgroundColor = [0.831373 0.815686 0.784314]
Callback = [ (1 by 54) char array]
CData = []
Enable = on
Extent = [0 0 5.4 1.38462]
FontAngle = normal
FontName = MS Sans Serif
FontSize = [8]
FontUnits = points
FontWeight = normal
ForegroundColor = [0 0 0]
HorizontalAlignment = center
KeyPressFcn =
ListboxTop = [1]
Max = [1]
Min = [0]
Position = [6 6.76923 13.8 1.76923]
String = Start
Style = togglebutton
SliderStep = [0.01 0.1]
TooltipString =
Units = characters
Value = [1]

BeingDeleted = off
ButtonDownFcn =
Children = []
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [12.0171]
Selected = off
SelectionHighlight = on
Tag = Startbutton
Type = uicontrol
UIContextMenu = []
UserData = []
Visible = on
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2008, 14:10     Titel:
  Antworten mit Zitat      
Genau das. Was passiert, wenn du das selbe dir in der Funktion "mycallback" ausgeben lässt? Wie oft führst du
Code:
s.BytesAvailableFcn={@mycallback, hObject, handles};
aus?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
flora

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2008, 14:31     Titel:
  Antworten mit Zitat      
Das führe ich nur ein einziges mal aus. Und wenn ich das in "mycallback" ausgeben lasse, kommt das gleiche bei raus.
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 2024 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.