Problem mit Thread/serieller Kommunikation



  • Hallo!

    Ich möchte ein Programm schreiben, das auf ein Kommando, das von einem seriellen Gerät kommt reagiert. Das Programm soll aber nicht auf das Kommando warten, sondern ganz normal funktionieren (Usereingaben annehmen, etc.). Wenn allerdings ein Kommando von der seriellen Schnittstelle kommt, dann sollte eine Funktion aufgerufen werden, die das Kommando behandelt.

    Mein Ansatz ist nun folgender:
    Ich verwende einen eigenen Thread, der auf Daten der seriellen Schnittstelle wartet (EV_RXCHAR Event), und die Daten auswertet. Ist das entsprechende Kommando dabei, sollte die Funktion der Applikation aufgerufen werden, die das Kommando behandelt.

    Leider habe ich noch keine Erfahrung mit serieller Kommunikation und Threads und so hab ich noch ein Problem mit der Umsetzung (Ich bin auch offen für andere Vorschläge, wenn es einen besseren Weg gibt um das Problem zu lösen).

    Das Problem:
    Ich kann den Thread nicht mehr beenden, da die Funktion "WaitCommEvent" blockiert, bis ein Daten an der seriellen Schnittstelle ankommen (siehe Codebeispiel).

    Der Programmcode:

    void __fastcall SerialReader::Execute()
    {
        DWORD event;
        DWORD bytesRead;
    
        while (!Terminated)
        {
            if (WaitCommEvent(hComm, &event, NULL))
            {
                if (event == EV_RXCHAR)
                {
                    do
                    {
                        if ( ReadFile(hComm, &buffer, sizeof(buffer), &bytesRead, NULL) )
                        {
                            // Daten überprüfen und Funktion des Hauptprogramms aufrufen
                        }
                    } while (bytesRead > 0);
                }
            }
            ShowMessage("Thread: fertig!");
    
        }
    }
    


  • Evtl. solltest du dann mit OVERLAPPED arbeiten:

    If hFile was not opened with FILE_FLAG_OVERLAPPED, WaitCommEvent does not return until one of the specified events or an error occurs.

    Zumindest aus dem selber Thread heraus scheint es anders nicht zu gehen 🙄



  • Hallo!

    Danke für Deine Antwort. Wenn ich Dich richtig verstanden habe, dann gibt es also keine Möglichkeit WaitCommEvent irgendwie von aussen zu unterbrechen. Wenn ich den overlapped Modus nehme, dann würde der Thread die Schittstelle quasi pollen - oder sehe ich das falsch? D.h. ich würde den selben Effekt erzielen, wenn ich auf WaitCommEvent ganz verzichte und nur die ReadFile - Funktion aufrufe.

    Wäre es vernünftig/vertretbar in diesem Fall zu pollen?



  • Ich habe damit noch nichts gemacht, aber ich denke, dass du dann eben ein Event-Handle bekommst, auf das du mittels WaitForSingleObject warten kannst. Um den von dir gewünschten Effekt zu erziehlen müsstest du dir dann ein eigenes Event erstellen und dann stattdessen mit WaitForMultipleObjects warten bis eines der beiden signalisiert wird 🙂


Log in to reply