Подключение контроллера с использованием переходника USB-LPT. Драйвер для работы с LPT портом (интегрированным или в виде платы PCI) Установка драйвера для работы с LPT портом

Подписаться
Вступай в сообщество «allcorp24.ru»!
ВКонтакте:

The Chinese company ID-Cooling, known first of all for low-cost cooling systems, announced the release of a new, unattended processor Auraflow 240. The novelty is compatible with all current processor platforms, and its main customers, according to the manufacturer"s idea, should become fans of LED RGB-illumination and are to be owners of motherboards from ASUS.

Specifications

Thickness - 1.1" (2.2" w/fans)

Width - 4.7" (120mm)

Depth - 10.8" (274mm)

Pump Height - 1.7" (43mm)

Controller - None (BIOS)

Cooling Fans - (2) 120 x 25mm

Connectors - (1) 3-pin, (2) PWM

Weight - 38 Ounces

Intel Sockets - 775, 115x, 1366, 2011x/2066

AMD Sockets - AM4, 4-bolt Legacy

Warranty - 3 Years

The Auraflow 240 is in black color, and its size is really great. On the front side of the box there is a beautiful photo of the pump and radiator of the SZHO, and just below there are the key features of …

Kolink has announced the Observatory chassis, aimed at assembling desktop systems with rather strict, though eye-catching outer appearance.

The novelty, performed in black, possesses the front and one side panels out of smoked tempered glass 4 mm thick. The case encloses four 120 mm fans, supplied with the multi-coloured RGB-backlighting, three of which are located on the front, and one - at the rear. Users may also add two 120 mm coolers in the top part.

This framework presupposes the utilizing of E-ATX (up to 279 mm wide), ATX, Micro-ATX and Mini-ITX motherboards. There also are mounting seats for seven expansion cards. The length of discrete graphics accelerators should not overcome 390 mm. Besides, the Observatory chassis is able to house two drives of the 3.5” or 2.5” form factor. In the case of liquid cooling system applying one may install 240 mm heatsinks at the front and atop, while the CPU cooler is …

Zotac, a well-known designer of graphics solutions, has developed a unique in design graphics card. Entitled Zotac GeForce GTX 660 Thunderbolt, this card is heading a new Thunderbolt Edition series that is considered to be a more affordable product than Extreme series. The novice is equipped with an original PCB and an effective cooling system.

Zotac GeForce GTX 660 Thunderbolt is primarily characterized by a unique cooling system that consists of a large aluminum heatsink, three cooper heat pipes which get in contact with GPU from one side, and a couple of 100 mm fans. It should be mentioned that Zotac developers have realized a dedicated Eclean technology in their card that enables a hassle-free demounting of fans and top cover with the purpose of cleaning the cooler from dust.

GK106 chip, designed on Kepler architecture under 28 nm technological process, functions as the basic element in GeForce GTX 660 Thunderbolt card. It involves 960 CUDA cores and operates at 980 MHz …

С этой проблемой сталкиваются все, кто пытается подключить какие-либо устройства к LPT -порту. Как только Вы скажите программе «используй LPT », то получите ошибку – она отражена на скриншоте справа. Итак, давайте попробуем разобраться и устранить её.

Я столкнулся с ней, когда добавлял плату контроллера с 1-LPT и 2-COM портами. В этом была определённая необходимость – подключение Band -decoder RU -005A . Об этом в будет рассказано в следующей статье. А пока, хотелось бы получить корректно работающий LPT -port в Win -Test под ОС Windows -7 (64 bit ).

Современные компьютеры уже достаточно давно не содержат параллельный порт. Как вариант, можно поставить в него дополнительный контроллер. Не пугайтесь этому слову, страшного в этом ничего нет. Причина, по которому возникает указанная выше ошибка проста - драйвера и библиотеки DriverLINX (DLPortIO.sys + DLPortIO.dll) не существует для версий Windows под архитектуру x86-64 (AMD64, Intel64). Разработчик Scientific Software Tools Inc прекратил поддержку драйвера, передав другой фирме, а те остановились только на 32-битном варианте. Макрософт пожимает плечами и отправляет к производителю. Тем не менее существует хороший комплект - это InpOut32 (hwinterface.sys+inpout32.dll), а даже 64-битная версия InpOutx64 с hwinterfacex64.sys драйвером.

Перейдём от теории к практическому воплощению. В наличии:

  • Win -Test версии 4.10 , обновлённый до релиза Revision: 524 от 13-Jul-2013.
  • Windows 7 Ultimate (64 bit ) со всеми обновлениями.
  • Intel Core i7-3770 (3.4 GHz) + PC3-10700 (667 MHz) 8x2=16 Gb + Asus P8Z77-V LX
  • Контроллер * PCI COM/LPT (2+1)port WCH353 bulk

Установка контроллера

Сам котроллер не представляет из себя ничего интересного по сути и его название даёт почти полное представление – два COM и один LPT порт, устанавливается он в PCI . Само устройство недорогое и обошлось в 360 рублей (около 12 $) , производство – Китай.

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


Процедура установки контроллера проблем не вызвала – всё достаточно просто. Выключаем компьютер, устанавливаем его в свободный PCI -слот, включаем, устанавливаем драйвер. В комплекте есть программа-установщик. Её интерфейс не сложный и понятный. У меня всё прошло на автоматическом определении типа карты и достаточно было нажать только Install driver . Процесс установки сопровождается двигающейся полоской на интерфейсе, всё предельно ясно.

Программа позволяет переназначать порты, если есть в этом необходимость. Например, при наличии виртуальных СОМ-портов. Для этого после инсталляции нажмите About и кнопку Modify Port Name .

В особых комментариях приведённые скриншоты не нуждаются, нажмите и картинки станут больше. Всё в ваших руках – конфигурируйте появившиеся новые порты на своё усмотрение и под свои нужды.

Финалом того, что инсталляция прошла успешно должно послужить наличие этих устройств в Диспетчере Устройств на компьютере. Перейдите туда и проверьте. В моём случае на материнской плате уже стоял интегрированный COM -port (ну.. нужен он мне). Соответственно, список портов получился таким:

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

LPT -1 - 378

LPT -2 - 278

LPT -3 - 3BC

В нашем случае они будут отличаться от привычных значений, т.к. эти порты не интегрированы на материнской плате и способ общения с ними идет через шину PCI . В моём варианте получилось D 010 (используем первое значение). Поэтому, перед тем, как устанавливать (покупать) подобный контроллер посмотрите, имеется ли в Вашей программе возможность устанавливать иные диапазоны ввода-вывода.

Тем не менее, в составе драйверов есть небольшая утилита, позволяющая переназначать подобные адреса (с ней я не разбирался, нет необходимости).


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



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



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


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

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

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


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

#include "iostream.h" #include "conio.h" #include "stdlib.h" #include "windows.h" int main() { int Address = 888; cout<<"Test LPT port with GiveIO.sys"<

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

Благодаря giveio.sys успешно отработают и такие ассемблерные письмена:

Asm { mov dx, 378h mov al, 1 out dx, al }

© Дмитрий Иванов
2005-2006

Компания Cooltek вывела на рынок очередную новинку – mid-tower корпус под названием GT-04. Модель объединяет в себе исключительные характеристики, такие как функциональность, эргономика, стильный дизайн и привлекательная цена (59.99 евро). Шасси выполнено в полностью черном цвете с яркими оранжевыми/зелеными вставками на передней панели. Сюда же выведена и пара корзин для оптических накопителей формата 5.25 дюйма, а также отсек для накопителя 3.5 дюйма.

Корпус Cooltek GT-04 (Orange/Green) оснащен боковым окошком, открывающим вид на системные компоненты. …

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

Серия HyperX Beast с черной PCB, входящая в состав линейки Predator, характеризуется огромной вместительностью и максимальными рабочими частотами. В розничной торговле модули …

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

Все варианты линейки CORSAIR RMx White имеют качественную элементную базу (в том числе, применяются сугубо японские конденсаторы высокотемпературной …

Лет 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 порта (3281 Скачиваний)

← Вернуться

×
Вступай в сообщество «allcorp24.ru»!
ВКонтакте:
Я уже подписан на сообщество «allcorp24.ru»