Timer



  • Hallo,

    ich arbeite mit WinXP Prof und MS Visual C++ 6.0 / MFC

    Weiß jemand von Euch wie man einen Timer macht, welcher auf mindestens 4-5 Kommastellen genau ist.
    Ich müsste bei meiner Kommunikation mit einem Gerät via RS485 genau 0.00104ms warten...
    dann weiter.
    Also ich sende insgesamt 6 BYTES, zuerst 5, dann 0.00104ms warten, dann das letzte BYTE.

    Vielen Dank für eure Hilfe
    MfG Dippi



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



  • Dippi_81 schrieb:

    Hallo,

    ich arbeite mit WinXP Prof und MS Visual C++ 6.0 / MFC

    Weiß jemand von Euch wie man einen Timer macht, welcher auf mindestens 4-5 Kommastellen genau ist.
    Ich müsste bei meiner Kommunikation mit einem Gerät via RS485 genau 0.00104ms warten...
    dann weiter.
    Also ich sende insgesamt 6 BYTES, zuerst 5, dann 0.00104ms warten, dann das letzte BYTE.

    Vielen Dank für eure Hilfe
    MfG Dippi

    Aloha,

    die Frage ist, warum tust Du das ?
    Worauf wartest Du ?

    Grüße

    BOA



  • Hallo Boa,

    also ich schreibe zur Zeit an meiner Diplomarbeit und mein Betreuer in der Firma hat mir das so erklärt:

    Ich muss zunächst alle BYTES bis auf der Letzte (ChecksummenBYTE) senden, dann einlesen bis alle wieder empfangen wurden (bei RS485 hardware bedingt, dass alles was gesendet wird, zurück gesendet wird).
    Dann diesen Timer aufziehen(Länge die ein BYTE zum senden braucht-->0.00104ms
    dann mein letztes BYTE schicken nud dann die RS485 Schnittstelle auf empfang umschalten.
    Damit garantier ich mir, dass zuerst alle BYTES gesendet wurden, und dann erst auf empfangen umgeschaltet wird!
    MfG Dippi



  • Hi,

    also das präziseste und schnellste, was ich Dir unter den Timern empfehlen kann, ist der Multimedia-Timer. Such mal in der MSDN danach. Sicherlich ist aber sogar der nicht so 100%-ig genau, wie Du es Dir wünscht.

    Ich verstehe Deinen Ansatz nicht so recht. Du brauchst doch nur direkt nach dem Senden wieder auf Empfangen schalten und dann die gesendeten Bytes wieder empfangen. Warum machst Du es Dir mit dem Timer so kompliziert?



  • Dippi_81 schrieb:

    Ich müsste bei meiner Kommunikation mit einem Gerät via RS485 genau 0.00104ms warten...

    10.4 Mikrosekunden? Auf einem Betriebssystem, wo es passieren kann, dass dein Programm jederzeit für unbestimmte Zeit angehalten wird, weil andere Prozesse drankommen, die eventuell wichtiger sind?



  • Ja warum mache ich mir das so kompliziert...gute Frage. Problem ist, dass das mit dem senden und gleich danach umschalten auf Empfang nciht so ganz funktioniert, und dann hab ich von meinem Betreuer diese Möglichkeit gesagt bekommen, welche zuvor schon einmal benutzt wurde und auch funktioniert hat!!!
    Lieg am Gerät, welches sehr schnell antwortet!
    Deshalb wollte ich das so machen.

    ich kann Euch ja mal meinen Codeausschnitt posten, damit ihr seht wie ich es mach, und vielelicht habt ihr ja nen Tipp...
    Danke

    //comm.ClearRTS();		// Sender aktivieren
    comm.SendBuff(bySendBuff3,5);	// alle Bytes bis auf das Letzte rausschicken
    comm.ClearRTS();                // Sender aktivieren
    comm.ReadBuff(byReadBuff3,5);	// warten bis alle gesendeten BYTES wieder 
                                    // empfangen wurden
    
    comm.SendByte(bySendBuff3[5]);	// letztes Byte senden
    Sleep(1);
    comm.SetRTS();
    comm.ReadBuff(byReadBuff3,255);
    


  • Dippi_81 schrieb:

    Damit garantier ich mir, dass zuerst alle BYTES gesendet wurden, und dann erst auf empfangen umgeschaltet wird!
    MfG Dippi

    Da täuscht Du Dich!
    Es gibt keinen Befehl der es Dir ermöglich die serielle Schnittstelle zu "Flushen"!!! Du kannst zwar FlushFileBuffers aufrufen, das bewirkt aber nur, dass der interne Buffer zum Treiber geschrieben wird. Es gibt KEINE Möglichkeit den Treiber zu veranlassen dass er die Daten schreibt (ausser den Port zu schliessen).
    Es gibt ein Trick um mitzubekommen, wann alle Daten gesendet wurden: fRtsControl auf RTS_CONTROL_TOGGLE setzen. Vermutlich wird das schon bei Dir alles lösen...



  • wenn du das senden etwas 'echtzeitmässiger' haben willst, dann kannte 'TransmitCommChar()' nehmen



  • "etwas" hilft ihm ja auch nicht... Ein Zeichen welches via TransmitCommChar "gesendet" wird, wird nur an den Anfang des Ausgangspuffer gesetzt... es wird aber nicht unbedingt (sofort) übertragen...



  • Solche Timing-Probleme lassen sich doch im Normalfall mit Events lösen, oder nicht? Dann kommt es auch nicht unbedingt auf die ms genau an. Schließlich hat man ja noch einen internen Speicher, der die Bytes auffängt. Korrigiert mich, wenn ich falsch liege.


Anmelden zum Antworten