Параллельный порт pci драйвер windows 7. Драйвер для работы с LPT портом (интегрированным или в виде платы PCI). Программный класс использования библиотек работы с LPT портом

Весьма советуем с ним познакомиться. Там Вы найдете много новых друзей. Кроме того, это наиболее быстрый и действенный способ связаться с администраторами проекта. Продолжает работать раздел Обновления антивирусов - всегда актуальные бесплатные обновления для Dr Web и NOD. Не успели что-то прочитать? Полное содержание бегущей строки можно найти по этой ссылке .

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

LPT-порт (L ine P rinT er) - порт параллельного интерфейса, который изначально создавался для подключения принтера. BIOS обеспечивает поддержку LPT-порта, необходимую для организации вывода по интерфейсу Centronics. Адресное пространство порта занимает диапазон &H378-&H37F

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

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

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

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

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

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

Драйвер DLPortIO

DLportIO - драйвер доступа к портам из пакета DriverLINX от Scientific Software Tools, Inc. (http://www.sstnet.com) в сокращённом виде (без описания и лишней документации). Для нормальной работы программ обслуживания LCD-индикаторов можно порекомендовать именно этот вариант драйвера .

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

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

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

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

Если вдруг, в результате манипуляций с оборудованием, вы получите от драйвера сообщение такого плана: "dlportio.sys device driver not loaded. Port I/O will have no effect", не стоит паниковать. Исправляется эта проблема так:
. Запускаем regedit.
. Заходим в реестре в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ .
. В папке dlportio изменяем значение параметра Start на 1 .
. Перезагружаем компьютер.

Драйвер 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-мя окошками.

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

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

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

Добавляем так:
0x378-0x378
0x37A-0x37A



Добавлять адреса порта в список нужно через окно ввода и с помощью кнопки "Add". Адрес 0x379 чаще всего не нужен и его можно не вписывать, поскольку он предназначен для чтения битов состояния из устройства, подключеного к LPT-порту, а большинство устройств (программаторы, JTAG"и и LCD-индикаторы тем более) сигналы состояния не формируют. При желании можно наоборот вписать весь диапазон адресов, отведённых системой под LPT-порт 0x378-0x37F .

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

После формирования списка адресов, нужно нажать кнопку "Start", драйвер будет запущен и появится сообщение:



Затем нажать кнопку "Update", при этом драйвер будет зарегистрирован в системе, затем "Exit". Разумеется, кнопку "Stop", пока мы пользуемся драйвером, нажимать не нужно.

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

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

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



Отсутствие сообщения "Тестируется порт LPT (Адрес XXXh)" и последующих за ним строк говорит о том, что драйвер не работает.

Эта программа просто посылает в регистр данных Dx и регистр управления Ux порта LPT различные числа, а потом их же считывает. Регистр статуса Sx порта LPT только считывается. На экран выводится номер и адрес тестируемого порта LPT. Если порт исправный, то для регистров Dx и Ux не должно выдаваться никаких сообщений.



LPT-TEST v1.03 1995-2003 Copyright (C) С.Б.Алеманов. Москва "БИНАР".
Во время тестирования к портам не должно быть подключено периферийных устройств.
Dx - рег. данных (out), Ux - рег. управления (out), Sx - рег. статуса (inp).

Тестируется порт LPT1 (Адрес 378h)
2-й контакт (D0) - нет "1"
3-й контакт (D1) - нет "1"
4-й контакт (D2) - нет "1"
5-й контакт (D3) - нет "1"
6-й контакт (D4) - нет "1"
7-й контакт (D5) - нет "1"
8-й контакт (D6) - нет "1"
9-й контакт (D7) - нет "1"
1-й контакт (U0) - нет "1"
14-й контакт (U1) - нет "1"
17-й контакт (U3) - нет "1"
1-й контакт (U0) - нет "0"
14-й контакт (U1) - нет "0"
17-й контакт (U3) - нет "0"
15-й контакт (S3) - нет "0"


Если регистры Dx или Ux неисправны, то выводится сообщение "нет 0" или "нет 1" и указывается номер контакта на LPT-разъеме (сигналы на этом контакте можно посмотреть осциллографом). На входе регистра статуса Sx может быть как "0" так и "1", но обычно, когда к порту LPT ничего не подключено, на всех входах регистра статуса имеется "1". Появление же на входе регистра статуса "0" может являться признаком того, что вход пробит, если раньше там всегда была "1".
На некоторых машинах, если регистр данных или регистр управления неисправны, то доступ к LPT-порту вообще не появляется. Видимо, BIOS при включении компьютера тестирует порт LPT и, если он неисправный, то отключает его.

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

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

Драйвер GiveIO.sys

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

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

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

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

1. Скачайте архив, распакуйте и скопируйте файл GiveIO.sys в каталог C:\Windows\System32\Drivers (подразумевается, что ваша Windows установлена в каталог C:\Windows) .
. 2. Запустите файл install.reg. На экране появится следующее сообщение:


. 3. Отвечаем утвердительно. При этом появится сообщение об успешном внесении информации в реестр. При желании, можно убедиться в этом. Запускаем редактор реестра regedit.exe и в ветви HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\giveio проверяем наличие следующих записей:


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

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

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




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

Скачать комплект файлов для такого варианта установки драйвера GiveIO.sys (giveio_sys_v2.rar - 78kb). Архив содержит файлы GiveIO.sys и GiveIO.inf, а так же подробную инструкцию по установке с иллюстрациями.

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

Скачать комплект файлов для автоматической установки драйвера GiveIO.sys (giveio_sys_install.rar - 28kb). Архив содержит файлы GiveIO.sys и instdrv.exe, а так же файл remove-giveio.cmd, с помощью которого драйвер GiveIO.sys можно удалить из системы.

Драйвер 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-интерфейсами).

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

. SPP (Standard Parallel Port - стандартный параллельный порт). Нередко, для упрощения понимания, в BIOS"е обозначается термином "Normal ".
. EPP (Enhanced Parallel Port - расширенный параллельный порт) - скоростной двунаправленный вариант интерфейса. Изменено назначение некоторых сигналов, введена возможность адресации нескольких логических устройств и 8-разрядного ввода данных, 16-байтовый аппаратный FIFO-буфер. Максимальная скорость обмена - до 2 Мб/с.
. ECP (Enhanced Capability Port - порт с расширенными возможностями) - интеллектуальный вариант EPP. Введена возможность разделения передаваемой информации на команды и данные, поддержка DMA и сжатия передаваемых данных методом RLE (Run-Length Encoding - кодирование повторяющихся серий).

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

Предлагается решение этой проблемы: программный класс, написанный под.NET, и динамическую библиотеку, которая работает с LPT. Данная реализация проверена на 32- и 64-разрядных Windows XP, Windows 7, 8 и 10 как со встроенными LPT портами, так и реализованными в виде плат расширения на шине PCI или PCI-Express. Скачать драйвер для LPT порта можно по ссылке внизу после статьи.

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

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

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

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

Мной был написан класс для.NET, который использует динамические библиотеки inpout32.dll и inpoutx64.dll и позволяет считывать из параллельного порта и записывать в его регистры данные.

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

Вот код класса LPT на языке VB.NET:

Код класса LPT на языке VB.NET (разворачивается) Imports System.Runtime.InteropServices """ """ Работа с LPT портом. При создании определяет наличие драйвера и выбирает подходящую библиотеку. """ Public NotInheritable Class LPT #Region "CONST" Public Const DLL32 As String = "c:\temp\inpout32.dll" Public Const DLL64 As String = "c:\temp\inpoutx64.dll" Public Const DLL32DRV As String = "c:\temp\inpoutx32drv.dll" """ """ Регистры параллельного порта. """ Public Enum Register As Integer """ """ Регистр данных SPP/EPP. """ DATA = 0 """ """ Регистр состояния SPP/EPP. """ STATUS = DATA + 1 """ """ Регистр управления SPP/EPP. """ CONTROL = DATA + 2 """ """ Регистр адреса EPP. Чтение или запись в него генерирует свзяанный цикл чтения или записи адреса EPP. """ EPP_ADDRESS = DATA + 3 """ """ Регистр данных EPP. Чтение (запись) генерирует связанный цикл чтения (записи) данных EPP. """ EPP_DATA = DATA + 4 """ """ Регистр активации режима EPP. """ """ """ Если только смешанный "ECP+EPP" или "Extended" - скорее всего потребуется еще выполнить запись в порт ECR байта 0x80 """ (ECR - это регистр ECP-режима, ECR=BASE_ADDR+0x402, BASE_ADDR - базовый адрес LPT-порта """ ECR = DATA + &H402 "TEST End Enum #End Region "/CONST #Region "DllImport" Private Shared Function IsInpOutDriverOpen() As Byte End Function Private Shared Function IsInpOutDriverOpen_x64() As UInt64 End Function Private Shared Function Inp32(PortAddress As UInt32) As Byte End Function Private Shared Sub Out32(portAddress As UInt32, data As UInt32) End Sub Private Shared Function Inp64(PortAddress As UInt64) As Byte End Function Private Shared Sub Out64(PortAddress As UInt64, Data As UInt64) End Sub #End Region "/DllImport #Region "CTOR" """ """ Проверяет возможность использования x86 или x64 драйвера. В случае невозможности выбрасывает исключение "драйвер не установлен". """ Shared Sub New() Dim x86 As Boolean = CheckIsDriverX86() Dim x64 As Boolean = CheckIsDriverX64() If x64 Then _IsX64DriverUsed = True ElseIf x86 Then _IsX64DriverUsed = False Else Throw New SystemException("Драйвер для LPT порта не установлен.") End If End Sub """ """ Инициализация порта - выставление XXXX0100"b в регистре контроля. """ Private Shared Sub InitLpt(port As ULong) Write(port, Register.ECR, &H80) Write(port, Register.CONTROL, &H4) End Sub #End Region "/CTOR #Region "PROPS" """ """ Используется ли 64-разрядная версия драйвера. """ Если драйвер не установлен, возвращается NULL. """ Public Shared ReadOnly Property IsX64DriverUsed As Boolean? Get Return _IsX64DriverUsed End Get End Property Private Shared ReadOnly _IsX64DriverUsed As Boolean? = Nothing #End Region "/PROPS #Region "METHODS" """ """ Определяет, является ли драйвер 32-разрядным. """ Private Shared Function CheckIsDriverX86() As Boolean Try Dim res As Byte = IsInpOutDriverOpen() Return True Catch ex As Exception Return False End Try End Function """ """ Определяет, является ли драйвер 64-разрядным. """ Private Shared Function CheckIsDriverX64() As Boolean Try Dim nResult As ULong = IsInpOutDriverOpen_x64() Return (nResult <> 0) Catch ex As Exception Return False End Try End Function #End Region "/METHODS #Region "Read / Write LPT Port" """ """ Читает из заданного регистра LPT порта 1 байт данных. """ """ Номер порта. """ Регистр порта. Public Shared Function Read(port As ULong, Optional reg As Register = Register.DATA) As Byte Dim data As Byte = 0 If IsX64DriverUsed Then data = Inp64(CULng(port + reg)) Else data = Inp32(CUInt(port + reg)) End If Return data End Function """ """ Записывает в заданный регистр LPT порта число. """ """ Адрес порта. """ Регистр порта. """ Public Shared Sub Write(port As ULong, reg As Register, data As ULong) If IsX64DriverUsed Then Out64(port + CULng(reg), data) Else If (data <= UInteger.MaxValue) Then Out32(CUInt(port + reg), CUInt(data)) Else Throw New ArgumentException("В 32-разрядных системах аргумент должен быть 32-разрядным (тип UInt32).", "data") End If End If End Sub #End Region "/Read / Write LPT Port """ """ Тестирует наличие LPT порта по заданному адресу. """ """ Адрес параллельного порта. Public Shared Function CheckPortPresent(lptAddress As ULong) As Boolean Dim portPresent As Boolean = False Try InitLpt(lptAddress) Dim data As ULong = Read(lptAddress, Register.DATA) "сохраняем текущее значение регистра данных "Проверим: что записали, то и прочитали? Write(lptAddress, Register.DATA, &H0) portPresent = portPresent And (&H0 = Read(lptAddress, Register.DATA)) Write(lptAddress, Register.DATA, &H55) portPresent = portPresent And (&H55 = Read(lptAddress, Register.DATA)) Write(lptAddress, Register.DATA, &HAA) portPresent = portPresent And (&HAA = Read(lptAddress, Register.DATA)) Write(lptAddress, Register.DATA, data) "восстанавливаем прежнее значение регистра данных "Проверим наличие регистров управления и данных, если порт не обнаружен (в случае однонаправленного порта) If (Not portPresent) Then data = Read(lptAddress, Register.CONTROL) portPresent = ((data <> 0) AndAlso (data <> &HFF)) "Не пустое значение? => Порт присутствует. If (Not portPresent) Then data = Read(lptAddress, Register.STATUS) portPresent = ((data <> 0) AndAlso (data <> &HFF)) End If End If Catch ex As Exception Return False End Try Return portPresent End Function End Class "/LPT

Код класса LPT на языке C#:

Код класса LPT на языке C# (разворачивается) using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace LPTIO { /// Класс для работы LPT портом. При создании определяет наличие драйвера и его разрядность. public sealed class LPT { private const string DLL32 = "inpout32.dll"; private const string DLL64 = "inpoutx64.dll"; private static bool _IsX64DriverUsed; /// Используется ли 64-разрядная версия драйвера. public static bool IsX64DriverUsed { get { return LPT._IsX64DriverUsed; } } static LPT() { if (LPT.getIsDriverX86()) { LPT._IsX64DriverUsed = false; } else { if (!LPT.getIsDriverX64()) throw new SystemException("Драйвер для LPT порта не установлен."); LPT._IsX64DriverUsed = true; } } public LPT() { } private static extern byte IsInpOutDriverOpen(); private static extern ulong IsInpOutDriverOpen_x64(); private static extern byte Inp32(uint PortAddress); private static extern void Out32(uint portAddress, uint data); private static extern byte Inp64(ulong PortAddress); private static extern void Out64(ulong PortAddress, ulong Data); /// Определяет, является ли драйвер для 32-разрядной версии Windows. private static bool getIsDriverX86() { bool flag; try { LPT.IsInpOutDriverOpen(); flag = true; } catch (Exception ex) { ProjectData.SetProjectError(ex); flag = false; ProjectData.ClearProjectError(); } return flag; } /// Определяет, является ли драйвер для 64-разрядной версии Windows. private static bool getIsDriverX64() { bool flag; try { flag = Decimal.Compare(new Decimal(LPT.IsInpOutDriverOpen_x64()), Decimal.Zero) != 0; } catch (Exception ex) { ProjectData.SetProjectError(ex); flag = false; ProjectData.ClearProjectError(); } return flag; } /// Читает из LPT порта 1 байт данных. /// Номер порта. /// Регистр порта. public static byte Read(ulong port, LPT.Register reg = LPT.Register.DATA) { return !LPT.IsX64DriverUsed ? LPT.Inp32(Convert.ToUInt32(Decimal.Add(new Decimal(port), new Decimal((int) reg)))) : LPT.Inp64(Convert.ToUInt64(Decimal.Add(new Decimal(port), new Decimal((int) reg)))); } /// Записывает в LPT порт число. /// Адрес порта. /// Регистр порта. /// Число для записи. В 32-разрядных системах аргумент должен быть не более, чем максимальное значение для типа UInt32. public static void Write(ulong port, LPT.Register reg, ulong data) { if (LPT.IsX64DriverUsed) { LPT.Out64(checked (port + (ulong) (uint) reg), data); } else { if (data > (ulong) uint.MaxValue) throw new ArgumentException("В 32-разрядных системах аргумент должен быть 32-разрядным (тип UInt32).", "data"); LPT.Out32(Convert.ToUInt32(Decimal.Add(new Decimal(port), new Decimal((int) reg))), checked ((uint) data)); } } /// Регистры порта LPT. public enum Register { DATA, STATUS, CONTROL, } } }

3 Применение класса.NET для работы с LPT портом

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

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

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

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

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

Bool is64bitDriver = LPT.IsX64DriverUsed;

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

LPT.Write(currentPort, LPT.Register.CONTROL, 123);

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

Byte b = LPT.Read(currentPort, LPT.Register.DATA); byte s = LPT.Read(currentPort, LPT.Register.STATUS);

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

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


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

Скачать вложения:

  • Скачать драйвер для LPT порта (2643 Скачиваний)

Все, кто хоть раз пытался собрать самостоятельно ПК либо прикупить одно из комплектующих, сталкивались с вопросом о портах. Параллельный или последовательный? Четырехконтактный или разъем на 16 пин? Вывод через порт или память? Все эти вопросы возникают по мере изучения этой темы и выбора нужного кабеля.

Порт

Что же такое порт? Это специальный разъем в ПК, который работает как связующее звено разного рода устройств с системой компьютера. Порты условно синонимы разъемам, которые нужны для работы периферийных девайсов, отделенных от архитектуры ПК. К примеру, в противопоставление стоит отметить, что сетевой разъем, или место для подключения чипа и ОЗУ, портом не называется.

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

Аппаратный порт представлен целым рядом типов. Так, сюда относят параллельный интерфейс, последовательный, USB, PATA/SATA, PS/2 и четверку современных видеоинтерфейсов: Display Port, HDMI, VGA, DVI.

Параллельный

Речь пойдет об одном из этих типов интерфейса. Параллельный был создан для ПК в качестве связующего звена периферийного устройства и компьютера. Если речь идет о вычислительной технике, то этот тип физически реализует параллельное соединение, что вполне логично.

Часто можно услышать выражение «параллельный порт принтера», и это неспроста. Тип данного интерфейса получил имена принтерного порта и порта Centronics сразу после своего рождения.

Начало

Такое название и вправду получилось неспроста. Интерфейс разработала компания Centronics, которая в 1970 году выпустила принтер с ним. Над портом работали в компании "Говард" и "Робинсон". Никто не планировал создавать новый тип или делать революционное открытие. Все случилось де-факто, а параллельный порт стал отраслевым стандартом.

На тот момент существовало много разнообразных кабелей, которые использовали производители. К примеру, популярным был DC-3, 36, 25 и 50-контактный разъем.

Развитие

Развитие принтерного порта подхватили быстро. Компании одна за другой начали реализовывать свои версии. Стали появляться плоские варианты на большое количество пинов. Dataproducts работала с интерфейсом, разработав DC-37, который относился к хосту, и 50-контактный порт, подключаемый к принтеру.

Dataproducts создала сразу несколько вариантов. Параллельное соединение можно было реализовать на коротких расстояниях до 15 метров, а для длинного соединения - до 150 метров. Прослужил этот интерфейс долго. Аж до 1990-х годов многие производители использовали его как опцию.

Американская компания IBM также решила сделать взнос в создание параллельного порта компьютера. В момент выхода её первого персонального компьютера можно было ознакомиться с модификацией Centronics. Интересно, что для многих пользователей сразу поставили условие. Лишь переработанные принтеры от Epson, которые обзавелись логотипом IBM, могли функционировать с этим интерфейсом.

Компания потрудилась над стандартизацией кабеля формата DB25F. После чего производители принтеров начали реализовывать стандарт в своих моделях. А в начале 90-х популярный порт Centronics стали менять на IEEE 1284.

Разновидность

Так новинка вошла в обиход и обзавелась своими поклонниками. IEEE 1284 имеет еще одно название - LPT. Параллельный порт обзавелся международной стандартизацией и все так же служит для соединения периферийных девайсов.

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

Основой для IEEE 1284 стал порт Centronics и его разнообразные вариации.

Сравнение

Как уже упоминалось ранее, интерфейс Centronics был создан одноименной компанией и широко применялся для ПК фирмы IBM. Благодаря этому разъему возможно было подключать печатающие аппараты. Он долго считался основным, хотя официально таковым не являлся.

Сначала его создали для однонаправленной передачи информации, поэтому он идеально подходил для принтеров. Когда стали работать над дуплексными модификациями, было решено официально закрепить один из новоявленных стандартов. Так появился EEE 1284.

Разновидность

Что же собой представляет этот параллельный порт? Со стороны компьютера он представлен разъемом на 25 контактов в два ряда формата DB-25-female. Сразу нужно отметить, что это так называемая «мама», а вот есть аналогичный разъем - «папа», который ранее применялся в ПК в качестве COM-порта.

Периферийное оборудование чаще обзаводится 36-пиновым микроразъемом в виде ленты, поэтому кабель с одной стороны имеет 25 контактов DB-25-male и подключается к ПК, а на другой - 36 пинов IEEE 1284-B. Иногда этот вариант заменяет MiniCentronics - порт, который представлен кабелем AC на 36 пинов.

Среди всех есть и CC-кабели, с обеих сторон которых находится MiniCentronics. Это очень редкая модификация, рассчитанная на устройства со стандартом IEEE 1284-II.

Поскольку перед нами стандарт, он имеет некоторые требования, которые нужно соблюдать. К примеру, длина кабеля не может быть больше трех метров. Само строение представлено витыми парами в общем или индивидуальном экране. Редко встречаются ленточные версии.

Если присмотреться к старым моделям сканеров, тут также встречался порт DB-25-male, вместо IEEE 1284-B. Интересно, что подобные устройства имели дополнительный разъем DB-25-female, чтобы была возможность присоединить принтер. Так сканер передавал информацию через два интерфейса.

Физическая реализация

Основной порт Centronics, как уже упоминалось ранее, был представлен однонаправленным параллельным портом. Кабель реализовал основные характеристики. Так, имелось 8 сигнальных линий для перемещения, стробы и линия состояния устройства.

Очевидно, что однонаправленный интерфейс позволял передавать материалы в одну сторону от ПК к оборудованию. Несмотря на это, технология была несколько шире. Имелось пять обратных линий, которые осуществляли контроль состояния аппарата. Скорость, с которой возможно было передавать информацию, колебалась и поднималась до 1,2 Мбит/с.

Расширения

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

Самыми известными стали разработки Hewlett-Packard. Наряду с Centronics появился порт Bitronics. Он получил двустороннюю технологию, перемещал данные в два направления и нужен был для сбора информации по состоянию принтера.

Bitronics работал с протоколом мультиплексированной шины HP. Технология давала возможность использовать «цепочку»: подключать к разъему LPT несколько девайсов. Чтобы реализовать эту задачу, было создано несколько стандартов, хотя и тут совместимости достичь не удалось.

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

Возможности

Параллельный интерфейс можно использовать в нескольких режимах. Например, SPP - это стандартная реализация одностороннего порта, который совместим с Centronics. Nibble Mode - это режим двунаправленной передачи данных. Он работает благодаря управляющим линиям. В свое время был единственным вариантом, благодаря которому Centronics передавал двунаправленно информацию.

Byte Mode - еще один вариант двусторонней синхронизации, который не стал популярным, но все равно использовался с некоторыми контроллерами. EPP - режим работы от ведущих производителей Intel, Xircom и Zenith Data Systems, также занимался двусторонней передачей информации со скоростью 2 Мбайт/с.

И последний режим - ЕСР. Над ним работали компании Microsoft и Hewlett-Packard. Появилось аппаратное сжатие файлов, буфер, работа в прямом доступе к памяти.

Применение

Не секрет, что сейчас большинство принтеров подключаются за счет кабелей USB. До того как появился этот вариант разъем являлся единственным вариантом. Но помимо этого существовал и в разных периферийных девайсах.

Сейчас трудно говорить, что же появилось ранее и первее, но известными стали электронные ключи, которые защищали ПО от копирования. Также этот порт перешел в распоряжение накопителей и сканеров. А это, в свою очередь, дало толчок к созданию разъемов с параллельным соединением для модемов, звуковых карт, веб-камер, геймпадов и пр.

Следом стали разрабатывать адаптеры для стандарта SCSI в паре с параллельным типом. Известны и переходники для EPROM и аппаратных контроллеров.

Современное использование

Параллельный интерфейс стал менее популярным. Его заменили кабели USB, а для сетевого соединения - Ethernet. Многие производители считают параллельный тип разъемов устаревшим. Поэтому он массово начинает пропадать с интерфейсных панелей компьютеров и ноутбуков. Microsoft просит разработчиков удерживаться от применения этого типа портов. А для тех, кто все-таки не готов отказаться от такого варианта, есть адаптер «параллельный порт USB».

Разница

Часто сравнивают последовательные и параллельные порты. В системах от IBM, помимо параллельного интерфейса, имелись последовательные и встроенные, для клавиатуры. Последовательный порт часто служил для подключения высокоскоростных коммуникационных девайсов, которые работали по формату RS-232. Тут речь идет о модемах и подобных устройствах.

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

Ошибка

О параллельном интерфейсе люди часто узнают от самой системы. Иногда возникают неполадки, которые заставляют пользователя попотеть, чтобы исправить их. Так, некоторые могли заметить сбой «Драйвер параллельного порта». Обычно эта ошибка появляется в журнале системы и помечена красным крестиком.

Сейчас такая неполадка все реже встречается в системе. Может возникать при запуске Parport, когда отсутствует параллельный порт на плате. В этом случае можно отправиться в реестр и в разделе Parport найти строку «Start». Тут нужно поменять значение «2» на «4».

Выводы

Параллельный порт сейчас уже отходит в прошлое. Над ним работали еще в прошлом веке, а уже в нашем смогли заменить на более удобные разъемы. Те варианты, которые остались без изменения, смогли обзавестись адаптерами. Так стало реальным приобрести контроллер параллельного порта PCI, замену USB и других популярных интерфейсов.

В интернете много способов самостоятельно сделать тот или иной кабель. Но, честно говоря, варианты не совсем безопасны и вызывают сомнения. Лучше, если вам вдруг понадобился параллельный порт для устройства, поискать в магазинах. Он хотя и не выпускается, но все равно остался в продаже. А самостоятельно собирая ПК, лучше внимательно присмотреться к интерфейсной панели материнки, чтобы позже не столкнуться с неприятностями.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: