Хорошо, один для ТАКОГО ума улья ...
У меня есть код, который до сегодняшнего дня прекрасно работал на многих системах и развернут на многих сайтах. Он включает в себя чтение потоков и запись данных из последовательного порта.
При попытке проверить новое устройство мой код был забит ошибками 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-разрядная, за мои грехи.
Прежде чем я просто объясню это "Чьей-то проблемой", у кого-нибудь есть идеи, что может вызвать это?