WaitCommEvent wartet nicht



  • Es geht um ein Stück Software, mit dem wir unter Windows (2000 und NT) über Rs232 (Serial Port) kommuniziert haben. Das funktionierte bisher einwandfrei.
    Der grobe Ablauf ist:

    HANDLE h = CreateFile( "COM2", .. // ohne Overlapped IO
    // diverse Konfiguration
    SetCommMask( h, EV_RXCHAR | EV_RLSD );
    for(;;)
    {
        DWORD event;
        WaitCommEvent( h, &event, 0 );
        switch( event )
        {
        case EV_RXCHAR:
            ReadFile( h, ..
            // Auswertung des Inputs
            break;
        ..
    }
    

    bisher blieb das Programm auch brav bei WaitCommEvents hängen, bis die Bytes reinkamen. Jetzt läuft das identische Programm - mit der identischen Konfiguration - unter Windows XP und das Programm läuft sofort in den case EV_RXCHAR rein und liest 0 Byte .. !?

    Weiß jemand, ob WaitCommEvents unter XP ein anderes Verhalten hat als unter NT bzw. 2000?

    Für Infos, Links zum Thema oder Tipps, wie man es unter XP anders machen sollte wäre ich dankbar.

    Gruß
    Werner



  • muss es nicht

    if(event & EV_RXCHAR)
    {
    }
    

    heißen?



  • Hast Du den DCB komplett initialisiert? Und nicht GetCommState verwendet?



  • sera schrieb:

    muss es nicht

    if(event & EV_RXCHAR)
    {
    }
    

    heißen?

    Danke für den Hinweis. Stimmt, aber ändert nichts an dem eigentlichen Problem.

    Jochen Kalmbach schrieb:

    Hast Du den DCB komplett initialisiert? Und nicht GetCommState verwendet?

    Ja, komplett. GetCommState habe ich nicht verwendet. Der Code zur Initialisierung des DCB stammt aus dem Code von http://www.codeproject.com/system/serial.asp und - wie gesagt - funktionierte bisher auch einwandfrei.

    Gruß
    Werner



  • so geht es auch unter XP (mit overlapped event):

    OVERLAPPED    o;
    o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); // einen Event setzten
    
    ...
        WaitCommEvent (h, &event, &o); // Event mit Empfangssignalen verknüpfen
        if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
        {
            if (event & EV_RXCHAR) // Zeichen an RxD empfangen:
            {
    ...
    

    Blackbird


Log in to reply