Как узнать адрес lpt порта windows xp

Обновлено: 06.07.2024

Работа с LPT-портом в Win NT/2000/XP

LPT-порт имеет 12 выходных и 5 входных линий. Такое довольно большое количество линий делает возможным подключение к порту несложной аппаратуры, возможно даже не имеющей своего микроконтроллера. Поэтому этот порт, несмотря на исчезновение принтеров с LPT-интерфейсом, активно используется для подключения простых программаторов микросхем памяти, JTAG-интерфейсов для перепрошивки (замены программного обеспечения) спутниковых рессиверов, DVD-плееров и другой электронной техники. Популярен LPT-порт и у моддеров, поскольку позволяет подключить к компьютеру LCD-дисплеи без изготовления сложных плат-интерфейсов.

Windows 2000/XP не позволяет приложениям обращаться к портам ввода-вывода напрямую. Для этого нужно использовать драйвер, работающий в KERNEL-mode (в режиме ядра операционной системы).

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

Интересно, что для процессора Intel x86 можно написать драйвер, использующий один из двух принципиально разных подходов. Первый вариант - драйвер сам обращается к портам, а прикладная программа только указывает драйверу, что делать. Этот вариант в общем случае является стандартным и предпочтительным.

Для решения проблемы существуют четыре популярных варианта драйверов, позволяющих прикладной программе обращаться к портам ввода-вывода: драйвер DLPortIO, драйвер UserPort, драйвер GiveIO.sis, драйвер Port95nt.

Все четыре варианта практически равноценны.

Драйвер DLPortIO

Собственно драйвер состоит из двух составляющих:
• DLPortIO.dll - Win32 DLL, обеспечивающая аппаратные функции ввода/вывода и
• DLPortIO.sys - драйвер для WinNT, работающий в режиме ядра ОС (не требуется для Win95/98)

В установочном пакете драйвера, помимо этих двух компонентов, есть ещё файл Install.exe, перемещающий два вышеназванных в папку драйверов Windows и регистрирующий их в системе.

Больше писать про этот драйвер и нечего. Настройка не требуется. Скачали, установили, пользуемся. Не забываем заглянуть в конец статьи и почитать о дополнительных мерах обеспечения работоспособности LPT-порта.

Установка элементарная - запускаем файл Install.exe, устанавливаем. По окончанию установки заглядываем в папку C:\Windows\System32\drivers и проверяем наличие двух файлов драйвера (DLPortIO.sys и DLPortIO.dll). Если видим, что эти файлы так и не скопировались, берем их из установочного пакета и копируем вручную. Не переживайте, с компьютером ничего плохого не случится. Перегружаем компьютер и работаем с LPT-портом.

Драйвер UserPort

Драйвер UserPort открывает доступ к портам в Win NT/2000/XP для программ. Этим вариантом драйвера LPT-порта чаще всего пользуются "технари", работающие с программаторами и JTAG'ами, поскольку драйвер имеет хоть какие-то конфигурирующие настройки. Для работы программ обслуживания LCD-индикаторов его так же можно использовать.

В архиве драйвера имеются три файла:
• UserPort.sys - драйвер для WinNT, работающий в режиме ядра ОС,
• UserPort.exe - программа для настройки драйвера и
• UserPort.pdf - файл описания.

Установка UserPort:
• 1. Распакуйте архив в отдельную папку.
• 2. Скопируйте файл UserPort.sys в C:\Windows\System32\drivers

Настройка UserPort:
• Запустите UserPort.exe.
• Перед нами появится панель с 2-мя окошками.


Defaults Setting

Левое окошко относится к работе программы в ДОС окне, правое на полном экране. По умолчанию в них прописаны номера портов LPT - все их можно удалить с помощью кнопки "Remove". В оба окна нужно вписать нужные номера портов, которые планируется использовать.

Для использования с драйвера с большинством программаторов, JTAG'ов и программ обслуживания дисплеев, добавьте в левую колонку следующие параметры:
378, 379 и 37A для LPT1
278, 279 и 27A для LPT2 (Если в BIOS'е переназначен адрес LPT-порта).

Поясню, что означают цифры. 0x378 - это адрес порта.
• Адрес 0x378 называется базовым и служит для записи и чтения данных в порт и из порта, по шине данных D0-D7.
• Адрес 0x379 (базовый+1) предназначен для чтения битов состояния из устройства, подключеного к LPT-порту.
• Адрес 0x37A (базовый+2) служит для записи битов управления устройства, подключенного к LPT-порту.


UserPort Setup

Заходим в Панель Управления , Система , выбираем закладку Оборудование , Диспетчер устройств , заходим в Порты (COM и LPT) и смотрим свойства LPT порта, по которому вы хотите установить соединение. В Свойствах открываем закладку Ресурсы и смотрим значение параметра Диапазон ввода/вывода (I/O) . (Обычно в Windows XP оно равно 378 - 37F)


UserPort Start

Если при нажатии кнопки "Update" система уходит в перезагрузку, нужно пробовать запускать регистрацию драйвера в системе с правами администратора или попытаться временно отключить файрволл или антивирус, которые могут блокировать вмешательство в системные процессы. Если что-то не получилось, читайте UserPort.pdf

Для проверки, появился ли доступ к портам, можно запустить программу "lpt-test.exe".

После старта программы появится окно со следующим содержанием:


LPT Test Ok

Тестируется порт LPT1 (Адрес 378h)

Отсутствует порт LPT2

Отсутствует порт LPT3


LPT Test not correctly

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

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

Драйвер GiveIO.sys

В далеком 1996 году американский программист Дейл Робертс, провел серию экспериментов, результатом которых стал драйвер GiveIO.sys. До сих пор этот драйвер остается одним из популярных инструментов, позволяющих прикладной программе обращаться к портам ввода-вывода.

Сам автор драйвера настоятельно рекомендует использовать этот драйвер только в отладочных целях. Окончательная версия прикладной программы должна вместо самостоятельного обращения к портам ввода-вывода, поручить это дело драйверу, написанному специально для этих целей. Драйвер должен вести себя "корректно", проверяя, не используется ли уже устройство каким-нибудь другим приложением.

Однако, если вы абсолютно уверены в том, что требуемые порты ввода-вывода никто кроме вас не использует (например, у вас нет принтера, подключенного к LPT), вы можете спокойно пользоваться драйвером GiveIO.sys.

Установка драйвера:

Вопрос редактора реестра


• 4. Перегружаем компьютер и проверяем работу программ, пользующихся драйвером.

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

Например - драйвер GiveIO.sys при наличии файла с "информацией об оборудовании" GiveIO.inf можно установить через апплет "Установка оборудования".


Установка оборудования

Драйвер GiveIO.sys мы покажем операционной системе, чтобы она поверила в существование оборудования "GiveIO".

Помимо вариантов "ручной" установки драйвера, написано несколько вариантов инсталлятора, выполняющего установку в автоматическом режиме.

Драйвер Port95nt

Термин "драйвер Port95nt" здесь будет не совсем корректен. По сути, это тот же драйвер DLPortIO из пакета DriverLINX от Scientific Software Tools, Inc, только в полном варианте, с парой утилит управления портом, с описанием и множеством примеров для программистов. Рядовому пользователю никакой пользы от дополнительных компонентов нет, а компоненты драйвера DLPortIO.sys и DLPortIO.dll абсолютно такие же, как и в сокращённой версии.

Упомянул о Port95nt, как о драйвере, по двум причинам. Первая - для полноты перечня встречающихся в интернете упоминаний о драйверах LPT-порта.

Вторая причина - в некоторых случаях могут быть проблемы с установкой сокращённой версии DLPortIO под WinXP. Обычно, но нечасто, это происходит в урезанных "авторских" сборках WinXP. В таком случае можно взять полную версию инсталлятора (1.5МБ). Хотя, по моему мнению, быстрее получится вручную положить в нужную папку DLPortIO.sys и DLPortIO.dll, чем заморачиваться с подбором инсталлятора, который сможет это сделать за вас.

Дополнительные меры

Кроме установки одного из вышеназванных драйверов, для нормальной работы порта LPT под ОС WinXP необходимо сделать правку реестра с помощью REG-файла xp_stop_polling.reg (xp_stop_polling.rar - 0,48kb)

Под WinXP иногда нестабильно работают устройства, использующие LPT-порт. Причиной таких сбоев может быть работа подсистемы Plug-and-Play (PnP) в Windows, периодически опрашивающей LPT с целью обнаружения подключенных устройств. Такой опрос производится при загрузке системы, но оно может происходить и при работе. К сожалению, драйвер DLportIO.sys и другие варианты драйверов не блокируют доступ к LPT от других программ при работе с портом клиента данного драйвера и подсистема PnP уверена, что порт не занят, обращается к нему и нарушает работу внешних устройств. Для устранения проблемы и служит REG-файл xp_stop_polling.reg. Этот файл прописывает в реестре Windows ключ, запрещающий такой опрос (poll) во время работы системы.

Помимо установки драйвера и ограничения одновременного доступа к порту для программ, для обеспечения аппаратной совместимости и нормальной работы оборудования с LPT-портом, необходимо в BIOS выставить правильный адрес и режим работы порта ("Normal", SPP или ЕРР, но не ECP).

Конфигурированию через BIOS Setup подлежат следующие параметры:

• Базовый адрес, который может иметь значение 378h, 278h и 3BCh. При инициализации BIOS проверяет наличие портов по адресам именно в этом порядке и, соответственно, присваивает обнаруженным портам логические имена LPT1, LPT2, LPT3. Адрес 3BCh имеет адаптер порта, расположенный на плате MDA или HGC (предшественники современных видеокарт). Большинство портов по умолчанию конфигурируются на адрес 378h и могут переключаться на 278h.

• Используемая линия запроса прерывания, для LPT1 обычно используется IRQ7, для LPT2 - IRQ5. Во многих "настольных" применениях прерывания от принтера не используются, и этот дефицитный ресурс PC можно сэкономить. Однако при использовании скоростных режимов ЕСР (Fast Centronics) работа по прерываниям может заметно повысить производительность и снизить загрузку процессора.

В то же время, режим ЕСР нельзя использовать с устройствами, требующими жёстких таймингов (программаторами и JTAG-интерфейсами).

В завершение немного о терминологии:

Лет 10-15 назад параллельный порт был довольно востребованным интерфейсом для связи между устройствами. Сегодня производители различных устройств отдают предпочтение последовательным интерфейсам. Тем не менее, и сегодня LPT порт всё ещё можно встретить. А некоторые разработчики ещё пишут под него программы (или поддерживают написанные во времена расцвета параллельных интерфейсов). Но в компьютерах сейчас LPT порт – достаточно большая редкость. Существуют, конечно, платы расширения для компьютера, которые реализуют интерфейс LPT. Они в основном представляют собой платы на шине PCI. К сожалению, далеко не весь софт, который был написан для интегрированных в материнскую плату LPT портов, будет работать с LPT-PCI-платами.

1 Установка драйвера для работы с LPT портом

В приложенном архиве находятся две папки – для 32-разрядной и для 64-разрядной версий Windows. В одной из папок лежит файл InstallDriver.exe. Сначала запустите этот файл, он установит динамические библиотеки в систему. После этого компьютер следует перезагрузить.

Чтобы использовать предлагаемый драйвер, файлы inpout32.dll и inpoutx64.dll должны располагаться в одной директории с исполняемым файлом вашей программы.

2 Программный класс использования библиотек работы с LPT портом

Упомянутые библиотеки написаны не мной. Я предлагаю удобный класс-оболочку, упрощающий работу с данными библиотеками. Кроме того, автор библиотек в файле readme.txt сообщает, что его драйвер не поддерживает PCI устройства. Мне удалось его запустить для работы как с интегрированным параллельным портом, так и LPT портом, реализованном в виде платы расширения на шине PCI-Express. Причём порт отлично работает и на современной Windows10 x64, и на более старых системах.

Если мы посмотрим на список экспортируемых функций библиотеки inpout32.dll с помощью замечательного инструмента DLL Export Viewer от NirSoft, то увидим следующую картину:

Список экспортируемых функций библиотеки inpout32.dll

Список экспортируемых функций библиотеки inpout32.dll

Это список функций, которые мы можем использовать. Фактически все они используются в классе LPT, но реализация скрыта, и из публичных методов пользователю доступны только два метода и одно свойство (они рассматриваются чуть далее).

При инстанцировании класс сам определит, библиотеку какой разрядности ему использовать – inpout32.dll или inpoutx64.dll. Поэтому от пользователя не требуется никаких действий по инициализации или определения разрядности используемой dll. Вы можете сразу записывать или читать из LPT порта. Одно «Но»: если драйвер не установлен, обращение к любому из методов динамической библиотеки вызовет исключение, поэтому рекомендую использовать блоки Try…Catch для перехвата и обработки исключений.

Несколько примеров использования класса LPT.

Для определения, используется ли 64-разрядная версия драйвера (inpoutx64.dll при True) или 32-разрядная (inpout32.dll при False) (на самом деле, это знать не обязательно, класс использует именно ту библиотеку, которая нужна, но вдруг вам для чего-то понадобится это узнать из своей программы):

Для записи числа "123" в регистр контроля LPT порта вызовите из своего класса:

Для чтения одного байта из регистра данных LPT порта и чтения регистра статуса:

Здесь currentPort – адрес LPT порта. Причём, если у вас интегрированный LPT порт, то его адрес будет, скорее всего, 378h. А если у вас LPT порт на плате расширения, то адрес будет другой, например, D100h или C100h.

Чтобы узнать адрес LPT порта, зайдите в диспетчер устройств Windows, найдите раздел Порты COM и LPT, выберите используемый параллельный порт, и в окне свойств (щёлкнув по нему правой кнопкой мыши) посмотрите, какие ресурсы использует выбранный порт (необходимо брать первое значение из диапазона).

Ресурсы, используемые LPT портом, в диспетчере устройств Windows

Ресурсы, используемые LPT портом, в диспетчере устройств Windows

Например, в данном случае необходимо использовать номер порта C100.

Похожие материалы (по тегу)

Другие материалы в этой категории:

8 комментарии

Мне кажется, что для решения вашей задачи со сканером это решение не подходит, и запустить старый сканер не получится. Потому что придётся самому переписывать софт для сканирования. Ваша задача должна решаться как-то на уровне драйвера порта или той программы, которая используется для сканирования. Может быть, есть обновлённые драйверы для сканера с возможностью указывать адрес порта. А может проще найти старый комп, где на материнке присутствует LPT. Кстати, Asus до сих пор выпускает материнские платы с LPT под более-менее современные процессоры, например, модель H81M-C.

Спасибо тебе, добрый человек. Установка этого драйвера и замена inpout32.dll в директории исполняемой программы, помогли запустить софт, который ранее работал только на Win XP из под Win 10x64

Василий, рад, что помог!

Как программно узнать адрес LPT-порта в Windows-98, Windows XP, Windows 7?

Подозреваю, что как-то через ключи реестра.
Но обширно погуглив, ответа так и не нашел.

Именно базовый адрес адрес LPT-порта , а не принтера по умолчанию.


Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия

Я, честно говоря, знаю, где в реестре прописаны свойства LPT-портов на моей машине,
но с этим есть разночтения.

Вот, к примеру, совет на одном из зарубежных сайтов:

why you not reading the parallel port-address from windows registry ?

In LogConfig are (device driver resource list) information of port-address.

Вся засада в том, что на моей машине в этих ключах прописаны вовсе не LPT-порты, а вот как
выяснить - по какому принципу заносятся данные о портах в ключи.

Впрочем, в Windows XP эти ключи вроде как и совсем другие.


Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия На сайте М$ в ответ на похожий вопрос:"How to find I/O range for given LPT Port programatically?"
разводят очень густой туман.
These two WMI classes would be helpful: Win32_PortResource and Win32_ParallelPort, you can also find the C++ WMI samples in that category.
The Win32_PortResource WMI class represents an I/O port on a computer system running Windows.
The Win32_ParallelPort WMI class represents the properties of a parallel port on a computer system running Windows.

Но WMI class похоже, что работает только начиная с Minimum supported client - Windows XP.

В Linux в процессе загрузки действия протоколируются, после загрузки протокол можно посмотреть командой dmesg. Может, что-то наподобие можно сделать и в Windows?

Вот пример с моего компа. grep позволяет выбрать нужные строки по шаблону из вывода команды dmesg:

Image


Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия В Linux в процессе загрузки действия протоколируются.

В Linux, как я прочитал роясь в поиске, этот вопрос решается более просто и имеет
конкретное решение.

В принципе - вопрос советуют решать корректно примерно так:

Поскольку параллельные порты имеют известные адреса:
3BCh, 378h, 278h
то чтобы убедиться в наличии порта, по этим адресам записывают число, после чего
считывают его и если записанное = считанному, то есть некая уверенность в наличии
порта.

В принципе - не очень хорошо, если на порте висит принтер.

Но дело в том, что в ноутах сейчас этих портов нет. А есть только УСБ.
Поэтому LPT-порты эмулируются вот такими гаджетами:

Image

Если повезёт при покупке, они могут эмулировать LPT-порт прямо на уровне регистров,
но вся неприятность в том, что по включению базовый адрес такого "LPT-порта" вовсе
не ложится в привычные 3BCh, 378h, 278h. ,
а устанавливается в верхние адреса портов, причем в разные.

Вот эту ситуацию я (и многие в сети, как я увидел) пытаюсь разрешить, поскольку
к новому ноутбуку я такую USB2LPT приблуду приобрел.

DLL строится нормально, а если смотреть в отладчике, то указатели не показывают на адреса портов
и в строке lwAddr = *lplwAddr; - run time ошибка "Access Violation".

Помогите пожалуйста, что я сделал не так?

Заранее спасибо, Дмитрий.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Опрос LPT порта
Есть LPT порт и два контакта. Необходимо написать программу которая при замыкании контактов в.

Тестирование LPT порта
Здравствуйте. нашел в интернете код программы который может включить светодиод и отключить его.

Программирования LPT-порта
Помогите пожалуйста! Программирования Lpt-порта, надо Builder, если есть на других средах, то тоже.

Обработка LPT порта
Вечер добрый! Если кто работал с LPT в Builder, подскажите. Как связаться с ним, обрабатывать и.

Управление портами напрямую возможно только из уровня ядра. Адреса,по которым вы пытаетесь прочитать что-то - виртуальные и находятся в области "Нулевых Указателей" виндоус ( 0x0000 0000 - 0x 0000 FFFF ) Вы идете в корне неверным путем, смешивая старые подходы, которые годятся только для DOS, с новыми. Лучше расскажите, что именно Вам нужно сделать, тогда можно будет подсказать правильное решение. адрес lpt1 - 0x378
адреса остальных lpt тоже известны заранее

Более подробно. К LPT порту подключено устройство (что-то типа исполнительного механизма). Мне нужно определить, к какому LPT порту подключено устроойство и после этого читать биты ACK, BUSY, SEL, ERROR и послать данные на INIT, на STROBE и на D0-D7.
Мне известно, что когда BIOS назначает адреса LPT портов, он сохраняет базовые адреса этих портов по таким адресам:

0000:0408 для LPT1
0000:040A для LPT2
0000:040C для LPT3
0000:040E для LPT4

Действительно, адреса, например, LPT1 обычно 378h - 37Fh, но это не ввсегда так.
Для правильного определения адреса LPT1 нужно посмотреть в 0000:0408.

Отсюда и вовопрос. Как правильно прочитать данные по вышеуказанным адресам и
как послать и прочитать данные?

Читайте также: