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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с LPT портом, запись в порт 
:(
    Опции темы
lovemusic
Дата 4.11.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток. Задача состоит в следующем. Есть LPT порт. К пинам DO-D7 подклбчены светодиоды. Нужно посредством функций WinApi обеспечить передачу байта информации, чтобы светодиоды загорелись, и значение удерживалось до тех пор пока не будет передан следующий байт. Пользоваться стороними библиотеками и драйверами нельзя.  Написал код: 
Код

procedure TForm1.Button1Click(Sender: TObject);
var dev:THandle;
    NumberWritten: DWORD;
    p:pointer;
    WriteBytes :  byte;
begin
  WriteBytes:=123;
  p:=@writebytes;
  dev:= CreateFile('\\.\LPT1',GENERIC_READ or GENERIC_WRITE,0,nil,
  OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
  WriteFile(dev, p^, sizeof(WriteBytes), NumberWritten, nil);
  CloseHandle(dev);
end;

 После запуска никаких изменений не происходит. Подскажите как решить проблему. 
PM MAIL   Вверх
morpheyushka
Дата 9.11.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Нужно убедиться, что адрес порта правильный...может ты отправляешь в никуда.
Дальше, ты уверен, что после отправки 123 должна загореться лампочка?


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
~FoX~
Дата 9.11.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 0
Всего: 68



lovemusic, Что то мне подсказвает что надо не 123 слать, а по отдбености 1, 2, 3...
И почему '\\.\LPT1' ?
http://www.pcports.ru/articles/10.php

Это сообщение отредактировал(а) ~FoX~ - 9.11.2009, 19:44


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
morpheyushka
Дата 10.11.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(~FoX~ @  9.11.2009,  19:37 Найти цитируемый пост)
Что то мне подсказвает что надо не 123 слать, а по отдбености 1, 2, 3...

Почти...можно и все сразу отправить...я так отправлял - работало все отлично:
Код

var
  Command: String;
  Buff: array [0..255] of Char;
  WritedCount, OutBuffLen: DWORD;

...

  Command := '123';  //команда для отправки
  FillChar(Buff, SizeOf(Buff), #0); //очищаем буфер
  StrPCopy(Buff, Command);  //запихиваем нашу команду в буфер
  WritedCount := 0;    //количество записанных байтов (в итоге должно равняться количество 
                                   //байтов для записи, то есть WritedCount  = OutBuffLen )
  OutBuffLen := Length(Command);   //количество байтов для записи
  WriteFile(PortHandle, Buff[0], OutBuffLen, WritedCount, nil);  //собственно пишем в порт




Цитата(~FoX~ @  9.11.2009,  19:37 Найти цитируемый пост)
И почему '\\.\LPT1' ?

В даном случае можно писать и просто LPT1. Конструкция "\\.\" используется для работы с портами, номера которых старше 9. Если попытаться подключиться к LPT11, то ничего не получится, а вот так - \\.\LPT11, все будет гуд.

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


Это сообщение отредактировал(а) morpheyushka - 10.11.2009, 10:49


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
~FoX~
Дата 10.11.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 0
Всего: 68



Ахась, я уже сам нашел, но все равно спасибо за объяснение... +1  smile 

Кстати в CreateFile передается не стринг, а пичар т.е. 
Код

  dev:= CreateFile(PChar('\\.\LPT1'),GENERIC_READ or GENERIC_WRITE,0,nil,
  OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);


Это сообщение отредактировал(а) ~FoX~ - 10.11.2009, 11:08


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
morpheyushka
Дата 10.11.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(~FoX~ @  10.11.2009,  11:07 Найти цитируемый пост)
Кстати в CreateFile передается не стринг, а пичар т.е. 

Точно...не досмотрел)))))
Только я без FILE_FLAG_OVERLAPPED работал. Кстати, автору он тоже не нужен для его задачи. С ним только сложнее будет. То есть подключаться так:
Код

dev:= CreateFile(PChar('\\.\LPT1'),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);



--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
~FoX~
Дата 10.11.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 0
Всего: 68



Нету у мя в системе лптешника, но вот что у меня получилось:
Код

function SendToPort(const PortName: string; SByte: string): integer;
var
  hPort: HWND;
  Buff: array [0..255] of char;
  WCount, BCount: DWORD;
begin
  Result := 0;
  FillChar(Buff, SizeOf(Buff), #0);
  StrPCopy(Buff, SByte);
  BCount := SizeOf(SByte)-1;
  try
    hPort := CreateFile(PChar('\\.\'+PortName), GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
    WriteFile(hPort, Buff, BCount, WCount, nil);
    Result := WCount;
  finally
    CloseHandle(hPort);
  end;
end;



Вызываеца так
Код

i := SendToPort('COM1', '123');

Думаю, что с лпт тоже самое прокатит...

З.Ы. Тестил на Advensed Port Monitor, вро ди как данные попадают в порт верно...


Это сообщение отредактировал(а) ~FoX~ - 10.11.2009, 11:53


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
morpheyushka
Дата 10.11.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(~FoX~ @  10.11.2009,  11:49 Найти цитируемый пост)
З.Ы. Тестил на Advensed Port Monitor, вро ди как данные попадают в порт верно...

А куда они денутся с подводной лодки smile 


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
lovemusic
Дата 11.11.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пробовал оба варианта кода. Если писать в COM порт, то все идет отлично. При записи же в LPT то прошрамма просто  зависает на строке 
Код

WriteFile(hPort, Buff, BCount, WCount, nil);

и все. 
PM MAIL   Вверх
~FoX~
Дата 11.11.2009, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 0
Всего: 68



lovemusic, Зависать может при обращении к несуществующему порту...
Сдернуто из ДРКБ определение наличие ЛПТ порта

Код

function PortExists(const PortName: string): Boolean;
var
  hPort: HWND;
begin
Result := False;
hPort := CreateFile(PChar(PortName), {name}
   GENERIC_READ or GENERIC_WRITE, {access attributes}
   0, {no sharing}
   nil, {no security}
   OPEN_EXISTING, {creation action}
   FILE_ATTRIBUTE_NORMAL or
   FILE_FLAG_OVERLAPPED, {attributes}
   0); {no template}
if hPort <> INVALID_HANDLE_VALUE then
begin
   CloseHandle(hPort);
   Result := True;
end;
end;

{Parallel Ports}

for i := 1 to 9 do begin
if PortExists('LPT' + IntToStr(i)) then
   List.Append('Ports: Printer Port (LPT' + IntTostr(i) + ')');
end;



Это сообщение отредактировал(а) ~FoX~ - 11.11.2009, 01:28


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
lovemusic
Дата 11.11.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проверил. Порт LPT1 существует. А при записи зависает smile . Через библиотеку inpout32.dll все работает. Не могу понять почему через API не хочет
PM MAIL   Вверх
~FoX~
Дата 12.11.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 0
Всего: 68



lovemusic, Схему подключения твоего девайса покажи...
И какой у тебя режим работы порта?
А драйвера на какой нить принтер не установлен в нем...?

Это сообщение отредактировал(а) ~FoX~ - 12.11.2009, 09:20


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
~FoX~
Дата 12.11.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

Репутация: 0
Всего: 68



Меняем концепцию.... smile  Будем использовать DeviceIOControl 
Код

const
IOCTL_PAR_SET_WRITE_ADDRESS = $16001C;

var
  hPort: HWND;
  ret: DWORD;
  Address: byte;
  Data: byte;

begin
  hPort := CreateFile(PChar('\\.\LPT1'), GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
  Address := $01; 
  Data := $AA; //10101010
  DeviceIoControl(hPort, IOCTL_PAR_SET_WRITE_ADDRESS, @Address, 1, nil, 0, ret, nil);
  WriteFile(hPort, Data, SizeOf(Data), ret, nil);
  CloseHandle(hPort);
end;

Вот только с Addres нужно по колдовать.... Теоретически  адрес = <Номер порта> or <Смещение регистра>


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
lovemusic
Дата 12.11.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нарыл исходник библиотеки Inpout32.dll:
Код

// inpout32drv.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "hwinterfacedrv.h"
#include "resource.h"
#include "conio.h"
#include "stdlib.h" 

void _stdcall Out32(short PortAddress, short data);
short  _stdcall Inp32(short PortAddress);
int inst();
int start();

char str[10];
int vv;

HANDLE hdriver;
char path[MAX_PATH];
HINSTANCE hmodule;
SECURITY_ATTRIBUTES sa;
int sysver;

int Opendriver(void);
void Closedriver(void);

BOOL APIENTRY DllMain( HINSTANCE  hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
      )
{

    hmodule = hModule;
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
  sysver = SystemVersion();
  if(sysver==2)
  {
    Opendriver();
  }
    break;
    case DLL_PROCESS_DETACH:
  if(sysver==2)
  {
    CloseHandle(hdriver);
  }
    break;
    }
    return TRUE;
}

/**************************************************
*********************/

void Closedriver(void)
{
    CloseHandle(hdriver);
}

void _stdcall Out32(short PortAddress, short data)
{

    switch(sysver)
    {
    case 1:
    _outp( PortAddress,data);
    break;

    case 2:
    unsigned int error;
    DWORD BytesReturned;        
    BYTE Buffer[3];
    unsigned short * pBuffer;
    pBuffer = (unsigned short *)&Buffer[0];
    *pBuffer = LOWORD(PortAddress);
    Buffer[2] = LOBYTE(data);

    error = DeviceIoControl(hdriver,
                            IOCTL_WRITE_PORT_UCHAR,
                            &Buffer,
                            3,
                            NULL,
                            0,
                            &BytesReturned,
       NULL);
    break;
    }

    
}

/**************************************************
*******************/

short _stdcall Inp32(short PortAddress)
{
    BYTE retval;
    switch(sysver)
    {

    case 1:
    retval = _inp(PortAddress);
    return retval;
    break;
    case 2:
  unsigned int error;
  DWORD BytesReturned;
  unsigned char Buffer[3];
  unsigned short * pBuffer;
  pBuffer = (unsigned short *)&Buffer;
  *pBuffer = LOWORD(PortAddress);
  Buffer[2] = 0;
  error = DeviceIoControl(hdriver,
                            IOCTL_READ_PORT_UCHAR,
                            &Buffer,
                            2,
                            &Buffer,
                            1,
                            &BytesReturned,
                            NULL);

  return((int)Buffer[0]);

    break;
    }
return 0;
}

/**************************************************
*******************/

int Opendriver(void)
{
    hdriver = CreateFile("\\\\.\\hwinterface", 
                                 GENERIC_READ | GENERIC_WRITE, 
                                 0, 
                                 NULL,
                                 OPEN_EXISTING, 
                                 FILE_ATTRIBUTE_NORMAL, 
                                 NULL);
    
    if(hdriver == INVALID_HANDLE_VALUE) 
  {
  
  
  if(start())
  {
    inst();
    start();

    hdriver = CreateFile("\\\\.\\hwinterface", 
                                 GENERIC_READ | GENERIC_WRITE, 
                                 0, 
                                 NULL,
                                 OPEN_EXISTING, 
                                 FILE_ATTRIBUTE_NORMAL, 
                                 NULL);

  }
  
  
  
  return 1;
  }
return 0;
}

/**************************************************
*********************/

int inst()
{

    SC_HANDLE  Mgr;
    SC_HANDLE  Ser;


    GetSystemDirectory(path , sizeof(path));
    HRSRC hResource = FindResource(hmodule, MAKEINTRESOURCE(IDR_BIN1), "bin");
    if(hResource)
    {
  HGLOBAL binGlob = LoadResource(hmodule, hResource);
    
  if(binGlob)
  {
    void *binData = LockResource(binGlob);
  
    if(binData)
    {
    HANDLE file;
    strcat(path,"\\Drivers\\hwinterface.sys");
    
    file = CreateFile(path,
          GENERIC_WRITE,
          0,
          NULL,
          CREATE_ALWAYS,
          0,
          NULL);

    if(file)
    {
     DWORD size, written;

     size = SizeofResource(hmodule, hResource);
     WriteFile(file, binData, size, &written, NULL);
     CloseHandle(file);

    }
    }
  }
    }


    Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS);
     if (Mgr == NULL)
  {       //No permission to create service
    if (GetLastError() == ERROR_ACCESS_DENIED) 
    {
    return 5;  // error access denied
    }
  }    
  else
  {
     Ser = CreateService (Mgr,                      
                                "hwinterface",                        
                                "hwinterface",                        
                                SERVICE_ALL_ACCESS,                
                                SERVICE_KERNEL_DRIVER,             
                                SERVICE_SYSTEM_START,               
                                SERVICE_ERROR_NORMAL,               
                                "System32\\Drivers\\hwinterface.sys",  
                                NULL,                               
                                NULL,                              
                                NULL,                               
                                NULL,                              
                                NULL                               
                                );




  }

CloseServiceHandle(Ser);
CloseServiceHandle(Mgr);

    return 0;
}
/**************************************************
************************/
int start(void)
{
    SC_HANDLE  Mgr;
    SC_HANDLE  Ser;

    Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS);

     if (Mgr == NULL)
  {       //No permission to create service
    if (GetLastError() == ERROR_ACCESS_DENIED) 
    {
    Mgr = OpenSCManager (NULL, NULL,GENERIC_READ);
    Ser = OpenService(Mgr,"hwinterface",GENERIC_EXECUTE);
    if (Ser)
    {    // we have permission to start the service
     if(!StartService(Ser,0,NULL))
     {
      CloseServiceHandle (Ser);
      return 4; // we could open the service but unable to start
     }
     
    }

    }
  }
  else
  {// Successfuly opened Service Manager with full access

    Ser = OpenService(Mgr,"hwinterface",GENERIC_EXECUTE);
    if (Ser)
    {
     if(!StartService(Ser,0,NULL))
     {
      CloseServiceHandle (Ser);
      return 3; // opened the Service handle with full access permission, but unable to start
     }
     else
     {
      CloseServiceHandle (Ser);
      return 0;
     }

    }

  }

return 1;
}

PM MAIL   Вверх
lovemusic
Дата 12.11.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(~FoX~ @ 12.11.2009,  08:57)
lovemusic, Схему подключения твоего девайса покажи...
И какой у тебя режим работы порта?
А драйвера на какой нить принтер не установлен в нем...?

Схема проста:
user posted image
Режим работы порта пробовал и EPP и ECP. Ни так ни так не работает. Драйвера не устанавливал. Принтера даже нету. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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