Еще раз про Com порт
От: ..Федя Россия  
Дата: 13.10.04 09:28
Оценка:
Несомтря на множество тем, например http://www.rsdn.ru/Forum/Message.aspx?mid=235437&only=1
Автор:
Дата: 07.04.03
я все же не могу найти ответы на свои вопросы...

Итак...

ВОПРОС: COM порт, можно ли решить лимитирование времени написав драйвер?

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

Вопросы
---------------------------------






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