Управление lpt портом из windows через c# + inpout32.dll / inpout64.dll

Допустим вам нужно управлять устройством через параллельный порт из операционной системы Windows. Я реализовывал данный способ в Windows7 х32 инструмент Visual Studio C#.

parallel_port_pci_bracket.png

1. Создайте новый WinForms проект в Visual Studio C#.
2. Киньте на форму кнопку и текстовое поле. Текстовому полю задайте значение "1".
3. Скачайте и установите драйвер InpoutDriver.exe 4. Скачайте inpout32.dll и inpoutx64.dll 5. Добавьте библиотеки в проект. Проверьте в их свойствах, чтобы они копировались в директорию запуска при компиляции.
6. Создайте класс-модуль ParallelPort.cs и внесите в него следующий код:
class ParallelPort
{//inpout.dll

[DllImport("inpout32.dll")]
private static extern UInt32 IsInpOutDriverOpen();
[DllImport("inpout32.dll")]
private static extern void Out32(short PortAddress, short Data);
[DllImport("inpout32.dll")]
private static extern char Inp32(short PortAddress);
[DllImport("inpout32.dll")]
private static extern void DlPortWritePortUshort(short PortAddress, ushort Data);
[DllImport("inpout32.dll")]
private static extern ushort DlPortReadPortUshort(short PortAddress);
[DllImport("inpout32.dll")]
private static extern void DlPortWritePortUlong(int PortAddress, uint Data);
[DllImport("inpout32.dll")]
private static extern uint DlPortReadPortUlong(int PortAddress);
[DllImport("inpoutx64.dll")]
private static extern bool GetPhysLong(ref int PortAddress, ref uint Data);
[DllImport("inpoutx64.dll")]
private static extern bool SetPhysLong(ref int PortAddress, ref uint Data);
//inpoutx64.dll
[DllImport("inpoutx64.dll", EntryPoint = "IsInpOutDriverOpen")]
private static extern UInt32 IsInpOutDriverOpen_x64();
[DllImport("inpoutx64.dll", EntryPoint = "Out32")]
private static extern void Out32_x64(short PortAddress, short Data);
[DllImport("inpoutx64.dll", EntryPoint = "Inp32")]
private static extern char Inp32_x64(short PortAddress);
[DllImport("inpoutx64.dll", EntryPoint = "DlPortWritePortUshort")]
private static extern void DlPortWritePortUshort_x64(short PortAddress, ushort Data);
[DllImport("inpoutx64.dll", EntryPoint = "DlPortReadPortUshort")]
private static extern ushort DlPortReadPortUshort_x64(short PortAddress);
[DllImport("inpoutx64.dll", EntryPoint = "DlPortWritePortUlong")]
private static extern void DlPortWritePortUlong_x64(int PortAddress, uint Data);
[DllImport("inpoutx64.dll", EntryPoint = "DlPortReadPortUlong")]
private static extern uint DlPortReadPortUlong_x64(int PortAddress);
[DllImport("inpoutx64.dll", EntryPoint = "GetPhysLong")]
private static extern bool GetPhysLong_x64(ref int PortAddress, ref uint Data);
[DllImport("inpoutx64.dll", EntryPoint = "SetPhysLong")]
private static extern bool SetPhysLong_x64(ref int PortAddress, ref uint Data);
private bool _X64;
private short _PortAddress;

public ParallelPort(short PortAddress)
{
_X64 = false;
_PortAddress = PortAddress;

try
{
uint nResult = 0;
try
{
nResult = IsInpOutDriverOpen();
}
catch (BadImageFormatException)
{
nResult = IsInpOutDriverOpen_x64();
if (nResult != 0)
_X64 = true;

}
if (nResult == 0)
{
throw new ArgumentException("Unable to open InpOut32 driver");
}
}
catch (DllNotFoundException)
{
throw new ArgumentException("Unable to find InpOut32.dll");
}
//_X64 = true;
}
//Public Methods
public void Write(short Data)
{
if (_X64)
{
Out32_x64(_PortAddress, Data);
}
else
{
Out32(_PortAddress, Data);
}
}
public byte Read()
{
if (_X64)
{
return (byte)Inp32_x64(_PortAddress);
}
else
{
return (byte)Inp32(_PortAddress);
}
}
}
Не забудьте про System.Runtime.InteropServices. Впрочем студия подскажет.

В обработчике события button1_Click достаточно прописать:
        private void button1_Click(object sender, EventArgs e)
{
ParallelPort port = new ParallelPort(888);
port.Write(Convert.ToInt16(textBox1.Text));
}

программа управления lpt c#
Готово. При помощи этой неказистой программки можно отправлять в порт значения от 0 до 255. Как это отражается на состоянии контактов можно наглядно увидеть при помощи простой схемы на светодиодах.

scheme_leds_on_lpt.png
Существенным недостатком такого способа управления является низкая скорость. То есть подавать импульсы каждые 10 миллисекунд будет весьма проблематично. Для тех, кому это критично рекомендую посмотреть другие способы управления lpt портом.

Исходники проекта на c#


Уведомлять о статьях
  Автор: administrator
Комментариев к статье пока нет
Яндекс.Метрика admin@synxronica.com