Меню Рубрики

Работа с lpt портом в windows xp

Работа с lpt портом в windows xp

Итак, рассмотрим следующий вариант работы с портами ввода/вывода в ОС Windows NT. Этим «вариантом» будет специальный драйвер GiveIO.sys, который позволяет приложению, запустившему его, свободно работать с любыми портами. Этот драйвер написал Dale Roberts черт знает когда, но актуальности от не потерял до сих пор.

Главным достоинством этого драйвера, является то, что обращения к порту могут быть сделаны и с помощью функций, работающих только в Windows 9x!

В кратце расскажу как он работает: в начале работы нашей программы для общения с портами необходимо обратиться к драйверу GiveIO.sys. При этом он установит такие значения системного битового массива карты разрешения (I/O Permission Map) для нашего приложения, что для него будет разрешен прямой доступ к любым портам. I/O Permission Map — это составная часть системы защиты ввода-вывода Windows NT. Он представляет собой битовый массив, каждый бит которого соответствует порту ввода-вывода. Если бит = 1, то доступ к порту закрыт, если 0, то открыт. Для любого пользовательского приложения все биты установлены в 1, и соответственно мы не можем напрямую вмешаться в работу порта. GiveIO.sys внаглую «влезает» в этом массив и везде устанавливает 0 — т.е. мы получаем возможность обращаться к любому порту из приложения.

Итак, рассмотрим пример использования драйвера GiveIO.sys на практике.

Для начала скачиваем архив с драйвером и файлом установки:

Файлы к статье скачать
Имя: giveio.zip (ZIP архив)
Размер: 2.12 КБ

Теперь нам необходимо зарегистрировать и установить драйвер в системе. Для этого необходимо сделать ряд операций. Во-первых, копируем файл драйвера GIVEIO.sys в папку C:\Windows\system32\drivers\ если, конечно, система у Вас установлена на диск С:\ и вы не меняли пути установки Windows.

Далее запускаем файл install.reg При этом вы увидете примерно следующее сообщение:

Нажимаем Да. При этом вы получите сообщение об успешном внесении информации в реестр. Можно убедиться в этом. В программе редактора реестра regedit.exe в ветви HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\giveio можно увидеть следующее:

Для того что бы сделанные нами изменения вступили в силу в обязательном порядке нужна ПЕРЕЗАГРУЗКА КОМПЬЮТЕРА.

Настало время взяться за программирование. В код нашей программы Port.exe (см. статью 1) внесем некоторые изменения, которые позволят ей обращаться к портам не только в Windows 9x как было раньше, но и в Windows NT. Итоговый код примет вид:

Все. Компилируем, запускаем. Щелкаем 1-0: все должно работать. Если выскочило сообщение Error! Can’t open driver! Press any key to exit. , значит установка драйвера прошла неудачно, и его надо переустановить заново.

Источник

Работа с lpt портом в windows xp

Как я уже упоминал в первой статье, наша чудо-программа Port.exe не сможет работать под Windows NT. ОС данного семейства помимо кучи преимуществ перед предыдущими стали обладать омерзительным нравом с точки зрения системного программирования.

Да вы и сами могли в этом убедиться, пытаясь все таки запустить Port.exe в XP, который у вас наверняка и стоит. При этом вы получали следующее услужливое сообщение от Windows:

Происходит это из-за того что, разработчики NT с целью обеспечения безопасности использования совместных аппаратных ресурсов компьютера, запретили к ним прямой доступ из программ пользовательского режима (по сути дела из любых программ). Чтобы все-таки обратиться к порту, необходимо все операции проводить через драйвер (довольно хитрая программа, которую начинающему так сходу и не напишешь). Но к счастью, есть уже несколько готовых инструментов позволяющих без проблем общаться LPT портом в NT.

Начнем с начала с самого простого, и в тоже время очень мощного средства: библиотеки inpout32.dll.

Этот комплекс состоит из 3 файлов:

  • собственно самой динамической библиотеки inpout32.dll
  • статической библиотеки LIB, необходимой на этапе сборки программы
  • заголовочного файла с прототипами используемых функций

Скачать эти файлы можно (и нужно) по ссылке ниже:

Файлы к статье скачать
Имя: inpout.zip (ZIP архив)
Размер: 13 КБ

Библиотека эта импортного производства, подробнее о том кто ее писал и как она работает можно почитать вот по этому адресу: http://www.logix4u.net/inpout32.htm

Рассмотрим практический пример использования библиотеки inpout32.dll. Интегрирурем ее в консольное приложение (С++, Microsoft Visual Studio 6.0) для возможности управления LPT портом из под ОС семейства NT.

Как уже упомянуто выше, программу пишем на Си++. Подробный процесс создания проекта уже был рассмотрен в предыдущей статье, поэтому сейчас буду рассказывать короче. File -> New. Выбираем там Win32 Console Application. Указываем в поле Project name имя проекта, например Port32. Нажимаем Ok. В следюущем окне выбираем пункт An empery project и жмем Finish. Теперь опять File -> New. Отображается закладка Files. Выбираем там C++ Source File. В поле File name укажите имя Port32 для этого файла. Нажимайте Ok. Все, подготовительную работу выполнили, можно собственно писать программу. В левой части окна программы выбираем закладку FileView. В папке Source Files выбираем наш файл Port32.cpp

Рекомендуется не делать так, как показано на рисунке выше, а именно размещать файлы проекта в директории, путь к которой содержит кириллические символы. Visual Studio «переваривает» такую ситуацию нормально, но иногда попадаются программные продукты для которых кирилица в пути к файлу — непреодолимое препятствие.

А вот собственно и исходный код нашей программы. Копируем его и вставляем в содержмое файла Port32.cpp.

С удивлением смотрю сейчас по прешествии уже почти 5 лет на использование операторов cout и endl. Сейчас уже рука такое напись просто не поднимется.

Теперь необходимо подключить к нашему проекту файлы из комплекса inpout32. Сначала необходимо скачать архив с файлами библиотеки (см. ссылку выше). Потом копируем файлы h.h, inpout32.lib в папку нашего проекта. Далее выбираем Project -> Add to Project -> Files. В открывшемся окне отыскиваем папку проекта, выбираем там только что помещенный туда файл h.h и нажимаем Ок. Файл добавится в проект. Проделываем такую же операцию и для файла inpout32.lib.

После проведения этих операций, древо проекта должно иметь примерно такой вид, как на рисунке ниже.

Далее выбираем в меню программы Build ->Compile Port32.cpp, потом Build ->Build Port32.exe Если вы все правильно скопировали, то в самом низу должн появится отладочный вывод, сообщающий нам об успешном завершении процесса компиляции программы:

Теперь важный момент — программу пока не запускайте. «Забираемся» в папку нашего рабочего проекта. Там должна появиться папка Debug. В эту папку необходимо поместить файл inpout32.dll. Этот файл (DLL) должен быть всегда рядом (в одной директории) с нашей программой, иначе Port32.exe не сможет работать.

Так же следует указать что динамическую библиотеку можно поместить в любую директорию на вам компьютере, главное чтобы путь к этой директории был прописан в системной перменной PATH, которую мы имеем возможность свободно редактировать.

Вот теперь запускаем нашу программу Port32.exe и проводим ее тестирование с тем же оборудованием (светодиод в порту), которое использовалось в предыдущей статье. Если ошибок не было и все файлы находятся там где надо, мы с радостью наблюдаем, как светодиод синхронно моргает с нажатием клавиш 1 и 0. Как видно из кода, серьезных изменений программа не претерпела, просто все вызовы по выводу в порт проходят через функцию Out32().

Источник

Учимся работать с LPT портом

Доброго времени суток кодеры, и остальные маньяки компьютерной индустрии. Сегодня я расскажу тебе как можно управлять LPT портом и использовать его в своих целях. Так что запасайся сникерсами и терпением. В конце я покажу интересный пример его использования.

LPT порт имеет 25 контактов на которых может быть установлено 0 или +5В (0 или 1). Устанавливать значения можно программным путем или с помощью внешнего устройства. Давайте рассмотрим следующий рисунок который поможет нам в работе.
(Сразу признаюсь, рисунок не мой, он взят с сайта ]]> www.pcports.ru ]]> , где есть много информации на данную тему).

Как мы видим, выводы порта можно разделить на четыре группы. Восемь крастных выводов относятся к регистру Data . Чтобы к нему обращаться, надо знать его адресс: 378h — в 16-ричной системе или 888 — в 10-ричной. Биты этого регистра могут быть установлены (или сброшены) как программно, так и внешним устройством.
Выводы обозначенные черным цветом являются земляными. Все они соединены между собой и для наших целей мы можем использовать любой.
Зеленым цветом обозначены контакты, устанавливать значение которых можно только через внешнее устройство. То есть программно мы их изменить не можем. Мы можем только считывать их состояние. Они относятся к регистру Status , который имеет адрес 379h в 16-ричной или 889 в 10-ричной системе.
И регистр Control , выводы которого обозначены синим цветом. Он как и регистр Status однонаправленный, но тут его состояние изменять можно только программно.
Ну что, надо бы и на практике закрепить. Давай вспомним старый, добрый Ассемблер. Для работы с портами он предоставляем нам две команды: in и out . Команда in загружает данные в аккумулятор из порта устройства ввода/выводы. Пример:

n аккумулятор, порт.

В этом случае можно выводить из портов с адресами до 255. Нам этого недостаточно. Используя регистровую адресацию можно выводить из портов до 65536. Вот пример:

То есть адрес порта должен быть заранее помещен в регистр dx. Команда out наоборот — помещает в порт данные из аккумулятора. Пример: out dx , аккумулятор. Здесь также используется регистровая адресация, что бы можно было работать с портами, адреса которых до 65536. Теперь запускаем наш любимый Делфи, ставим на форму кнопку и по событию ее нажатия пишем следующий ассемблерный код (это называется ассемблерная вставка (примечание Soffrick’а — Inline assembler ) и она записывается между ключевыми словами asm и end ):
(этот пример не будет работать в Windows NT. Потом расскажу как это побороть)

Теперь обьясню чего мы добились. Давай посмотрим на наш рисунок, а точнее на красные разьемы которые соответствуют битам от D0 до D7 регистра Data. А теперь угадай какой из них мы установили в 1. Правильно, бит D0, а следовательно и контакт №2 установлен в 1. А это значит, что на этом контакте сейчас находится +5 Вольт. Проверяется легко. Нужно взять светодиод и его «+» засунуть во второй контакт, а его «-» в 25-й (тоесть заземлить). Вот тут я должен тебя предупредить, что подключение к LPT порту всяких самодельных устройств (сделанных не грамотно) может обернутся выходом из строя материнской платы. Обычно длинный усик светодиода — это «+» (лучше проверить это с помощью батарейки). Наш светодиод должен загореться. Но вот не задача. Наша программа при нажатии на кнопку ругается. Дай угадаю, у тебя винда не 9х.

Дело в том, что ОС Windows NT (2000, XP) с целью обеспечения безопасности использования совместных аппаратных ресурсов компьютера, запрещает к ним прямой доступ из программ пользовательского режима. И чтобы обратиться к порту, необходимо все операции проводить через драйвер. Я предлагаю использовать библиотеку Inpout32.dll. Скачать ее можно здесь ]]> http://www.pcports.ru/files/inpout32.rar ]]> . Эта библиотека, при работе с NT, обращения к ней конвертирует в запросы к стандартному драйверу ОС, через который и идет обмен данными с портом. Узнать больше об этой библиотеке и ее авторе можно здесь: ]]> http://www.logix4u.net/inpout32.htm ]]> . Эта библиотека содержит две следующие функции которые нам пригодятся. Вот их описание:

Inp32(PortAdr: word): byte.

Ей передается адрес порта, а она возвращает значение которое в нем установлено. Внимание, значение передает в десятичной системе. Следующая функция:

Out32(PortAdr: word; Data: byte): byte.

Из описания видно что она тоже может возвращать какой то результат, но нам это не понадобится. Она отсылает в указанный порт указанное значение (тоже в 10-чной сис.). Снова открываем наш отчаянно закрытый после первой попытки Делфи и делаем следующее. Нам необходимо объявить функции из библиотеки. Для этого в нашем исходнике после перечня модулей и перед объявлением типов пишем следующее:
.

.
Здесь мы объявили две функции. Указали, что вызываться они будут стандартным способом (написав stdcall), а также мы указали, что процедура внешняя и находится в библиотеке (external ‘inpout32.dll’).Кстати, эта библиотека должна находиться в папке вместе с исполняемым файлом. Далее кидаем на форму кнопку и по ее нажатию пишем:

Компилируем, запускаем и о чудо, загорелся наш светодиод. А теперь давай вспомним «маску» (00000001) из предыдущего примера. Наша единица, которая передается во втором параметре в порт 888 (регистр Data) в 10-чной сис. равносильна 00000001 в 2-чной. То есть, если взять еще два светодиода, и «+» одного засунуть в 3-й контакт LPT порта, а «+» другого, например в пятый, а ихние минусы конечно заземлить подключив к 25-му выводу, то для того что бы их все зажечь, надо во втором параметре функции Out32 отправить на порт 11: Out32(888,11), потому что 11, в двоичной системе будет выглядеть так 00001011. Непонятно? Попробуй эти нолики и единички визуально наложить на рисунок, начиная с девятого контакта и до 2-го. Теперь не сложно догадаться, что на контактах 5,3 и 2 будет установлено напряжение +5В и наши светодиоды, которые мы туда засунули, будут гореть. Теперь мы можем сделать что-нибудь по интереснее, например мигалку. Используя таймер это не сложно сделать. Попробуй сам.

Ну вот вроде бы и все, что я хотел тебе рассказать сегодня. В следующей статье я расскажу как сделать так, что бы радиоуправляемая машинка управлялась не с пульта, а с клавиатуры. Удачной компиляции.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Работа с linux разделами в windows
  • Работа с hfs в windows
  • Работа с ext2 в windows
  • Работа с bat файлами windows
  • Работа программ windows в linux