ComWrite jede 500msec



  • Hallo,
    Ich bin relativ neu in der Programmierung . Könnte mir jemand dabei helfen.
    (Sorry für mein Deutsch. Ich lerne immernoch )

    Ich schreibe ein Programm, wo ein rechner mit Microcontroller über eine Serialle schnittstelle kommuniziert. Ich habe eine COM-Writefunktion, die funktioniert, aber ich möchte, dass sie alle 500 ms schreibt.

    Status = SetCommMask(hComm, EV_RXCHAR); 
    	{
    					
    	writeSuccess = ComWrite(StatusRequest, sizeof(StatusRequest));
    .......
    }


  • Programmierst du mit der nackten WINAPI?
    Du kannst mit SetTimer einen Timer aufziehen, der in bestimmten Intervallen eine Funktion anspringt, vielleicht hilft dir das.


  • Banned

    This post is deleted!


  • @DocShoe
    Vielen Dank. Es hat funktioniert. Ich habe die handle als NULL gesetzen

    #define TIMER_ID_SendRequest  1000
    
    void CALLBACK SendRequest(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
    {
    
    int SendRequestDelay = 500;
    writeSuccess = ComWrite(StatusRequest, sizeof(StatusRequest));
    SetTimer(NULL, TIMER_ID_SendRequest, SendRequestDelay, (TIMERPROC)&SendRequest);
    }
    


  • Es reicht aus, wenn du den Timer ein Mal aufziehst, das solltest du nicht im Callback machen. Technisch passiert da zwar nix, aber ich finde es merkwürdig, ein bestehenden, laufenden Timer durch einen neuen Timer mit den gleichen Einstellungen zu ersetzen. Lies dir noch mal die Doku zu SetTimer durch.

    Ein Timer läuft so lange, bis er per KillTimer zerstört wird. Das solltest du übrigens auch tun:

    // Timer aufziehen
    UINT_PTR send_timer = SetTimer( NULL, TIMER_ID_SEND_REQUEST, 500, &timerfunc );
    
    // iwann später:
    KillTimer( send_timer );
    


  • Hello,

    ich arbeite an diesen projekt wieder nach ein monat.
    Set timer funktiniert.

    
    
    ret = sendReceivePacket(........);
    
    if (TIMEFLAG == false)
    {
    if(ret ==0) // change is status
    {
    //warning message//
    TIMEFLAG = True;
    .................
    }
    else
    {
    }
    
    }
    
    INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP){
    
    switch (msg){
    case WM_INITDIALOG:
    
    SetTimer(NULL, TIMER_ID_SEND_REQUEST, 1000 * 3, (TIMERPROC)StatusRequest);
    
    case WM_TIMER:
    
    KillTimer(NULL, TIMER_ID_SEND_REQUEST);
    
    }
    }
    
    

    die Dlgproc ist ein main dialog process wo alle windows messages ausgeführt. mein frage hier ist, ich wollte paket von microcontroller jede 3sec lesen, aber in dem falle, eine status änderung(zum beispiel :spannung ausgefallen) gibt , dann muss ein warnung nur einmal kommen. hier passiert so, dass jedes mal ein neu paket angekommen(während spannung ausfall) ist, kommt die warnung. ich habe kill timer anstelle der Timeflag benutzt aber es funktioniert es leider nicht.


Log in to reply