Verfasst am: 29.11.2016, 10:34
Titel: TimerFcn und StopFcn verstehen
Guten Morgen zusammen.
Ich habe einige Fragen zur Funktionsweise von Timern in MatLab. Doch vorab zu meinem Problem. Ich möchte über MatLab eine Kommunikation zu einem Empfänger aufbauen, die über eine UART-Schnittstelle abläuft. Für jede gesendete Nachricht aus MatLab soll ein Timer starten, während dessen MatLab auf eine Quittierung des Empfänger warten soll. Trifft die Quittierung noch vor Ende des Zeitintervalls ein, soll der Timer ausgeschaltet werden. Nachfolgend die Codeschnipsel aus meinem Protokoll:
Code:
function Current_Source_Control_GUI_OpeningFcn(hObject, eventdata, handles, varargin)
function connect_COM_Port_Callback(hObject, eventdata, handles) % hObject handle to connect_COM_Port (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global serialPort;
global USB_COM_Port;
global connect_COM_Port;
global Status;
global timer_init_response_enable_serialPort_close;
switch state
case 'CIR' % Anfrage des Nios ii Prozessors nach einem Init Signal. fwrite(serialPort, ['I'], 'uchar');
timer_init_response_enable_serialPort_close = 'true';
start(handles.timer_init_response);
set(Status, 'string', 'Initialisierung der Nios ii Uart-Register');
state = [];
case 'RID' % Nios ii Prozessor initialisiert und im Empfangsmodus. set(Status, 'string', 'Sendebereit');
state = [];
timer_init_response_enable_serialPort_close = 'false';
stop(handles.timer_init_response);
%delete(handles.timer_init_response);
otherwisedisp('Kein zutreffender Case-Fall eingetrofen.')
state = [];
end end
function Init_response_TimerFcn(hObject, eventdata, handles)
switch enable
case 'false'
disp('timer_init_response gestoppt.')
try_counter_init_response = 0;
case 'true'
try_counter_init_response = 0;
%serialPort=[];
%fclose(serialPort);
%delete(serialPort);
%clear(serialPort);
set(Status, 'string', 'UART-Verbindung getrennt.');
boxhandle=msgbox({'Es ist eine Zeitüberschreitung während der Initialisierungsphase aufgetretten. Bitte beenden Sie die GUI, schalten Sie die Hardware erneut ein und starten Sie daraufhin erneut die GUI. Stellen Sie zum Schluss eine neue UART-Verbindung her!'});
waitfor(boxhandle);
end
Nun wenn ich das Programm ausführe geschieht folgendes. MatLab sendet das notwendige Wort aus und erhält darauf hin auch die entsprechende Quittierung. Jedoch wird der Timer nicht gestopt, sondern die TimerFcn führt sich heiter weiter aus und ich kriege folgende Warnung:" Warning: The BytesAvailableFcn is being disabled. To enable the callback property
either connect to the hardware with FOPEN or set the BytesAvailableFcn property.".
Nun zu meinen Fragen. Kann es sein, dass ein aktiver Timer alle anderen Funktionen und Callbacks blockiert? Wenn ja, wie kann ich mit MatLab eine Zeitüberwachung auf eine Quittierung realisieren, damit MatLab nicht ewig auf eine Quittierung warten muss?
Verfasst am: 29.11.2016, 13:57
Titel: Re: TimerFcn und StopFcn verstehen
Hallo RoMalle,
Und wieso wird der Timer nicht gestoppt? Mit dem debugger solltest Du das heraus finden können: Setze einen Breakpoint in die Zeile, die den Timer stoppt und überprüfe, warum das nicht erfolgreich funktioniert.
Die Logik Deines Codes nachzuvollziehen ist nicht einfach, weil die häßlichen globalen Variablen das unnötig erschweren. Code mit globals ist grundsätzlich in Debugbarkeit und Wartbarkeit deutlich eingeschränkt und wie in jeder Programmiersprache ist es eine gute Praktik darauf zu verzichten. Daten statt dessen in den handles zu speichern, den User- oder ApplicationData von GUI-Elementen, oder als PERSISTENT Variablen in einer eigenen Funktion ist deutlich besser, weil dann nachzuvollziehen ist, aus welchem Programmteil die Daten geändert werden.
Wenn ein TimerCallback auf globale Variablen zugreift, kann das geschehen, während ein GUI-Callback ausgeführt wird. Das ist richtig tückisch.
Gruß, Jan
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.