Verfasst am: 20.07.2009, 16:11
Titel: Abbruch einer while-Schleife durch Tastendruck
hallo!
ich schreibe gerade an einem programm, das permament die parallele schnittstelle ausliest und bei Empfang des Wertes 128 über die serielle schnittstelle den Buchstaben 'x' versenden soll. das funktioniert bisher ganz gut. Ich stehe aber vor folgendem problem:
das programm soll also permanent laufen, das habe ich mit einer endlosschleife realisiert (while 1). mein problem ist es, dass ich nicht weiß, wie ich einen abbruch der endlosschleife realisieren kann. strg-c würde natürlich funktionieren, aber dann wird der rest des programms, nämlich fclose der seriellen schnittstelle, nicht mehr ausgeführt...
Hier der Code:
Code:
% Parallelport initialisieren
dio = digitalio('parallel','LPT1');
addline(dio,0:7,0,'in'); % auf diesen pins des parallelen ports kommen die zeichen
Meine Idee wäre es, die while-Schleife nicht endlos laufen zu lassen, sondern so lange, bis eine Variable (stop_flag) auf 1 gesetzt wird. Initialisiert wird stop_flag mit 0. Zu Beginn des Programms wird eine Figure geöffnet und in der KeyPressFcn der Figure wird bei Drücken der Taste 'q' die Variable stop_flag auf 1 zu gesetzt.
Hier der Code:
Code:
global stop_flag % globale variable, die auf 1 gesetzt wird sobald das programm beendet werden soll
stop_flag = 0;
while ~stop_flag % while-schleife läuft so lange, bis stop_flag auf 1 gesetzt wird (in der KeyPressFcn)
value = binvec2dec(getvalue(dio));
if(value == 128) fwrite(serialPortObj, 'x', 'async');
end end
Leider funktioniert das so ganz und gar nicht. Das Programm läuft zwar ohne Fehler, aber Matlab hängt sich bei einem Tastendruck auf. Weiß jemand warum, bzw. wüsste jemand eine bessere Lösung für das obige Problem?
Ich bin für jede Idee/Hilfe dankbar!
Ich verwende Matlab R2007b.
while ~stop_flag % while-schleife läuft so lange, bis stop_flag auf 1 gesetzt wird (in der KeyPressFcn)
value = binvec2dec(getvalue(dio));
if(value == 128) fwrite(serialPortObj, 'x', 'async');
end
stop_flag = getappdata(gcf, 'stop_flag'); % NEU!!!!!!! end
while ~stop_flag % while-schleife läuft so lange, bis stop_flag auf 1 gesetzt wird (in der KeyPressFcn)
value = binvec2dec(getvalue(dio));
if(value == 128) fwrite(serialPortObj, 'x', 'async');
end
stop_flag = getappdata(figure_handle, 'stop_flag'); % NEU!!!!!!! end
Leider funktioniert das ganze immer noch nicht. Besonders seltsam finde ich, dass nach dem Start des Programms keine Figure geöffnet (und in der Taskleiste angezeigt) wird. Die Figure erscheint erst, wenn ich das Programm mit Strg-C abbreche. Dafür hab ich absolut keine Erklärung... Kann mir jemand weiterhelfen?
Danke und LG, Matthias
Nachdem Du Dein GUI anscheinend "zu Fuß" programmiert hast, tu ich mir schwer mehr dazu zu sagen.
Ich kann Dich jetzt nicht einmal bitten eine bestimmte Funktion zu posten, da der Fehler überall stecken könnte.
Ich vermute aber, dass Deine Endlos- Schleife zu laufen beginnt, bevor Du das GUI als solches aufrufst.
_________________
Hallo!
Vielleicht steh' ich jetzt auf der Leitung, aber ich weiß nicht genau was du meinst... Es gibt dazu (noch) kein GUI, die beiden geposteten Funktionen sind alles was ich habe. Also es gibt nur diese zwei m-Files. Meiner Meinung nach müsste es ja mit diesem Code schon laufen. Oder seh ich da was falsch? Wie kommst du auf ein händisch programmiertes GUI?
LG, Matthias
Ich habe das so verstanden, das die Funktionen die Du bereits gepostet hast, Minibeispiele für Funktionen eines größeren Projektes sind.
Man kann eine GUI auch ohne guide programmieren. Deshalb der Ausdruck "händisch"/ "zu Fuß".
Das hast Du in Ansätzen ja gemacht, indem Du geschrieben hast
Nun zu Deinem Problem:
Die Ursache dafür, dass das Fenster nicht "aufgeht", liegt darin, dass Matlab so sehr mit der while- Schleifenbearbeitung beschäftigt ist, dass es das Fenster nicht darstellt.
Das selbe Problem tritt dann mit dem Keypress auf. Matlab ist derartig beschäftigt, sodass wahrscheinlich keine Reaktion auf 'q' erfolgen wird.
Dazu schreibst Du am besten auch ein "pause(1)" in die Schleife selbst
_________________
Vielen Dank für eure äußerst hilfreichen Antworten!
Das ganze läuft jetzt wirklich super, es funktioniert sowohl mit pause(1) als auch mit drawnow, wobei bei pause(1) meiner meinung nach das problem ist, dass möglicherweise genau während dieser sekunde ein signal der parallelen schnittstelle verpasst werden könnte...
Vielen Dank und LG, Matthias
HSR2
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 05.09.2012, 11:29
Titel:
Hallo
ich habe ein ähnliches Prgramm, dort werden mit TCP/IP Geräte abgefragt. Zusätzlich läuft eine While schleife die alle 15 min das Command Fenster öffnet.
Allerdings stört mich die Figure.
Wie müsste ich das Programm von oben anpassen/ bzw die Funktion, dass kein Figure geöffnet wird sondern während der while schleife überprüft wird ob z.b. eine Taste gedrückt wurde.
Welches "Command Fenster" wird alle 15 Minuten geöffnet? Meinst Du das Command-Window?
Wenn Matlab nur prüft, ob eine Taste gedrückt wurde, kann man zwischen durch nicht mehr mit einem Editor arbeiten oder Emails schreiben. Es ist schon sinnvoll, Tasten-Drücke innerhalb eines bestimmten aktiven Fensters abzufangen. Ich würde allerdings auf jeden Fall einen GUI-Button bevorzugen.
Gruß, Jan
HRS2
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.09.2012, 17:02
Titel:
Hallo Jan,
ja ich öffne alle 15 min cmd.
Jedoch hast du recht, am pc soll weiterhin gearbeitet werden. Deshalb muss ich wohl doch in die Gui Programmierung einsteigen.
Ich verstehe es immer noch nicht. Matlab's Command-Window oder ein DOS-Konsole?
Schöne GUI-Beispiele findest du von Matt Fig im FileExchange. Suche nach "41 GUI Examples".
Gruß, Jan
Zuletzt bearbeitet von Jan S am 10.09.2012, 12:02, insgesamt einmal bearbeitet
HSR2
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 10.09.2012, 11:33
Titel:
hi ich meine ein DOS Fenster - Windows Eingabeaufforderung.
vielen dank für die Beispiele
grüße
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.