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

Abbruch einer while-Schleife durch Tastendruck

 

mstan
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 16.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2009, 16:11     Titel: Abbruch einer while-Schleife durch Tastendruck
  Antworten mit Zitat      
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

% Com-Port initialisieren
serialCon = serial('COM1', 'BaudRate', 9600, 'DataBits', 8, 'Parity', 'none', 'StopBits', 1);
fopen(serialCon);

while 1
    value = binvec2dec(getvalue(dio));
    if (value == 128)  
        fwrite(serialPortObj, 'x', 'async');
    end
end

fclose(serialCon); % diese zeile wird nie ausgeführt!!!


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;

figure_handle = figure('KeyPressFcn', @keyPressed);

% Parallelport initialisieren
dio = digitalio('parallel','LPT1');
addline(dio,0:7,0,'in'); % auf diesen pins des parallelen ports kommen die zeichen

% Com-Port initialisieren
serialCon = serial('COM1', 'BaudRate', 9600, 'DataBits', 8, 'Parity', 'none', 'StopBits', 1);
fopen(serialCon);

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

fclose(serialCon);
 


zugehörige KeyPressFcn:
Code:
function keyPressed(src,evnt)
    global stop_flag;
    if evnt.Character == 'q'
        stop_flag = 1;
    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.

LG, Matthias
Private Nachricht senden Benutzer-Profile anzeigen


Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2009, 16:22     Titel:
  Antworten mit Zitat      
Servus mstan

Ich würde anstatt 'global' mit "appdata" arbeiten:

Code:

stop_flag = 0;
setappdata(gcf, 'stop_flag', stop_flag); % NEU!!!!!!!

figure_handle = figure('KeyPressFcn', @keyPressed);

% Parallelport initialisieren
dio = digitalio('parallel','LPT1');
addline(dio,0:7,0,'in'); % auf diesen pins des parallelen ports kommen die zeichen

% Com-Port initialisieren
serialCon = serial('COM1', 'BaudRate', 9600, 'DataBits', 8, 'Parity', 'none', 'StopBits', 1);
fopen(serialCon);

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

fclose(serialCon);
 


Code:

function keyPressed(src,evnt)
    global stop_flag;
    if evnt.Character == 'q'
        setappdata(gcf, 'stop_flag', 1); % NEU!!!!!!!
    end
end
 

_________________

lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
mstan
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 16.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2009, 16:48     Titel:
  Antworten mit Zitat      
Erstmal vielen Dank für die Antwort!!

Ich habe versucht noch ein paar Kleinigkeiten anzupassen, jetzt sieht der code folgendermaßen aus:

Code:
figure_handle = figure('KeyPressFcn', @keyPressed);
stop_flag = 0;
setappdata(figure_handle, 'stop_flag', stop_flag); % NEU!!!!!!!

% Parallelport initialisieren
dio = digitalio('parallel','LPT1');
addline(dio,0:7,0,'in'); % auf diesen pins des parallelen ports kommen die zeichen

% Com-Port initialisieren
serialCon = serial('COM1', 'BaudRate', 9600, 'DataBits', 8, 'Parity', 'none', 'StopBits', 1);
fopen(serialCon);

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

fclose(serialCon);


KeyPressFcn:
Code:

function keyPressed(src,evnt)
    if evnt.Character == 'q'
        setappdata(gcf, 'stop_flag', 1); % NEU!!!!!!!
    end
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2009, 16:59     Titel:
  Antworten mit Zitat      
Servus Matthias

Das ist in der Tat seltsam.

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

lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
mstan
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 16.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2009, 19:24     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2009, 20:10     Titel:
  Antworten mit Zitat      
Servus mstan

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


Code:
figure_handle = figure('KeyPressFcn', @keyPressed);



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.

Wenn Du vor die Schleife ein
Code:


einfügst, wird Dein Fenster erscheinen.

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
_________________

lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 20.07.2009, 20:23     Titel:
  Antworten mit Zitat      
Eine Alternative zu
Code:
wäre
Code:
Wink

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
mstan
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 16.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2009, 11:09     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
HSR2

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2012, 11:29     Titel:
  Antworten mit Zitat      
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.

Vielen dank

grüße
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.09.2012, 15:28     Titel:
  Antworten mit Zitat      
Hallo HSR2,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
HRS2

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2012, 17:02     Titel:
  Antworten mit Zitat      
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.

Vielen Dank

Grüße
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.09.2012, 02:33     Titel:
  Antworten mit Zitat      
Hallo HRS2,

Zitat:
ja ich öffne alle 15 min cmd.

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
Private Nachricht senden Benutzer-Profile anzeigen
 
HSR2

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2012, 11:33     Titel:
  Antworten mit Zitat      
hi ich meine ein DOS Fenster - Windows Eingabeaufforderung.

vielen dank für die Beispiele

grüße
 
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.