Serielle Schnittstelle sofort abfragen mit WaitCommEvent



  • Hallo,

    ich habe ein Problem beim Abfragen der seriellen Schnittstelle. Und zwar wie kann man eine Leitung, in meinem Fall der "Ring Indicator", auf ihren Zustand abfragen, so das man sofort ein Ergebnis bekommt?

    Ich habe es so versucht:

    OVERLAPPED ov;
    
    memset(&ov,0,sizeof(ov));
    ov.hEvent = CreateEvent(
       NULL,   // no security attributes
       TRUE,  // auto reset event
       FALSE,  // not signaled
       NULL    // no name
    );
    
    DWORD dwEvtMask;
    
    SetCommMask(hComm, EV_RING );
    
    bool test = false;
    
    if(WaitCommEvent(hComm, &dwEvtMask, &ov) != 0){
      test = true;
    }
    else{
      test = false;
    }
    

    Angeblich soll das WaitCommEvent sofort antworten, wenn man eine OVERLAPPED Variable benutzt. Ich habe es irgendwie auch nicht so richtig verstanden, es funktioniert bei mir jedenfalls nicht.
    Also wie kann ich den Status der Leitung vom seriellen Port abfragen, so das ich sofort das Ergebniss bekomme?
    Um eure Hilfe wäre ich sehr erfreut.

    Gruss splitta



  • Ich habe vergessen den die serielle Schnittstelle mit dem FILE_FLAG_OVERLAPPED aufzurufen:

    hComm = CreateFile("COM1",//portname,
                          GENERIC_READ | GENERIC_WRITE,
                          0,
                          0,
                          OPEN_EXISTING,
                          FILE_FLAG_OVERLAPPED, //<-----------
                          0);
    

    Jetzt wartet das WaitCommEvent nicht mehr. Aber ich habe noch das Problem, wie ich das Ergebnis abgreifen kann. Also wie kann ich das Ergebnis auf eine Bool-Variable übertragen?
    Angeblich gibt das WaitCommEvent nicht Null zurück, wenn es erfolgreich war.



  • In der BCB Hilfe unter WaitCommEvent stehen die Parameter doch drin.
    Die brauchst du nur auszuwerten.



  • Wenn ein Signal anliegt, soll das Ergebnis nicht 0 sein. Bei mir ist es aber immer 0, auch wenn ein Signal anliegt. Ich muss da irgendwo einen Fehler haben.



  • splitta schrieb:

    Wenn ein Signal anliegt, soll das Ergebnis nicht 0 sein. Bei mir ist es aber immer 0, auch wenn ein Signal anliegt. Ich muss da irgendwo einen Fehler haben.

    Was bedeutet eigentlich FILE_FLAG_OVERLAPPED ?

    Gruß
    Johann



  • Hab deine Frage noch mal gelesen,
    wenn du 'nur' den Leitungsstatus abfragen willst, brauchst du WaitCommEvent nicht.
    Da reicht ein einfaches
    GetCommModemStatus()

    Das gibt dir den (aktuellen) Status der Eingangsleitungen zurück.



  • Ui, das wäre fein wenn das funktioniert. Das werde ich gleich am Dienstag testen und mich dann nochmal melden.

    Sei gedankt SilentSurfer

    @ hermes: Was FILE_FLAG_OVERLAPPED genau bedeutet weiss ich auch nicht. Habe aber irgendwo im Netz gelesen, das es mir helfen könnte. 😉
    Genauer gesagt, habe ich es hier gefunden: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/waitcommevent.asp



  • Also das mit dem GetCommModemStatus() funktioniert.



  • splitta schrieb:

    @ hermes: Was FILE_FLAG_OVERLAPPED genau bedeutet weiss ich auch nicht. Habe aber irgendwo im Netz gelesen, das es mir helfen könnte. 😉

    Hallo?!? Wenn du nicht weisst, was du tust, kannst du das Programmieren auch gleich lassen! Wenn du nciht weisst, was OVERLAPPED bedeutet, dann besorg dir gefälligst die INfo dazu!

    -junix


Anmelden zum Antworten