Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с LPT портом 
V
    Опции темы
Pakshin A. S.
  Дата 24.8.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Есть внешнее устройство, подключаемое к порту LPT. У устройства есть два режима: включено и выключено. При положении включено к устройству подается напряжение 12V, а при режиме отключено к нему поступает 0V. 

Данное напряжение может дать именно LPT порт. Как реализуется поставленная задача?

P. S.
А к каким ножкам подключать минус и плюс устройства?

P. P. S.
Что-то поиск с первого раза не дал мне ответа конкретного на поставленный вопрос...  smile 
PM   Вверх
Pakshin A. S.
Дата 25.8.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Вот тут с CreateFile выискал работу с COM портом. С LPT вроде работать также можно (логично).

Что мне писать нужно в этот файл, чтобы напряжение появилось на контактах Data?
PM   Вверх
Fedia
Дата 25.8.2006, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Напряжение на выходах Com\LPT вроде всегда подается с материнской платы, вне зависимости от того подключено к нему устройство или нет.
Цитата(Pakshin A. S. @  24.8.2006,  22:39 Найти цитируемый пост)
А к каким ножкам подключать минус и плюс устройства?

Попробуй посмотреть здесь


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 25.8.2006, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата(Fedia @  25.8.2006,  01:59 Найти цитируемый пост)
Попробуй посмотреть 

Ага, спасибо! Понятно... smile


а про это что скажете?
Цитата(Pakshin A. S. @  25.8.2006,  01:26 Найти цитируемый пост)
Что мне писать нужно в этот файл, чтобы напряжение появилось на контактах Data? 


PM   Вверх
Fedia
Дата 25.8.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Оказывается это уже обсуждалось ранее:
http://forum.vingrad.ru/index.php?showtopic=20791&hl=lpt


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 25.8.2006, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата(Fedia @  25.8.2006,  02:17 Найти цитируемый пост)
Оказывается это уже обсуждалось ранее:

Я видел данную тему, но (!) ссылка на статью из FAQ не работает... 
PM   Вверх
Fedia
Дата 25.8.2006, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Есть пример класса для работы с LPT портом, реализованный 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(var 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.

На сколько я понял, запись в порт реализуется так:
Код

var
  LptPort: TLptPort;
  s: string;
begin
  LptPort:=TLptPort.Create;
  if LptPort.Connect then
  begin
    s:=chr(213)+chr(11)+chr(54)+chr(18);
    LptPort.SendString(s);
  end;
end;

При этом первый и третий отправляемые байты определяют наличие питания на контактах 2..9 и 18..25. Если посылаем нули, то питания не будет, и наоборот.

Это сообщение отредактировал(а) Fedia - 25.8.2006, 02:22


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 25.8.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Так и не ответили..  smile 

В качестве строки, помещаемой в "файл" (в порт в данном случае), мы берем:
00000000 - всё отключено
10000000 - первый контакт включен
01000000 - второй контакт включен
...
00000001 - последний контакт включен

Верно?
PM   Вверх
Fedia
Дата 25.8.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Цитата(Pakshin A. S. @  25.8.2006,  09:05 Найти цитируемый пост)
00000000 - всё отключено
10000000 - первый контакт включен
01000000 - второй контакт включен
...
00000001 - последний контакт включен

Верно?

Ну логично. 1-н байт ~ 8 бит ~ 8 контактов. Это для меня (думаю что и для тебя) было само собой разумеющееся smile Т.е. что бы подключить все контакты с 2 по 9 в порт отправляем 
s:=chr(255)+chr(11)+chr(54)+chr(18).
А для подключения всех контактов с 18 по 25:
s:=chr(11)+chr(54)+chr(255)+chr(18).   Проверить не могу, нет под рукой LPT устройств. Работает?

Это сообщение отредактировал(а) Fedia - 25.8.2006, 13:06


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 25.8.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Брр... Давно за компом не сидел..  smile 

Понятно что писать, если включать все контакты со 2-ого по 9-ый, но как включить отдельно второй, третий и так далее до девятого?
PM   Вверх
Albinos_x
Дата 25.8.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Pakshin A. S. @  25.8.2006,  14:48 Найти цитируемый пост)
Понятно что писать, если включать все контакты со 2-ого по 9-ый, но как включить отдельно второй, третий и так далее до девятого?


считываешь состояние порта, потом через xor , к примеру:
Код

   CRValue:=CRValue xor 04


потом записываешь опять в порт, получишь, что состояние бита инвертируется...

к примеру я использовал следующий код для опроса состояния входов порта:
Код

{----------------- Изменяем состояние линии Init ------------------}
   //CRValue:=Lpt.ReadPort(LPT2,LPT_CONTROL_REG);
   CRValue:=Lpt.ReadPort(LPT2,LPT_CONTROL_REG);
   CRValue:=CRValue xor 04;
   Lpt.WritePort(LPT2,LPT_CONTROL_REG,CRValue);
   // опрос                                       состояние  SelectIn одно
....
   {--------------- Изменяем состояние линии SelectIn ----------------}
   CRValue:=Lpt.ReadPort(LPT2,LPT_CONTROL_REG);
   CRValue:=CRValue xor 08;
   Lpt.WritePort(LPT2,LPT_CONTROL_REG,CRValue);
   // опрос                                    меняем  SelectIn
...
   {----------------- Изменяем состояние линии Init ------------------}
   CRValue:=Lpt.ReadPort(LPT2,LPT_CONTROL_REG);
   CRValue:=CRValue xor 04;
   Lpt.WritePort(LPT2,LPT_CONTROL_REG,CRValue);
   // опрос                                     состояние  SelectIn одно
...
   {--------------- Изменяем состояние линии SelectIn ----------------}
   CRValue:=Lpt.ReadPort(LPT2,LPT_CONTROL_REG);
   CRValue:=CRValue xor 08;
   Lpt.WritePort(LPT2,LPT_CONTROL_REG,CRValue);
   // опрос                                      меняем  SelectIn
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Fedia
Дата 25.8.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Pakshin A. S., Изменять строку в зависимости от контактов, которые необходимо активировать можно так:
Код

type
  TArContact = array[1..8] of Boolean;

//формируем отправляемое значение
function GetContactValue(ArContact: TArContact): Byte;
var
  i: Integer;
begin
  Result:=0;
  for i:=1 to 8 do
  case i of
    1: if ArContact[i] then Result:=Result or 128;
    2: if ArContact[i] then Result:=Result or 64;
    3: if ArContact[i] then Result:=Result or 32;
    4: if ArContact[i] then Result:=Result or 16;
    5: if ArContact[i] then Result:=Result or 8;
    6: if ArContact[i] then Result:=Result or 4;
    7: if ArContact[i] then Result:=Result or 2;
    8: if ArContact[i] then Result:=Result or 1;
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  ArContact: TArContact;
  s: string;
begin
  ArContact[1]:=True;  //второй контакт включен
  ArContact[2]:=false; //третий контакт выключен
  ArContact[3]:=True;  //четвертый контакт включен  и т.д.
  ArContact[4]:=True;
  ArContact[5]:=True;
  ArContact[6]:=False;
  ArContact[7]:=True;
  ArContact[8]:=True;
  //...
  //получаем строку
  s:=chr(GetContactValue(ArContact))+chr(11)+chr(54)+chr(18);
end;



--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 26.8.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Огромное спасибо!  smile 

И последнее приставание с моей стороны (точнее уточнение): чтобы на протяжении некоторого времени держать контакт под напряжением нужно отправлять данные в порт в цикле или достаточно один раз отправить данные, а потом их обнулить через некоторое время?

Добавлено @ 10:50 
Цитата(Fedia @  25.8.2006,  01:59 Найти цитируемый пост)
Попробуй посмотреть здесь 

Вдумчиво перечитал весь текст. Так какое напряжение будет получать устройство при подключении его на LPT порт? Там везде про 5 вольт говорится... smile
PM   Вверх
Albinos_x
Дата 26.8.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Pakshin A. S. @  26.8.2006,  10:36 Найти цитируемый пост)
И последнее приставание с моей стороны (точнее уточнение): чтобы на протяжении некоторого времени держать контакт под напряжением нужно отправлять данные в порт в цикле или достаточно один раз отправить данные, а потом их обнулить через некоторое время?

достаточно один раз послать...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Fedia
Дата 27.8.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Цитата(Pakshin A. S. @  26.8.2006,  10:36 Найти цитируемый пост)
Там везде про 5 вольт говорится...

Я сейчас немного покопался в инете. Похоже что напряжение с LPT подается 5-ти вольтовое, а для того, чтобы получить 12-ть используют преобразователи напряжения.
Вот здесь есть немного информации по этому поводу. Надеюсь что поможет.
А на счет поддержания напряжения тебе уже ответили smile Удачи !


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0870 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.