COM порт, можно ли решить лимитирование времени

Тема в разделе "WASM.WIN32", создана пользователем Fedya, 13 окт 2004.

  1. Fedya

    Fedya New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2004
    Сообщения:
    2
    Адрес:
    Москва
    Постановка задачи

    ---------------------------------

    Нужно написать программу под ОС Windows 2000, которая реализует взаимодействие с устройством через последовательный порт (RS-232) на скорости 4800 бод. Компьютер должен принимать поток байт, если в потоке приходят 2 определенных байта, то нужно за 65 миллисекунд от момента их приема послать заранее подготовленных 20 байт. Управление потоком и т.п. не используется, устройство никак не контролирует приём байт компьютером, компьютер никак не контролирует устройство.

    Проблема заключается в том, чтобы уложиться в эти 65 миллисекунд (это предельное значение), а желательно меньше 20-40 миллисекунд.

    По моей оценке* на основе тестового приложения это невозможно сделать в рамках пользовательского Win32 приложения.



    Вопросы

    ---------------------------------

    Возможно ли решить эту задачу путём написания драйвера последовательного порта (или внесением модификации в существующий драйвер serial.sys, если я правильно понял пример из DDK под Windows 2000 и есть этот драйвер)?



    По моей оценке на основе исходников serial.sys проанализировать получение 2 байт можно непосредственно в обработчике прерывания (функция SerialISR()), остается инициировать из обработчика прерываний запись 20 байт в порт. Возможно ли сделать это в указанных временных рамках и если да, то по какой схеме это сделать?



    Можно реализовать задачу не через собственный драйвер, а обращаясь к существующему драйверу** из режима ядра используя Irp запросы?



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



    Какую информацию и где можно посмотреть по данным вопросам?



    Примечания

    ---------------------------------

    * Оценка времени получена следующим образом. Время измерялось функцией GetTickCount(). Написано 2 тестовые программы (используются вызовы WinAPI), которые взаимодействуют с друг другом через последовательный порт (2 компьютера соединены через нуль-модемный кабель). Первая (программа А) посылает 2 байта и принимает 20 байт, вторая (программа B) ждет приёма 2 байт и посылает 20 байт. Если в программе А сделать задержку (Sleep()) меньше 120 мс, то будет приходить меньше 20 байт в рамках одной операции чтения FileRead(). В программе B временной интервал от наступления выполнения потока после задержки функцией WaitCommEvent() до завершения операции WriteFile() время скачет, т.е. может быть 0 мс, а может быть 30-40 мс. Из всего этого я сделал вывод, что гарантированно реализовать указанную задачу в рамках пользовательского приложения (с учетом того, что нужен запас времени) невозможно.

    ** Как я понял, одна из проблем это буферизация порта. Если я правильно понял из пользовательского приложения можно только рекомендовать функцией SetupComm() размеры буферов (кажется драйвера, а не порта), но отключить её нельзя. Если я правильно понял драйвер анализирует микросхему и включает буферизацию вроде как особо никого не спрашивая.
     
  2. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    Это называется "управляющая система реального времени".



    Винда не является операционной системой реального времени. Если ей приспичит "гнуть пальцы" в ядре (своём) в критический промежуток времени, то её ничто не остановит..



    Просто почитай форум http://qnx.org.ru/forum/ и задумайся...
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105




    В настройках СОМ-порта можно задать размер

    аппаратных буферов на ввод и на вывод.

    Можно вообще их отключить.
     
  4. Fedya

    Fedya New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2004
    Сообщения:
    2
    Адрес:
    Москва
    Кто нибудь знает WinAPI функцию, которая позволяет сделать это программно?
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105