2008-11-20 4 views
2

Хорошо, один для 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-бит, для моих грехов.

Прежде чем я просто положил это на «Проблема кого-то другого», есть ли у кого-нибудь какие-либо идеи о том, что может вызвать это?

+1

Я не верю, что это ваша проблема, но вы не используете `WaitForSingleObjectEx` правильно. Вы должны проверить (1) `dwWait == WAIT_OBJECT_0` или (2)` dwWait == WAIT_TIMEOUT && dwError == ERROR_IO_PENDING`. – jww 2012-09-20 17:56:27

ответ

4

Как вы устанавливаете структуру OVERLAPPED перед ReadFile? - Я всегда нулел их (кроме, конечно, hEvent), что, возможно, является частью суеверия, но я чувствую, что это вызвало у меня проблему в прошлом.

Я боюсь, что обвинение водителю (если это не MS, а не просто крошечная настройка из ссылки) не совсем нереалистично. Чтобы написать COM-драйвер, это невероятно сложная вещь, и сложность тестирования заключается в том, что каждое приложение, когда-либо написанное, использует последовательные порты и их IOCTL несколько иначе.

Еще одна распространенная проблема заключается не в том, чтобы установить весь порт, например, не вызывая SetCommTimeouts или SetupComm. Я понятия не имею, если вы делаете такую ​​ошибку, но я встречал людей, которые говорят, что они не используют таймауты, когда они на самом деле означают, что они не вызывали SetCommTimeouts, поэтому они используют их, но не имеют что они настроены на ...

Этот вид вещей может быть убийством для сторонних драйверов COM, потому что люди часто уходили с любым старым дерьмом с драйвером MS, и это не всегда работать с другим устройством.

+0

Я согласен с тем, что таймауты выглядят как вероятная причина, тем более, что входной сигнал не теряется, а вызов ReadFile считывает только один байт за раз. Однако, если приложение правильно настроит порт, реалистично обвинять драйвер, включая драйвер MS. – 2008-11-20 23:49:50

0

В дополнение к обнулению OVERLAPPED вы также можете проверить, как вы устанавливаете olap.hEvent, то есть какие аргументы для CreateEvent? Если вы создаете событие, предварительно запрограммированное (т. Е. Третий аргумент CreateEvent равен TRUE), я ожидаю немедленного возврата. Кроме того, не забывайте, что если вы укажете manualReset (второй аргумент CreateEvent) как FALSE, GetOverlappedResult() поможет вам очистить событие, что может объяснить, почему он работает во второй раз.

Не могу сказать из вашего фрагмента, влияет ли это на вас - надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^