// nicht getestet
HANDLE hSerial = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL );
HANDLE hEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
OVERLAPPED ol = {0};
ol.hEvent = hEvent;
unsigned char pBuf[10];
DWORD dwBytesRead = 0;
if( ReadFile( hSerial, pBuf, 10, &dwBytesRead, &ol ) ) {
// alles klar
}
else {
if( ERROR_IO_PENDING == GetLastError() ) {
// warten
if( WAIT_OBJECT_0 == WaitForSingleObject( hEvent, 200 ) ) {
// Daten sind da
}
else {
// timeout
}
}
else {
// Fehler
}
}
[/PHP]
Entscheident ist FILE_FLAG_OVERLAPPED beim CreateFile. Danach muss jeder Zugriff mit ReadFile oder WriteFile mit der Adresse einer OVERLAPPED-Struktur gemacht werden. Der einzige Teil der Struktur, der bei Kommunikationsressourcen gebraucht wird, ist der Event-Handle.
Das Overlapped bewirkt, dass ReadFile sofort zurückkommt, egal ob Daten da sind oder nicht. Wenn dann Daten da sind, wird das Event gesetzt, dessen Handle in der OVERLAPPED-Struktur angegeben wurde. Auf das Event kann man mit WaitForSingleObject mit Timeout, hier 200 Millisekunden, warten.