Хорошо, один для SO улей ума ...Win32 Overlapped ReadFile на COM порт возвращения ERROR_OPERATION_ABORTED
У меня есть код, который имеет - до сегодняшнего дня - пробежать просто отлично на многих системах и развернут на многих сайтах. Он включает в себя чтение и запись потоков из последовательного порта.
Попытка проверить новое устройство, мой код был забит 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 порта, который я Havent»использовал раньше (это порт RS422 на Blackmagic DeckLink, FYI), но чувствует, как отговорка.
О, и Vista SP1 Бизнес 32-бит, для моих грехов.
Прежде чем я просто положил это на «Проблема кого-то другого», есть ли у кого-нибудь какие-либо идеи о том, что может вызвать это?
Я не верю, что это ваша проблема, но вы не используете `WaitForSingleObjectEx` правильно. Вы должны проверить (1) `dwWait == WAIT_OBJECT_0` или (2)` dwWait == WAIT_TIMEOUT && dwError == ERROR_IO_PENDING`. – jww 2012-09-20 17:56:27