Verfasst am: 03.11.2012, 15:21
Titel: Wo ist der Fehler in meinem Proframm
Hallo freunde,
ich habe einen Fehler in meinem Prgoramm aber leider weiss ich es nicht wie ich es verbessern kann bzw. wo überhaupt der Fehler ist. Unten ist mein Code und im Anhang die Fehlermeldung.
Code:
xoffset=100;
yoffset=100;
xsize=300;
ysize=300;
% Bildgröße aus der Cam lesen
memsize = calllib('uEyeCamInterfaceDLL','mGetMemorySize');
% Auslesen des Skalierungswertes
skal_vek_x = get(handles.ergebniss,'String');
mult_vektor_x = num2str(skal_vek_x);
amp_old = 0;
phi_old = 0;
strecke = 0;
strecke_2 = 0;
first = 0;
h = 1;
% Abbrechen der Schleife wenn Stop Taste gedrückt wird while(get(handles.stop_beweg,'Enable') == 'on') tic;
% Bilddaten der Cam lesen
calllib('uEyeCamInterfaceDLL','mGetMemory',matlabPointer);
% --Aufbereitung der Daten -- % Werte vom Matlabpointer übernehmen Image = matlabPointer.Value;
% Pixelwerte diagonal tauschen, Reihe wird zu Spalte und Spalte zu Reihe % 3 Pixel in einer Reihe ergeben 1 Farbpixel (rgb Pixel) Image = reshape(Image,[],ysize)';
% nach little endian konvertieren, vertauscht lower und higher Byte Image = swapbytes(Image);
% anzeigen axes(handles.Live_Bild);
imagesc(Image);
colormapgray;
Bild(:,:,1) = Image;
%% Verarbeiten des Bildes
%get(hObject,'String')% returns contents of WertVektorY as text
%diocount1 = str2double(get(handles.diocount,'String')) %returns contents of WertVektorY as a double
DiodenProFeld=get(handles.edit_diodecount,'String'); % Lesen der Daten im Dioden Pro Feld
DPF=str2num(DiodenProFeld);
Diodenhohe=get(handles.edit_diodeheight,'String'); % Lesen der Daten im Diodenhöhe Feld
Dh=str2num(Diodenhohe);
Diodenbreite=get(handles.edit_diodeweight,'String'); % Lesen der Daten im Diodenbreite Feld Db=str2num(Diodenbreite);
Vergleichsvektoren=get(handles.edit_diooffset,'String'); % Lesen der Daten im Vergleichsvektoren Feld
Vw=str2num(Vergleichsvektoren);
roi = get_roi(Bild, DPF, Dh, Db); % roi ist eine Internet Funktion für Bildverarbeitung
ich habe nochmal in meinem Programm nachgeschaut und die Library wird zuvor geladen und ich arbeite schon damit. Deswegen verstehe ich nicht warum der Fehler auftritt.
setze doch in der Zeile mal einen Haltepunkt und verwende dann libfunctions oder libfunctionsview, um dir die verfügbaren Funktionen anzusehen.
Teste zudem, ob es hilft, die Library (nochmal) zu laden.
soweit ich es verstanden habe, ladet das Programm die Library von beginn an. Ich arbeite auch schon damit. Also Ich Kalibriere es erfolgreich und die Bewegungsanalyse klappt auch. Sobald ich aber den Stopp Button betätige kommt diese Fehlermeldung.
Ich weiss es nicht ob ich richtig liege, bin mir auch nicht sicher, aber ich vermute das ich beim Drücken der Bewegungsanalyse Button, mein Programm die Library wieder raus schmeist, und deswegen die Fehlermeldung kommt.
Um es bessr zu verstehen habe ich sowohl die Fehlermeldung als auch die Oberfläche hochgeladen.
Mein Code bei Betätigen des Stop Buttons:
Code:
if libisloaded('uEyeCamInterfaceDLL')
handles.iOK = calllib('uEyeCamInterfaceDLL','mCloseCam');
unloadlibrary uEyeCamInterfaceDLL;
end
Rückfrage: kommt die Fehlermeldung, wenn du den Stopp Button drückst, oder erst wenn du versuchst, die Kalibrierung danach wieder aufzunehmen?
Und ja, unloadlibrary entfernt die Bibliothek. Wenn du sie danach noch weiter verwenden willst, musst du entweder dafür sorgen, dass der unloadlibrary-Befehl nicht zu dem Zeitpunkt ausgeführt wird oder dass die Library danach wieder neu geladen wird.
Im Zweifelsfall kannst du ja vor calllib-Befehlen auch mit libisloaded überprüfen, ob die Bibliothek geladen ist, und sie ggf. neu laden.
ich habe es jetzt ausprobiert und einzeln nochmal geschaut wo es funktioniert und wo es nicht Funktioniert. Habe es mit (keine Fehlermeldung) und (Fehlermeldung) vermerkt!
Drücke verbindungs Button und anschließend Stopp Button (KEINE Fehlermeldung), kann dies öfters wiederholen (Verbinde --> Stopp, Verbinde ---> Stopp .... usw).
Fange wieder von anfang an und drücke verbindungs Button, drücke Live Button und anschließend Stopp Button (Fehlermeldung).
Fange wieder von anfang an und drücke verbindungs Button, drücke Live Button, drücke Kalibrierungs Button und anschließend Stopp Button (KEINE Fehlermeldung)
Fange wieder von anfang an und drücke verbindungs Button, drücke Live Button, drücke Kalibrierungs Button, drücke Bewegungsanalyse und anschließend Stopp Button (Fehlermeldung)
Wenn die Bibliothek nicht geladen ist, müsste ich es dann wieder bei den jeweiligen funktionen ganz an dem Anfang schreiben?
die Fehlermeldung tritt anscheinend in dem Codeteil für Bewegungsanalyse auf. Das steht für mich im Widerspruch dazu, dass nach deiner Beschreibung die Fehlermeldung dann auftritt, wenn du den Stopp Button drückst.
Zitat:
Wenn die Bibliothek nicht geladen ist, müsste ich es dann wieder bei den jeweiligen funktionen ganz an dem Anfang schreiben?
Ganz an den Anfang ist relativ. Ich würde es so sagen: vor jedem calllib-Befehl sollte sichergestellt sein, dass die Bibliothek geladen ist.
Ich kann nur empfehlen, sich mal von vorne bis hinten die Teile der Dokumentation über das Arbeiten mit Libraries und über das Debugging in MATLAB durchzulesen.
Zudem: der Autor des Programms ist nicht erreichbar? Er müsste das Programm ja schließlich am besten kennen.
bei drücken der Bewegungsanalyse Button bekommen ich keine Fehlermeldung, es kommt nach der drücken des Stopp Buttons.
Leider kann ich die Person nicht mehr fragen weill er nicht mehr da ist und die Dokumentation leider dürftig ausgefallen ist.
Ich wollte mal nachfragen welchen teil ich von unten nehemn muss damit die Library wieder geladen ist? Wenn ich nur die eine Zeile mit loadlibrary nehem funktioniert es nicht.
% Bilddaten der Cam lesen
calllib('uEyeCamInterfaceDLL','mGetMemory',matlabPointer);
% --Aufbereitung der Daten -- % Werte vom Matlabpointer übernehmen Image = matlabPointer.Value;
% Pixelwerte diagonal tauschen, Reihe wird zu Spalte und Spalte zu Reihe % 3 Pixel in einer Reihe ergeben 1 Farbpixel (rgb Pixel) Image = reshape(Image,[],ysize)';
% nach little endian konvertieren Image = swapbytes(Image);
% anzeigen axes(handles.Live_Bild);
imagesc(Image);
ja, nur die eine Zeile. Wie gesagt: lies dir bitte die Dokumentation zum Arbeiten mit Libraries durch!
Was heißt "es funktioniert nicht"? Bekommst du nach wie vor die selbe Fehlermeldung, oder eine andere?
nicht zu vergessen, diese Fehlermeldung kommt erst beim drücken des Stopp Buttons, kann der Fehler vieleicht dort liegen?
beste Grüße
Hasan
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.11.2012, 17:23
Titel:
Hallo,
zum Fehler kommt es vrs. weil deine while-Schleife nach Drücken des Stop-Buttons nicht abgebrochen wird.
Somit wird in der nachfolgenden Zeile weiterhin versucht die calllib-Funktion aufzurufen.
Liegt wohl an der Abfrage der "Enable"-Eigenschaft des Pushbuttons.
Aus den obigen Code-Auszügen ist nicht ersichtlich wie diese vrs. innerhalb der Stop-Button Callback geändert wird.
Diese Probleme liegen meist daran dass die geänderten GUI-Daten noch nicht gespeichert wurden.
Zu beachten ist dass, du durch Drücken des Stop-Buttons die Bewegungs-Callback unterbrichst
und diese anschließend an der Stelle an der sie unterbrochen wurde fortgesetzt wird.
Erst danach werden graphische Darstellungen etc. aktualisiert. Soll heißen deine
Pushbutton-Eigenschaft "Enable" wird vrs. nicht angepasst. (evtl. im Debug-Modus testen) !?
Evtl. mal drawnow-Befehl (aktualisiert GUI) nach der Änderung innerhalb der Stop-Button Callback einfügen oder while-Schleifen-Abfrage ändern...
Gruß und viel Glück
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.