Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 9. Программа управления LPT портом под Windows на Delphi

Дмитрий Иванов, 24 Февраля 2007
Статья доработана и обновлена 21 Января 2012

Относительно недавно мне пришлось выполнять один интересный проект - нужно было сделать дешифратор команд управления на USB контроллере и софт для компьютера, но на языке Delphi. До этого с Delphi я не общался, если не считать первого курса института, где нам в течение года преподавали Pascal (они имеют схожие черты). Взял первый попавшийся Web-справочник по этому языку, прикупил Borland Delphi 7.0 (ну и что что древний, зато без свяких там не нужных для начала наворотов). Поковырялся денек. Очень странный язык! - должен Вам признаться. После 4 лет программирования на Си/С++ долго не мог привыкнуть к синтаксису Имя переменной:= значение и связке Begin end. В результате моих опытов основы языка я освоил, но писать функции по обмену информацией через USB на Delphi не рискнул. Написал их на родном C++ и оформил в виде DLL. А пользователь получил только пользовательские функции - "обертки", содержащие в себе вызовы сишных функций из DLL (чем был вполне удовлетворен). Да и то пришлось повозиться, т.к. например, пытаться из Delphi передавать адреса на массивы в сишную DLL, там с ними что-либо делать и возращать обратно - целая проблема. Вместо ожадаемого результат получалось абсолютно не предсказуемое значение. Решил проблему немного другим путем.


На основе приобретенного опыта в Delphi решил добавить статью по управлению LPT портом под Windows 2000, XP на языке Delphi. Что будем делать? Да ничего особенного - поуправляем регистрами порта LPT из программы на Delphi с помощью библиотеки inpout32.dll.


Готовый прект можно скачать по ссылке ниже (среда: Borland Delphi 7.0).

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

А теперь рассмотрим как это приложение сделать. Итак, запускаем Borland Delphi 7.0. Перед нами должна сразу появиться рабочая среда и заготовка формы будущего приложения.

Давайте прикинем, каким будет наше приложение. Наверное, нам хотелось бы иметь возможность указать адрес порта с которым будем работать, значение которое мы захотим туда (в порт) записать и две кнопки: одна предназначена для записи данных в порт, другая для чтения. Сказано - сделано. С верхней панели перетаскиваем на форму нужное колличество edit-окошек, статических текстов и кнопок. При выделении нужного элемента на форме справа в окне Object Inspector можно задавать различные свойства для элемента. В итоге сформируйте форму так как на рис. ниже.

Программа управления LPT портом под Windows на Delphi с помощью inpout32.dll

Теперь возмемся собственно за программирование. Для начала нам нужно как-то подсоединить inpout32.dll к нашему проекту. Для этого в Delphi есть несколько вариантов, но остановися на следующем: в папку где расположен проект программы помещаем только библиотеку inpout32.dll (lib и h файлы, как это делали ранеше, здесь уже не нужны). Далее в заголовке программы в секции uses помещаем прототипы функций Out32 и Inp32 со специальной директивой компилятора external, говорящей откуда нужно эти функции брать.

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

 function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
 function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';

Ok. Теперь создадим обработчики на нажатие кнопок. Для этого дважды щелкаем на кнопке в редакторе формы. Нас автоматом переносит к коду функции-обработчика. Рассмотрим сначала функцию для записи данных в порт. Тут особенно сложно ни чего нет. В переменные Port и Data помещаем данные из соответствующмх окошек ввода предварительно преобразовав их из текста в целое число. Затем вызываем функцию Out32() с этими параметрами.

procedure TForm1.Button1Click(Sender: TObject);
var
    Port: word;
    Data: Byte;
begin
    Data:= StrToInt(Edit1.Text);
    Port:= StrToInt(Edit2.Text);
    Out32(Port, Data);
end;

Аналогично делаем для кнопки для чтения данных. Из нужного edit-окошка считываем введенное там значение адреса порта откуда будет проводится чтение, преобразуем его в число. Вызываем функцию Inp32() с этим параметром. Заитем выводим окно сообщения с результатом чтения.

procedure TForm1.Button2Click(Sender: TObject);
var
    Port: word;
    Data: Byte;
begin
    Port:= StrToInt(Edit3.Text);
    Data:= Inp32(Port);
    MessageDlg('Value: '+ IntToStr(Data), mtInformation, [mbOK], 0);
end;

Компилируем, запускаем (можно одной кнопкой в виде зеленой стрелки на верхней панели). Протестируем приложение. Попробуем записать в регистр DATA LPT потра число 0. Для этого в качестве адреса указываем 888 (или $378, что одно и тоже), в качестве данных - 0. Нажимаем на соответствующию кнопку. Должно быть все Ok (наблюдаем это на LPT-тестере). Аналогично проводим чтение.

Программирование LPT Delphi inpout32.dll


На последок, хотел бы поделиться некоторыми наблюдениями относительно Borland Delphi и Microsoft Visual Studio 8.0 (которая .NET) с ее языком программирования C#. Не наблюдаете сходства? Я вот заметил: такое понятие как Object Inspector Microsoft откровенно позаимствовала у Borlanda. И особенно поразило сходство построения скелета C#приложения, т.е. конструкции вида Application.Run() и Application.CreateForm() - полное "совпадение".



© Дмитрий Иванов
24 Февраля 2007
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2024