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
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie sind Sie mit der Einstellung über die OVERLAPPED-Struktur vor dem ReadFile? - Ich habe immer null Sie (anders als die hEvent, natürlich), vielleicht ist das Teil Aberglaube, aber ich habe das Gefühl, dass es verursacht mir ein problem in der Vergangenheit.
Ich fürchte, die Schuld dem Fahrer (wenn es nicht MS, und nicht nur ein kleines zwicken von der Referenz) ist nicht völlig unrealistisch. Schreiben Sie einen COM-Treiber ist eine unglaublich komplexe Sache, und die Schwierigkeit, mit testen ist es, dass jede Anwendung, die jemals geschrieben wurden, verwendet die seriellen ports und die IOCTLs etwas anders.
Ein weiteres häufiges problem ist, nicht, um den ganzen Hafen, bis - zum Beispiel den Aufruf nicht SetCommTimeouts oder SetupComm. Ich habe keine Ahnung, wenn Sie diese Art von Fehler, aber ich habe Menschen getroffen, die sagen, Sie sind nicht mit timeouts, wenn Sie tatsächlich bedeuten, dass Sie nicht nennen SetCommTimeouts also sind Sie mit Ihnen aber don ' T haben eine Vorstellung, was Sie sind gesetzt...
Diese Art von Sachen kann Mord für 3rd-party COM-Treiber, weil die Menschen oft davon gekommen mit irgendwelchen alten Mist mit dem MS-Treiber, und es funktioniert nicht immer die gleiche mit einem anderen Gerät.
zusätzlich zur Nullung der ÜBERLAPPT, können Sie auch überprüfen, wie man die Einstellung olap.hEvent, dass ist, was sind Ihre Argumente, um CreateEvent? Wenn Sie eine Veranstaltung erstellen, die die pre-signalisiert (D. H. das Dritte argument CreateEvent WAHR ist) würde ich erwarten, dass eine sofortige Rückkehr. Auch, vergessen Sie nicht, dass, wenn Sie angeben, manualReset (das zweite argument CreateEvent) als FALSCH, GetOverlappedResult() wird hilfreich klar das Ereignis für Sie - das könnte erklären, warum es funktioniert, das zweite mal herum.
Kann nicht wirklich sagen, von deinem snippet, ob diese auf Sie wirkt - hoffe, das hilft.