Зависание функции WriteFile (в COM порт) на пустом месте

Тема в разделе "WASM.WIN32", создана пользователем Arisu, 23 сен 2010.

  1. Arisu

    Arisu Алиса Селезнёва

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    89
    5 лет работаю с ком портом, никогда такого не видел.

    настройки порта: 9600, 8 бит данных, 1 стоповый, остальные по нулям.

    тайминги
    ReadIntervalTimeout = 20;
    ReadTotalTimeoutMultiplier = 20;
    ReadTotalTimeoutConstant = 2;
    WriteTotalTimeoutMultiplier = 20;
    WriteTotalTimeoutConstant = 2;
    (почему такие большие для этой скорости - могу рассказать отдельно)

    посылаю пакетики 9 байт каждые 500мс.
    периодически (через разные промежутки времени) виснет WriteFile.

    вызов ClearComError сразу перед WriteFile никакого эффекта не даёт (и пишет что ошибок нет) и WriteFile виснет.
    вызов ClearComError сразу после WriteFile никакого эффекта не даёт (и пишет что ошибок нет) и WriteFile всё ещё висит.

    вызов ClearComError спустя эдак миллисекунд 5 после зависания WriteFile помогает оному отвиснуть, но опять пишет, что ошибок нет (КАК?)

    вызов GetLastError после отвисания опять же пишет, что никаких ошибок не было.

    Собственно сейчас я лечу зависания периодическим вызовом ClearComError из другого потока, но это выглядит крайне топорно.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Лучше всего посмотреть на каком этапе идёт стопор.
    Банально подрубить дебаггер и посмотреть колл-стек "зависшего" потока.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    n0name
    Ось поддерживает логгирование хипа например. Это GF: FLG_USER_STACK_TRACE_DB, RtlQueryProcessBackTraceInformation(). RtlLogStackBackTrace() позволяет сохранять бактрейс в базу, она может быть считана предыдущей функой или тулзой UMDH(http://support.microsoft.com/kb/268343).

    Arisu
    Может слишком малые интервалы используете ?
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Arisu
    Напиши работу с ком портом через драйвер.
    Еще можно повысить приоритет для программы.