Timer Interrupt



  • Hallo an Alle!

    Ich brauche in folgender Aufgabenstellung eure Hilfe!
    Ich kommuniziere über einen COM Port mit einem Modul. In einer Dialogfeldbasierenden MFC Anwendung kann ich die vorhandenen COM Ports auswählen. Wenn der Anwender einen Port auswählt, der am PC vorhanden ist, an dem das Modul aber nicht angeschlossen ist stürzt meine Anwendung ab weil sie (logischerweise) von diesem Port keine Antwort bekommt. Ich möchte in so einam Fall einfach überwachen wie lange die Routine zum Auslesn benötigt. Benötigt sie zu lange weis ich dass von dem COM Port nicht gelesen werden kann und ich geben eine Fehlermeldung aus!
    So sieht mein Code aus:

    void CComDlg::OnTimer(UINT nIDEvent) //Wert einlesen
    {
    	clock_t goal, wait=200;
    	goal = wait + clock();
    	while( goal > clock() )
    

    So wollte ich zuerst die Zeit begrenzen, jedoch springt er auch nach Zeitüberschreitung nicht aus der while Schleife! Dass heisst ich brauche einen Timer Interrupt, der eine höhere Priorität hat als das Auslesen der Schnittstelle, richtig?

    {	
    		flag=1;
    		char str[6];
    		CFile datei( cCOMPort, CFile::modeRead );!!!
    

    Glaube, dass das Programm bei falsch eingestellter COM in dieser Zeile (!!!) hängen bleibet!

    .
                       .
               Datenverarbeitung
                       .
                       .
                    datei.Close();
    		UpdateData(false); // Variablen ---> Felder
    		CDialog::OnTimer(nIDEvent);
    		flag=0; 
    //flag=0 ->Empfangsroutine wurde vollständig abgearbeitet	
    	}//while
    	if (flag==1)
    	{
    		KillTimer(1);
    		MessageBox("Kommunikationsfehler!");
    	}
    	else
    	{
    		KillTimer(1);
    		MessageBox("Kommunikation okay");
    	}
    }//timer
    

    Da ich bis jetzt aus dem Internet und der Hilfe von VBC++ nicht schlau geworden bin, hoffe ich dass ihr mir helfen könnt eine Lösung zu finden bzw einen Timer Interrupt einzubauen!

    Vielen Dan im Voraus!!! 😋

    Lg Jürgen



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Kannst du dein Modul nicht anpingen? Einfach eine Anfrage schicken und innerhalb eines Zeitfensters warten ob was kommt und wenn nicht Fehlermeldung ausgeben.
    Außerdem: wo steht denn der Code den du gepostet hast? Und wo steht bei dir die SetTimer()? Ich hab den Eindruck das du das mit den Timern hier falsch anwendest bzw. nicht ganz so verstanden hast.



  • Ich würe einfach Abfangen, ob das Lesen erfolgreich war oder nicht und danach Triggern. Wenn Kein CFile zum lesen da ist einfach alles überspringen.



  • Uruk-h4j schrieb:

    Ich würe einfach Abfangen, ob das Lesen erfolgreich war oder nicht und danach Triggern. Wenn Kein CFile zum lesen da ist einfach alles überspringen.

    Ich hab das noch nie direkt über CFile gemacht auf die serielle Schnittstelle zuzugreifen, hab immer fertige Klasse verwendet. Aber ich dachte immer das Lesen ist immer erfolgreich, wenn der entsprechende COM-Port existiert unabhängig davon ob was dran hängt oder nicht. Eine der von mir verwendeten Wrapper-Klassen testet nämlich so das Vorhandensein eines COM-Ports. Auch wenn ich da kein Gerät dran hab sagt er, dass das Lesen erfolgreich war. Wie es beim Schreiben funktioniert weiß ich nicht. Oder hab ich da was falsch interpretiert?



  • Vielen Dank für die Antworten!!

    @andyDD:
    Das hast du richtig interpretiert, so eine COM Port abfrage habe ich auch geschrieben. Deshalb funktioniert es auch nicht CFile.Open etc abzufragen!(Zeile 3)
    Zu Set Timer(): Das steht oberhalb im code. Der Timer und das ganze Programm funktionieren einwandfrei, es geht eben nur darum, dass das Programm in Zeile 11 hängen bleibt wenn es auf eine Antwort vom COM Port wartet an dem nichts angeschlossen ist.

    CFile datei;
    		bool b1 = datei.Open( cCOMPort,  CFile::modeRead);
    		if (!b1) //Ergibt 1 solange der COM Port am PC vorhanden ist!
    		{
    			KillTimer(1);
    			MessageBox("Kommunikationsfehler");
    		}
    
    		while(1)
    		{ 
    			datei.Read( str, 1);
    			if(str[0] == 10)
    				break;
    		}
    

    Das pingen hört sich gut an! Hätte vielleicht jemand ein kleines Beispiel für mich wie man so etwas realisiert?

    Und meine 2. frage zu der ich im internet leider wenig gefunden habe: Ist es möglich mit einem Softwareinterrupt der zB 200ms nach Anfang der Empfangsroutine kommt dieses Problem zu lösen?

    Liebe Grüße Jürgen



  • Was den Timer angeht: problematisch wird es, wenn die Timerbehandlungsroutine länger dauert wie die Zeit zum nächsten Timerevent.

    CFile datei;
    		bool b1 = datei.Open( cCOMPort,  CFile::modeRead);
    		if (!b1) //Ergibt 1 solange der COM Port am PC vorhanden ist!
    		{
    			KillTimer(1);
    			MessageBox("Kommunikationsfehler");
    		}
    
    		while(1)
    		{ 
    			datei.Read( str, 1);
    			if(str[0] == 10)
    				break;
    		}
    

    Außerdem ist Zeile 12 nicht richtig. Per Definition ist str ein Char-Array. Dort vergleichst du das mit einer Zahl 10. Diese Bedingung wird nie erfüllt und dein System bleibt da in einer Endlosschleife hängen. Obendrauf wird noch kommen, dass deine Nachrichtenschleife mit WM_TIMER-Nachrichten zugeht.

    juergen_ese schrieb:

    Das pingen hört sich gut an! Hätte vielleicht jemand ein kleines Beispiel für mich wie man so etwas realisiert?

    Und meine 2. frage zu der ich im internet leider wenig gefunden habe: Ist es möglich mit einem Softwareinterrupt der zB 200ms nach Anfang der Empfangsroutine kommt dieses Problem zu lösen?

    Liebe Grüße Jürgen

    Mit dem Ping kann ich dir nicht helfen, da ich nicht weiß, was du da dran hängen hast. Das ist hardwareabhängig. Einige Controller bieten die Möglichkeit eines Pings indem man dem Ding eine definierte Zeichenfolge schickt und die z.B. ein Zeichen zurückliefern.
    Was meinst du denn mit Softwareinterrupt und 200ms? Was willst du denn damit erreichen? Solange du in einer Schleife steckst kannst du auf keine Nachrichten reagieren (zumindest nicht mit Mitteln des Klassengerüstes).


Anmelden zum Antworten