Verfasst am: 30.04.2009, 08:55
Titel: RS232 über GUI aufrufen und Daten sortieren
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);
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
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!
Ich freue mich auf Eure Antworten!
edit by steve: Bitte die Code-Umgebung verwenden! Button oben mittig!
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?
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.
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
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.
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!
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
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
Verschoben: 05.05.2009, 09:11 Uhr von Bijick Von Programmierung nach GUIs
Vielen Dank euch! Ich werde die Tage mal ein vorläufiges Ergebnis präsentieren.
Gruß
andrea1234
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.06.2009, 21:04
Titel: Würde mich auch über ein Ergebnis freuen
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
Einstellungen und Berechtigungen
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
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.