Serielle Kommunikation (MS-Windows)

Aus C++_PHP_und_mehr
Wechseln zu: Navigation, Suche

HANDLE WINAPI CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName);[MSDN 1]
BOOL WINAPI WaitCommEvent(HANDLE hFile, LPDWORD lpEvtMask, LPOVERLAPPED lpOverlapped);[MSDN 2]
BOOL WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);[MSDN 3]

Ereignisgesteuert

Bei einem "Overlapped" Zugriff handeld es sich nicht um einen eigenen Thread oder Task. Es läuft nur der eigentliche Vorgang im Treiber im Hintergrund ab. "Fertig" wird mittels eines Ereignisses (event) gemeldet. Dieses Ereignis muß aber irgendwie gepollt werden, es scheint sich nicht um eine mit GetMessage(...) abfangbare Nachricht zu handeln. Der Vorteil liegt darin, dass man nicht auf langsame serielle Schnittstelle warten muss, insbesondere bei großen Paketen, sondern zwischenzeitlich was anderes machen kann, und nur gelegentlich mal nachfragt. Aus dem Beispiel Monitoring Communications Events scheint hervorzugehen, dass auch andere Threads beim IO-Zugriff blockiert werden.
Die Funktionen WaitCommEvent(...), ReadFile(...) usw. kehren sofort zurück. In der übergebenen Struktur <code>lpOverlapped ist ein mit CreateEvent(...) erzeugtes Ereignisobjekt enthalten. Dessen Status wird in Abhängigkeit der lpEvtMask bei Eintritt eines Ereignisses wie fertiggelesen geändert.

Quellen

  1. CreateEvent Function
  2. WaitCommEvent Function
  3. ReadFile Function