[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Специально писал такую программу, которая могла бы работать как под чистым ДОСом, так и в ДОС-сессии. Встроенная в винды поддержка эмуляции COM-портов не удовлетворяла по двум причинам:
1. Если программа обратилась к COM-порту, то он остается навечно закрепленным за этой ДОС-сессией. Даже Win32 console программа, запущенная из-под этой сессии не имеет к нему доступа.
2. Теряются байты при приеме больших блоков, особенно если на машине запущено несколько задач.
Для работы пользовался VCOMM Protected mode API. Сначала определяется точка входа - int 2Fh/AX=1684h/BX=2Bh. На выходе в ES:DI - точка входа. Затем открываем порт AX=VCOMM_PM_API_OpenCom, BX=номер порта-1, вызываем по указанному адресу. Получаем в DX:AX handle.
Дальше надо создать буфера - VCOMM_PM_API_Setup. Здесь в MSDN первая ошибка - в стек нужно перед вызовом запихнуть лишнее слово.
Потом - установить режимы работы VCOMM_PM_API_SetCom. Здесь в MSDN еще одна ошибка - вместо DCB нужно давать совсем другую структуру, в документации не описанную. В ней поля уже 16-битные (а не 32), идут в совсем другом порядке.
Дальше можно начинать работать с портом - VCOMM_PM_API_ctx, VCOMM_PM_API_ReadString. По окончании не забыть его закрыть - VCOMM_PM_API_TrmCom, иначе порт будет неодоступен до следующей перезагрузки виндов.
Короче, поставить себе на машину MSDN+DDK+SoftICE и день покопаться.
Прикладная программа писалась на BC 3.1, проверялась под Win98SE.
E-mail: info@telesys.ru