Win32 Überlappende Readfile auf COM-Port Rückgabe ERROR_OPERATION_ABORTED

Ok, eine für die SO hive mind...

Habe ich-code-die hat - bis heute - die laufen nur gut auf vielen Systemen und bereitgestellt wird, an vielen Standorten. Es umfasst die threads Lesen und schreiben von Daten von einem seriellen port.

Versuchen, check-out ein neues Gerät, mein code war überschwemmt mit 995 ERROR_OPERATION_ABORTED Fehler GetOverlappedResult-Aufruf nach dem ReadFile. Manchmal ist das Lesen würde, othertimes ich würde diesen Fehler bekommen. Nur ignorieren Sie den Fehler und wiederholen würde - erstaunlich - funktioniert ohne das löschen aller Daten. Keine ClearCommError erforderlich.

Hier ist das snippet.

if (!ReadFile(handle,&c,1,&read, &olap))
    {
        if (GetLastError() != ERROR_IO_PENDING)
        {
            logger().log_api(LOG_ERROR,"ser_rx_char:ReadFile");
            throw Exception("ser_rx_char:ReadFile");
        }
    }

    WaitForSingleObjectEx(r_event, INFINITE, true);  //alertable, so, thread can be closed correctly.

    if (GetOverlappedResult(handle,&olap,&read, TRUE) != 0)
    {
        if (read != 1)
            throw Exception("ser_rx_char: no data");

        logger().log(LOG_VERBOSE,"read char %d ( read = %d) ",c, read);
    }
    else
    {
        DWORD err = GetLastError();
        if (err != 995)   //Filters our ERROR_OPERATION_ABORTED
        {
            logger().log_api(LOG_ERROR,"ser_rx_char: GetOverlappedResult");
            throw Exception("ser_rx_char:GetOverlappedResult");
        }
    }

Meine erste Vermutung ist, die Schuld der COM-port-Treiber, die ich habe nicht' verwendet, bevor (es ist ein RS422-Anschluss an eine Blackmagic Decklink, FYI), aber das fühlt sich wie ein cop-out.

Ach ja, und Vista Business SP1 32-bit, für meine Sünden.

Bevor ich einfach dieses unten auf "Jemand anderes problem", hat jemand irgendwelche Ideen, was könnte dies verursachen?

  • Ich glaube nicht, dass das Ihr problem, aber Sie sind nicht mit WaitForSingleObjectEx richtig. Sie überprüfen sollten Sie für (1) dwWait == WAIT_OBJECT_0 oder (2) dwWait == WAIT_TIMEOUT && dwError == ERROR_IO_PENDING.
InformationsquelleAutor Roddy | 2008-11-20
Schreibe einen Kommentar