Главная » Delphi » Установка линии RTS в DOS и Windows

0

При начальной загрузке компьютера линии RTS и DTR чаще всего оказываются в состоянии с отрицательным уровнем напряжения (от -9 до -12 В), но, вообще говоря, могут оказаться в любом состоянии. В среде DOS и Windows 95/98/МЕ для установки в положительный уровень можно применить любой имеющийся под рукой DOS-драйвер СОМ-портовой мыши, который удобно загружать, например, через autoexec.bat прямо при включении компьютера (если только пренебречь опасностью, что при поступлении байтов на этот порт курсор может самопроизвольно начать бегать по экрану и производить всякие нехорошие действия). Однако в Windows NT и других ОС из этого семейства зтот способ, естественно, работать не будет. Рассмотрим, как можно установить уровни принудительно на примере линии RTS.

В DOS (этот способ будет также работать и в Windows 9дг) можно написать простую программку на Turbo Pascal, которая под названием RTSDOS имеется на прилагаемом диске (папка Priloz4). Исходный текст ее расположен в файле RtsDos.pas. Запускается она из командной строки с ключами типа +сомх или -сом>: (где х есть 1, 2, 3 или 4). Если первый символ "+", то линия установится в положительный уровень напряжения, если наоборот — в отрицательный. Если все в порядке, программа вернет (в текстовом режиме) номер порта ввода/вывода для заданного COM ($03F8, например), если его не существует, то не вернется ничего. При запуске без ключа программа выдаст текст (на достаточно корявом английском), рассказывающий примерно то же самое, что я тут описал.

В этой программе мы сначала определяем в служебной области памяти BIOS (сегмент 0040h) номер порта ввода/вывода для заданного СОМ (они расположены в самых первых адресах этого сегмента, каждый адрес порта занимает двухбайтную ячейку). Если там записаны нули, то порт не существует, если же он есть, то мы используем ассемблерную процедуру для установки линии RTS через прерывание Intl4. Подробнее об этом в книге, посвященной Windows-программированию, рассказывать не имеет смысла, интересующихся я отсылаю к литературе по ассемблеру и устройству PC ([13,15]).

Аналогичная Windows-программа называется RTSWIN и расположена в одноименной папке внутри папки Priloz4 на прилагающемся диске. Она работает также только под Windows 9х (относительно семейства NT см. пояснения далее). Написана она в виде консольного приложения, которое запускается по той же методе, что и описанная ранее DOS-программа. Всю информацию программа выдает в текстовое окно.

Отмстим две особенности этой программы. Во-первых, в ней используется "незаконный" переход на метку через оператор goto, которым я, признаться, воспользовался с большим удовольствием. А вторая особенность связана с тем, что в Delphi, как указано в главе 20, структура осв транслируется не полностью. В частности, там отсутствует поле fRtsControl, через которое можно управлять режимом линии RTS, зато имеется поле Flags, через биты которого и предлагается в том числе этот режим устанавливать. Последнее не очень удобно (есть опасность что-то порушить по соседству), но опыт показал, что ничего страшного не случается, если сделать все, как надо. Сначала через Flags там устанавливается режим управления дополнительными линиями (константа rts control handshake = $юо), при этом само управление осуществляется через функцию EacapeCommFunct ion, вот так:

tpDCB.Flags:=(tpDCB.Flags and $FFFFC0FF) or $00000100; SetCommState( pCOM, tpDCB); // Reset RTS

if ch=’-‘ then EscapeCommFunction(pCOM, CLRRTS); // Set RTS

if ch=’+’ then EscapeCommFunction(pCOM, SETRTS);

Теперь главный вопрос — а почему все это не работает в Windows семейства NT? На самом деле приведенная процедура вполне будет работать в любой Windows (и обязана это делать, т. к. функции Win32 везде одинаковые), но NT тщательно следит за тем, чтобы все ресурсы использовались каждой программой независимо от других. Если запустите указанную программу в ХР (удалив, естественно, из нее условие выбора ОС), то изначально установленный, например, в состояние с отрицательным уровнем вывод RTS на долю секунды перейдет в положительное состояние, а потом, когда программа закончит работу, вернется обратно в исходное. То есть установка вывода порта действует только на время работы программы. Отсюда методика управления выводом RTS в семействе NT может быть только такой: если ваше устройство использует вывод RTS для питания, то прилагаемая к нему программа должна устанавливать этот вывод самостоятельно каждый раз при запуске. Для такой установки можно использовать указанную процедуру из утилиты RTSW1N.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии