Короткий и элегантный код, не правда ли? Для решения
поставленной задачи достаточно опрашивать состояние порта раз-другой в секунду.
В принципе, конечно же, лучше сразу открыть порт при старте, а закрыть по
завершению.
ПРЕДУПРЕЖДЕНИЕ
К сожалению, не удастся открыть порт в
режиме FILE_FLAG_OVERLAPPED, чтобы затем использовать преимущества
асинхронной работы. Точнее, порт открыть удастся, не удастся получить событие
при изменении статуса линий порта.
Зато этот код успешно отработал из-под
гостевой учетной записи под Windows XP.
|
Последний нюанс — дребезг контактов. «Дребезг
контактов — это явление многократного неконтролируемого замыкания и размыкания
контактов в моменты их соприкосновения и расхождения». Длятся такие переходные
процессы в кнопках около 10-15 миллисекунд. Т.е. с большой вероятностью мы
будем получать ложные срабатывания нашего кода, если интервал между проверками
будет короче.
Надеюсь, этот пример работы с LPT-портом послужит
хорошей демонстрацией того, как во многих случаях легко получить легальный
доступ к аппаратуре без написания драйверов или обхода Hardware Abstraction
Layer. Не для того этот HAL придумывали, чтобы его обходить.
Доводилось читать о случаях захвата порта спулером
печати, но на практике такую ситуацию встретить не удалось. Если кто-нибудь
сможет прояснить этот вопрос, я буду рад.
ПРИМЕЧАНИЕ
Кстати, в середине страницы http://cooler.irk.ru/cl190902.html
изложено достаточно интересное письмо, в котором описывается работа с портом
в режиме IEEE_COMPATIBILITY. Такой режим позволяет с минимумом телодвижений
обеспечить полноценный вывод данных на самодельное LPT- устройство.
|
COM
При использовании COM-порта задача обнаружения
внешнего события может быть решена ещё проще. Достаточно замыкать/размыкать
контакты 7 (RTS) и 8 (CTS) у девятиконтактного разъема (опять ничего не
придется паять) и проверять наличие сигнала CTS. Причем опрос можно производить
через стандартный CommApi.
Пример кода
function GetComStatus: Boolean;
var
eFileHandle: THandle;
eStatus: DWORD;
begin
// откроем порт
eFileHandle :=
CreateFile('COM1', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
Win32Check(eFileHandle <>
INVALID_HANDLE_VALUE);
try
// узнаем состояние
Win32Check(GetCommModemStatus(eFileHandle, eStatus)); Рекомендуем скачать другие рефераты по теме: экзамены, реферат на тему мир.
Предыдущая страница реферата | 1
2
3
4
5
6 | Следующая страница реферата
|
|