Добрый день!
В который раз обращаю свое внимание на статьи по управлению
или подключению устройств через LPT порт.
И в очередной раз вижу, как разработчики всего этого добра
наступают на одни и те же грабли.
Не для того Hardware Abstraction Layer существует в Windows
NT, чтоб его обходить всякими драйверочками и затычками вроде
gwio.sys.
Дело вот в чем. Большинство подобных разработок используют
этот fake для вывода непосредственно в порт. Такой подход
заставляет пользователя все же думать, как в старые времена
DOS, о ресурсах системы, кроме того этот подход ограничивает
пользователя в железе, ну и наконец приводит железо и ОС к
нестабильности вследствие обхода стандартных средств управления
ресурсами.
Я уже как-то раз вам писал, что все это можно решить правильно
и достаточно просто, необходимо лишь почитать документацию
DDK и протокол IEEE 1284 (LPT в его нынешнем виде).
Обратите внимание на то, как работает режим IEEE_COMPATIBILITY
порта. Обратите внимание на алгоритм:
1. Ожидание, пока флаг BUSY не станет равным
0.
2. Установка STROBE в 0 (инвертированное значение).
3. Ожидание, пока флаг BUSY не станет равным 1.
4. Установка STROBE в 1 (инвертированное значение).
И так, вы видите, что для вывода байта данных вам просто
необходимо подавать инвертированное значение вывод STROBE
на вывод BUSY. Для этой цели я использовал первое, что попалось
под руку - 155ЛА3.
Теперь немного о том, как переключить порт в режим IEEE_COMPATIBILITY:
#include <ntddpar.h>
NeogationMask.usReadMask = NONE;
NeogationMask.usWriteMask = IEEE_COMPATIBILITY;
if (! DeviceIoControl(Handle, IOCTL_IEEE1284_NEGOTIATE,
& NeogationMask, sizeof NeogationMask,
& NeogationMask, sizeof NeogationMask,
& BytesReturned, NULL))
throw;
Файл ntddpar.h необходимо взять из состава Windows 2000 DDK.
Не обязательно качать весь DDK. Microsoft дает возможность
скачать его по частям. В данном случае это архив хидеров.
Не мало важно, что на данный порт не занимал драйвер принтера,
имеющий склонность к захвату всего трафика на порт и его попытки
печати. Порт просто не переключится в режим IEEE_COMPATIBILITY.
Вывод в порт осуществляется теперь совсем просто:
DWORD BytesWritten;
WriteFile(Handle, & Value, sizeof Value, & BytesWritten,
NULL);
Вот и все!
Для чего использую это я? Вспомните статью от 6 января 2001
года о LCD. Один из таких на HD44780 достался мне как-то,
но еще в 2000 году. Я долго экспериментировал с выводом на
него и пришел вот к такой схеме. Однажды, заметив вашу статью,
я сходил по адресу LCDriver-а. Закончилось все тем, что обвязав
собственные наработки API LCDriver-а, я добился совместимости
своей консоли с доступным ПО, которое поддерживает данный
API.
|