Ещё раз о прямом доступе к аппаратуре
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: отчет о прохождении практики, ценные бумаги реферат
| Добавил(а) на сайт: Apraksin.
1 2 3 4 5 6 | Следующая страница реферата
Ещё раз о прямом доступе к аппаратуре
Сивцов Павел
Преамбула
Однажды мой знакомый попросил написать ему простую программу — «сторожевой пёс». Всё, что нужно делать — это отловить момент размыкания или замыкания внешнего контакта и при наступлении такого события запустить другую программу. Работать программа должна под Windows XP. Задача выглядела элементарной. Единственное, что не хотелось делать — аппаратную часть. Т.е. лучше всего было бы найти такое решение, при котором почти ничего не нужно было бы паять.
Достаточно быстро выяснилось, что проще всего для такой цели использовать опрос состояний LPT- или COM-портов. Тут и начинается самое интересное.
LPT
Для реализации «сторожевого пса» на LPT-порту можно использовать периодический опрос состояния некоторых его контактов. Можно просто выявлять состояния линий SELECTED (контакт 13), BUSY (контакт 11) и PAPER EMPTY (контакт 12). Достаточно замыкать/размыкать выбранный контакт с «землей» (контакты 18–25). Я выбрал использование BUSY — замыкал контакты 11 и 23. Итак, аппаратная часть получалась элементарной, теперь нужно было как-то достучаться до выбранного контакта с программной стороны. Тут-то и встретилась первая сложность — легальных способов прямого доступа к портам в линейке Windows NT нет. Использовать примочки типа gwio.sys, разрешающие прямой доступ к аппаратуре, очень не хотелось. Работа с портом как с файлом в данном случае не подходит, т.к. нужно не данные читать, а опрашивать состояния. Тем не менее, после длительного изучения MSDN, легальный доступ к некоторым линиям порта был обнаружен! Способ этот — доступ к порту через функцию DeviceIoControl(…, IOCTL_PAR_QUERY_INFORMATION, …). Тут обнаружилась вторая сложность — отсутствие нужных заголовочных файлов для Delphi. Пришлось самостоятельно портировать ntddpar.h из DDK. Портированный файл получил название JwaNtDdPar.pas и был любезно добавлен Marcel van Brakel в JEDI Windows API Library.
Небольшой пример демонстрирует итоговый код. Delphi 7.
Пример кода
uses SysUtils, JwaWinType, JwaWinNT, JwaWinBase, JwaNtDdPar; {$WARN SYMBOL_PLATFORM OFF} function GetLptStatus: Boolean; var eFileHandle: THandle; eInfo: TParQueryInformation; eBytesReturned: DWORD; begin // откроем порт eFileHandle := CreateFile('LPT1', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0); Win32Check(eFileHandle <> INVALID_HANDLE_VALUE); try // узнаем состояние Win32Check(DeviceIoControl(eFileHandle, IOCTL_PAR_QUERY_INFORMATION, nil, 0, @eInfo, SizeOf(eInfo), @eBytesReturned, nil)); Result := (Byte(eInfo.Status) and PARALLEL_BUSY) = 0; finally // не забудьте закрыть хендл по завершению работы Рекомендуем скачать другие рефераты по теме: экзамены, реферат на тему мир. Категории:1 2 3 4 5 6 | Следующая страница реферата Поделитесь этой записью или добавьте в закладки |