Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Пример работы с LPT портом с помощью функций API


Автор: Bog d`An 21.9.2005, 03:26
В литературе нашёл только общие слова на предмет того что нельзя-де работать с портом напрямую с помощью ф-й низкого уровня, что-де не только твой процесс может обращатся к порту... и т.п.
не могли Вы бы показать как это реализовывается?

собственно мне надо передавать инфу на самодельное устройство-коммутаторsmile - проблема аналогичная Gigabyte (Порты и Дельфи, HELP!!!!!!)

ОС WinXP
.

Например как бы выглядило что-то вроде этого:
Код

Program TestLine;
Uses dos;
{$m 1024,0,0}
const
  delay=6;
  m:array [1..8] of byte=(1,2,4,8,16,32,64,128);
  i:byte=1;
  t:byte=0;
procedure time; interrupt;
begin
  inc(t);
  if t=delay then
  Begin
    t:=0;
    port[$378]:=m[i];
    if i=8 then
      i:=1
    else
      inc(i);
  End;
End;
Begin
  setintvec($1c,@time);
  keep(0);
End;


p.s.: у вас нарыл ответ Snowy

Код

unit lptport;
interface
uses Windows;
type
  TLptPort=class(TObject)
    protected
      h: THandle;
      b: ^char;
      public
      Port: byte;
      constructor Create;
      destructor Destroy; override;
      function  Connect: Boolean;
      procedure Disconnect;
      function  Connected: Boolean;
      procedure SendString(str:string);
      function  GetChar(var ch: char):boolean;
    published
  end;
implementation
constructor TLptPort.Create;
begin
  Port:=1; h:=0;
end;
destructor TLptPort.Destroy;
begin
  Disconnect;
  inherited Destroy;
end;
function TLptPort.Connected: Boolean;
begin
  Result:=h>0;
end;
procedure TLptPort.Disconnect;
begin
  if Connected then
    CloseHandle(h);
  h:=0;
end;
function TLptPort.Connect: Boolean;
var
  LptName: string;
begin
  Result:=Connected;
  if Connected then Exit;
  LptName:='LPT'+chr(48+Port);
  try
    h:=CreateFile(PChar(LptName),GENERIC_READ OR GENERIC_WRITE,0,nil,
                  OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  except 
    h:=0 
  end;
  if h=INVALID_HANDLE_VALUE then h:=0;
  Result:=Connected;
end;
procedure TLptPort.SendString(str:string);
var
  buf: PChar;
  btw,bwt : DWORD;
begin
  if not Connected then exit;
  btw:=Length(str); buf:=PChar(str);
  WriteFile(h, buf, btw, bwt,nil);
end;
function TLptPort.GetChar(ch: char): boolean;
var
  r:  dword;
begin
  result:=false;
  if not Connected then exit;
  if ReadFile(h,ch,1,r,nil) then
    if r>0 then result:=true;
end;
end.


функция TLptPort.SendString(str:string) насколько я понял? но я немного(совсем) не понял что ей передавать smile
преобразовывается в PChar... нет всё равно непонятно smile должно быть нечто вроде чисел?

и ещё автор признаётся что не испытывал для LPT smile


в итоге должно получится что-то вроде
http://tulnikov.narod.ru/lptport/index.htm
но работающее под ХР
(в смысле протестить ;) дальше-больше)

Автор: mntek 21.9.2005, 09:39
Цитата(Bog @ 21.9.2005, 03:26)
функция TLptPort.SendString(str:string) насколько я понял? но я немного(совсем) не понял что ей передавать 
преобразовывается в PChar... нет всё равно непонятно  должно быть нечто вроде чисел?


как раз эта функция и пишет строку str в порт.
а тебе наверно надо почитать http://pccontrol.bib.com.ua/XpCoding/Shablon_XP.html

Автор: Snowy 21.9.2005, 09:58
Цитата(Bog @ 21.9.2005, 03:26)
функция TLptPort.SendString(str:string) насколько я понял? но я немного(совсем) не понял что ей передавать

Допустим, тебе нужно передать набор байт.
К примеру, хочешь передать значения: 213, 11, 54, 18
Делаешь так:
Код

var
  l: string;
begin
  l:=chr(213)+chr(11)+chr(54)+chr(18);
  TLptPort.SendString(l);
end;

Автор: Bog d`An 21.9.2005, 19:17
всем спасибо!

Автор: Delphins 21.9.2005, 20:20
А я написал с использыванием драйвера. (Он не мой ) Если хочеш вышлю на твой e-mail драйвер + программу.
У меня она по LPT порту управляет LCD экраном от эриксона.
Короче прикольно получилось. Можно менять драйвер экрана. Выводить инфу о компе.

Автор: Snowy 22.9.2005, 09:16
Цитата(Delphins @ 21.9.2005, 20:20)
А я написал с использыванием драйвера.

А зачем? Стандартный драйвер LPT порта отлично справляется со своей задачей.
И ставить ничего лишнего не нужно.

Автор: Bog d`An 16.12.2005, 04:21
Delphins ух-ты, прикольно... жаля я себе ЮСБ шнурок к телу купил...
не у меня девайс по проще - самоделка - думаю присобачать на телефонную линию релюшку после модема перед телефоном - чтоб значит когда установка связи идёт отрубался телефон... а то достало пищание в 2 часа ночи... %)
Добавлено @ 04:23
зы: mntek, спасибо! очень полезная ссылочка...

Автор: Iuda_iz_Kf 11.10.2006, 01:56
Привет..
Я тут тоже пытаюсь разобраться с работой LPT..
Научился только подавать High(5B) и Low(0,1B) наряжение на контакты 2-9(Data)..
Хотелось-бы услышать, что происходит на физ. уровне при выполнении вышенаписанного:
Код

var    
  l: string;    
begin    
  l:=chr(213)+chr(11)+chr(54)+chr(18);    
  TLptPort.SendString(l);    
end;

Заранее благодарен..
--------------------
Необессудьте, я только учусь...

Автор: pix 11.10.2006, 09:55
Привет всем.
У меня тоже проблемка, обясните или кинте ссилку на инфу. Мне нужно виполнить следующие действие:
 1) Чтение и запись из/в группы данных порта (биты 0..7 базового 
адреса)
 2) Чтение и запись из/в группы контроля порта (биты 0..3 базовый адрес 
+ 2)
 3) Чтение из группы состояния порта (биты 3..7 базовый адрес + 1).
я  в роботе с LPT новичок. Насколько я понял надо читать и записовать по битно. Как это зделать?
  smile 

Наперед спасибо!

Автор: Yanis 11.10.2006, 18:13
Восставшие из ада!!!
 smile 

pix
Думаю этого хватит:
http://www.sys-tema.ru/Primenenie-kompyutera-kak-elementa-upravleniya.html
http://forum.vingrad.ru/index.php?showtopic=20791&hl=lpt
http://forum.vingrad.ru/index.php?showtopic=109182&unread=1&view=all&hl=lpt

P. S. А вообще советую пользоваться поиском.

Автор: pix 12.10.2006, 08:30
Большое спасибо. smile 
 На щет поиска, я уже вторую ночь в нете копаюсь, и ничего толкового не нашел. Много статей о управлении процесами, окнами, т.п., а от о портах очень мало. Вот то что ти мне подкинуд мне понравилось.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)