Реферат: Ещё раз о прямом доступе к аппаратуре

Зато этот код успешно отработал из-под гостевой учетной записи под 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));

Result := (eStatus and MS_CTS_ON) > 0;

finally

// не забудьте закрыть хендл по завершению работы

Win32Check(CloseHandle(eFileHandle));

end;

end;

Впрочем, этот пример элегантным уже не назовешь, т.к. использование COM-порта дает возможность избавиться от периодического опроса, используя асинхронную работу через WaitCommEvent и WaitForMultipleObjects.

Ниже приведен код примера. Для пояснения сути происходящего код обильно прокомментирован. Но все-таки обращу внимание на некоторые нюансы:

WaitForMultipleObjects ждет бесконечно. Никаких периодических опросов — значит и никакого потребления ресурсов. Всё реализовано на событиях.

Нет необходимости в TerminateThread для принудительного прекращения выполнения потока. Выполнение может быть «культурно» завершено в любой момент. Для этого используется отдельное событие.

К-во Просмотров: 193
Бесплатно скачать Реферат: Ещё раз о прямом доступе к аппаратуре