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

RS232 über GUI aufrufen und Daten sortieren

 

Blackfish84
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 30.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2009, 08:55     Titel: RS232 über GUI aufrufen und Daten sortieren
  Antworten mit Zitat      
Hallo Matlab-Community!

Ich arbeite zur Zeit an einem Projekt an meiner Hochschule. Das Projekt beschäftigt sich mit dem Auslesen eines optischen Sensors (optische Maus, ADNS 3060) zur Streckenmessung über SPI mittels µC (8051). Das nur so am Rande!
Jetzt möchte ich gerne über die RS232 Schnittstelle die Daten die ich aus dem Sensor auslese an Matlab senden und umgekehrt. Das klappt soweit schon einigermaßen. Dazu verwende ich folgenden Code:
Code:

% COM5, 115200 bps, Datenbits 8, keine Parität, Stopbit 1,Flusssteuerung keine
delete(instrfindall);

global out

ser_connect = serial('COM5','Baudrate', 115200,'Parity', 'none','Databits', 8, 'StopBits', 1);
%ser_connect.Flowcontrol = 'hardware'        %handshaking aktiviert                          
%ser_connect.ReadAsyncMode = 'manual'        %asynchrone Datenübermittlung
ser_connect.BytesAvailable
ser_connect.BytesAvailableFcnCount = 20;     %
ser_connect.BytesAvailableFcnMode = 'byte'; %Es wird eine BytesAvailableFcnMode erzeugt, wenn bestimmte Anzahl an bytes
                                            %verfügbar sind
get(ser_connect) ;                          %der Port wird automatisch konfiguriert
fopen(ser_connect);                         %verbindet den seriellen Port mit dem Device

out = fread(ser_connect, 100);

addr = [1];
fwrite(ser_connect,addr,'int');

serialbreak(ser_connect,1); % time in ms

wert=[2];
fwrite(ser_connect,wert);


fclose(ser_connect);
delete(ser_connect);
clear ser_connect;
 

Mein Problem was ich jetzt habe ist, dass nur wenn ich das m-File laufen lasse Matlab mir die Daten einliest. Ich würde dies gerne interaktiv über eine GUI steuern (werde mich aber noch durch die GUI-Beiträge noch durchlesen).
Des Weiteren bekomme ich einen Datenvektor der folgendermaßen aussieht und den ich gerne sinnvoll, d.h. nach aufsteigenden Zahlen sortieren möchte.
Bsp:
>> Datenvektor: [0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 255 255]
zwischen den übertragenen Zahlen stehen Nullen zur Trennung. Die 255 zum Schluss wird gesendet damit ich weiß das meine Übertragung zu Ende ist.
Das Problem bei dem Vektor ist das sobald ich das M-File aufrufe ich evtl. die Mitte erwische oder das Ende, also der Vektor nie den gleichen Anfang hat. Deswegen hab ich mir schon gedacht, müsste man den Vektor auf die 255 von anfang an absuchen, und dann hochzählen und die entsprechenden Stellen Variablen zuweisen.
1.Stelle -> Variable1
3.Stelle -> Variable2
5.Stelle -> Variable3
usw.

Ich hoffe das war jetzt nicht zu viel auf einmal! Wink
Ich freue mich auf Eure Antworten!

edit by steve: Bitte die Code-Umgebung verwenden! Button oben mittig!
Private Nachricht senden Benutzer-Profile anzeigen


Blackfish84
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 30.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2009, 15:38     Titel: Hinbekommen
  Antworten mit Zitat      
Also das mit den Variablen sortieren hab ich hinbekommen.
Allerdings weiß ich noch überhaupt nicht, wie ich diese Funktion jetzt in eine GUI einbauen soll. Hat einer von euch evtl. Lösungsvorschläge? Wie bekomme ich Variablen vom Matlab-Workspace zur GUI? Muss ich um die Schnittstelle auzulesen diese immer wieder aufrufen? Wie benutze ich die BytesAvailableFnc richtig?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2009, 23:00     Titel:
  Antworten mit Zitat      
Soweit ich weiß sind alle Figures Funktionen und alle Funktionen haben einen eigenen Workspace. Nun ist der Figure eine Funktion die Unterfunktionen hat, die die einzelnen axes, uicontrolls darstellen.Nun befindet sich das GUI in ständiger Zusammenarbeit mit dem Betriebssystem. Falls irgendwelche Änderungen im Betriebssystem kommen, sei es z.B. der Click auf einen Pushbutton oder so, wird die Callbackfunktion gestartet. Also du fängst an in dem du z.B.angibst:

Code:

function deinGUI
figGUI=figure('Eigenschaft','Wert','Eigenschaft','Wert'.....);
% ein handle ist der Rückgabewert der Funktion, in unserem Fall des ist %deinGUI der Handle vom figure(.....);. Dabei kannst du die eigenschaften % des GUI mit der Syntax oben ändern, Was du genau eingeben musst %steht  bestimmt irgendwo in der Hilfe.
end
 


Mit dieser Funktion erstellst du erstmal dein Figure. Weiter kannst du wie gesagt die Eigenschaften festlegen. Weiterhin kannst du mit ähnlichen Schreibweisen Pushbuttons, statische Texte, editierbare Texte einfügen, sogenannte uicontrolls. In die Klammer nach uicontrol setzt du zuerst den Handle des Figue ein, in welchen du die uicontrol einsetzen möchtest.


Code:

pushbutton1=uicontrol(figGUI,'Eigenschaft','Wert','Eigenschaft','Wert'.....);
 



Eine Eigenschaft kann sein 'Callback' die du getrennt mit einem Komma den Funktionsnamen @Callbackpushbutton1 zuweisen. Das @-Zeichen ist ein Zeiger, der auf die Funktion zeigt. Dies wird alles analog zum Figure gemacht. Nur pass auf, nicht jeder Eigenschafttyp wird von jeder Funtionsart (figure,uicontrol,axes,..) unterstützt. Am besten du leihst dir in der Hochschulbibo Matlab kompakt vom Schweizer aus. Da steht alles noch ausführlicher und besser erklärt drinne. Leider fehlen noch eins zwei Dinge und zwar, was passiert mit den Workspace und den Variablen. Im Figure benutzte Variablien wirst du nie im Workspace von Matlab erkennen. Alle Variablen werden innerhalb der Funktion verarbeitet, die einen eigenen Workspace hat. Wie gesagt ist das Figure figGUI die Hauptfunktion. Alle Variablen innerhalb der Hauptfunktion
sind zugreifbar für die Unterfunktionen, z.B. Callbackfunktionen, aber die Variablen die in der Unterfunktion erzeugt oder verändert werden, sind nur Bestandteil der Unterfunktion und nicht für weitere Prozesse in der Hauptfunktion nutzbar.Kleines Beispiel:
Code:

function deinGUI
figGUI=figure('Eigenschaft','Wert','Eigenschaft','Wert'.....);
pushbutton1=uicontrol(figGUI,'Style','Pushbutton','Callback,@cPb1,'.....);
pushbutton2=uicontrol(figGUI,'Style','Pushbutton','Callback,@cPb2,'.....);
k=1;
function cPb1(hObject,eventdata) %die Variablen in der KLammer immer %verwenden
k=k+1;
end
function cPb1(hObject,eventdata)
k=k+1;
end
end
 


Wenn du nun die einzelnen Pushbuttons betätigen würdest, würde k=2 rauskommen, aber sobald die Funktion abgearbeitet ist, wird der Workspace der Unterfunktion gelöscht. Um die Daten nun der Haupt- und anderen Unterfunktionen zuzuweisen, musst du die Daten die du erstellt hast, mit dem Befehl setappdata zur Verfügung stellen. Dann wird der Workspace der hauptfunktion geändert, sprich k wäre auch dort zwei und würde den Unterfuntionen zur Verfügung stehen und mit jedem Buttondruck inkrementieren.
Gleiches machst du mit deiner RS232-Routine.Du schiebst sie in die Callbackfunktion des Pushbuttons deiner Wahl und schiebst mit setappdata die erstellen Daten in den Workspace der Hauptfunktion.

Beachte:Wenn du in der Hauptfunktion die Variable nicht sdeklariert hast wie im vorhin genannten Beispiel k, musst du, wenn du die Daten in anderen Callbackfunktionen beispielsweise nutzen willst mit getappdata quasi in die neue Unterfunktion reinladen.mit dem Beispiel k heißt das:

Code:

function deinGUI
figGUI=figure('Eigenschaft','Wert','Eigenschaft','Wert'.....);
pushbutton1=uicontrol(figGUI,'Style','Pushbutton','Callback,@cPb1,'.....);
pushbutton2=uicontrol(figGUI,'Style','Pushbutton','Callback,@cPb2,'.....);

function cPb1(hObject,eventdata) %die Variablen in der KLammer immer %verwenden
k=k+1;
setappdata(figGUI,'k',k);
end

function cPb2(hObject,eventdata)
k=getappdata(figGUI,'k');
k=k+1;
end
end
 


Kleine Anmerkung. Mein Deutsch war nie das Beste. Ich bitte daher um ein wenig Nachsicht und auch die inhaltliche Kontrolle, da ich manches immer noch nicht richtig verstanden habe. Ich hoffe ich konnte dennoch behilflich sein.

Mit den besten Grüßen zum anbrechenden Freitag

Der Scriptor
Private Nachricht senden Benutzer-Profile anzeigen
 
Blackfish84
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 30.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2009, 12:36     Titel: Danke!
  Antworten mit Zitat      
Hi vielen Dank schonmal! War das WE über weg, deswegen auch heute erst eine Antwort. Ich habs mir mal durchgelesen und werd mich jetzt drangeben den Kram nachzuvollziehen. Bis die Tage!

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Blackfish84
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 30.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2009, 14:25     Titel: Prima!
  Antworten mit Zitat      
So, hab das Prinzip soweit verstanden und kann auch eine GUI manuell Programmieren. Kann ich dazu auch GUIDE benutzen? Wenn ja, wo muss ich den folgenden Kram

Code:

% Erstellen eines Pushbuttons
handles.pushbutton1 = uicontrol(MainWindow,'Style','pushbutton',...
                                'String','Button1',...
                                'FontWeight','bold',...
                                'FontSize',10,...
                                'Units','normalized',...
                                'Position',[.4,.375,.2,.1],...
                                'Callback',@cPb1);
 


einfügen, damit beim öffnen des figures der Button erstellt wird der dann den entsprechenden Callback aufrufen kann?
Wieso klappt dieser Aufruf nicht?

Code:

function pushbutton1_Callback(hObject, eventdata, handles)
@cPb1;

                           
function cPb1(hObject,eventdata) %die Variablen in der KLammer immer verwenden
k=1;                          
k_neu = num2str(k);
set(handles.static_text_test,'String',k_neu);
 





Vielen Danke schonmal im Voraus!

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2009, 19:45     Titel:
  Antworten mit Zitat      
http://www.mepnet.de/index.php?Item.....com_content&task=view

Probiers hier mal....

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2009, 20:03     Titel:
  Antworten mit Zitat      
Der Link war für den GUIDE. Ich persönlich bevorzuge die manuelle Programmierung. Ich fühl mich einfach sicherer, da ich das Ding von grund auf selber geschrieben habe. Ich weiß auch eher wo Probleme liegen könnten, ist womöglich ein wenig aufwendiger,lohnt sich aber denke ich.

Zu den unteren Funktion: Lösch die obere und schreibe unter den Quelltext der unteren noch ein end. Dann müsste es gehen....

Grüße Ich
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 05.05.2009, 09:11 Uhr von Bijick
Von Programmierung nach GUIs
 
Blackfish84
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 30.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2009, 14:39     Titel: Danke
  Antworten mit Zitat      
Vielen Dank euch! Ich werde die Tage mal ein vorläufiges Ergebnis präsentieren.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
andrea1234

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2009, 21:04     Titel: Würde mich auch über ein Ergebnis freuen
  Antworten mit Zitat      
Hi Blackfish84

na schon ein Ergebnis, könnte dies auch gebrauchen. Wär total cool, wenn du sobald du ein Ergebnis hast dies online stellen könntest

Viele Grüße
Andrea
 
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 - 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.