Хорошо, один для коллективного разума SO...
У меня есть код, который до сегодняшнего дня прекрасно работал на многих системах и развернут на многих сайтах. Он включает в себя потоки, читающие и записывающие данные из последовательного порта.
При попытке проверить новое устройство мой код был завален ошибками 995 ERROR_OPERATION_ABORTED, вызывающими GetOverlappedResult после ReadFile. Иногда чтение работало, иногда я получал эту ошибку. Простое игнорирование ошибки и повторная попытка, как ни удивительно, сработали бы без потери каких-либо данных. ClearCommError не требуется.
Вот фрагмент.
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");
}
}
Мое первое предположение заключается в том, что виноват драйвер COM-порта, который я раньше не использовал (это порт RS422 на Blackmagic Decklink, FYI), но это похоже на отговорку.
О, и Vista SP1 Business 32-bit, за мои грехи.
Прежде чем я просто отнесу это к «Чей-то другой проблеме», есть ли у кого-нибудь идеи о том, что может вызвать это?
WaitForSingleObjectEx
. Вы должны проверить (1)dwWait == WAIT_OBJECT_0
или (2)dwWait == WAIT_TIMEOUT && dwError == ERROR_IO_PENDING
. - person jww   schedule 20.09.2012