Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > И снова LPT


Автор: AndAnd 28.9.2006, 20:24
Здравствуйте, участники форума! Знаю, что данная тема поднималась не раз, проглядел поиск, но подходящей информации не нашел или не смог ее правильно применить. В  общем я хотел бы подавать импульсы с определенным периодом на осциллограф (на нем должны быть четкие ступеньки видны), так вот вопрос как в C++ (DOS) или Builder или Delphi сделать правильное обращение к порту и подавать значения на него. Видел много сорсов, но в них используется какой-то драйвер,кода которого нигде нет, через который на LPT подаются эти значения и вообще инициализируется порт. Может кто может объяснить как, что и зачем должно идти при работе с портом. Есть простенькая программа из книги, но она не пашет,т.е. никаких импульсов не выдает (программы, которые через драйвер проверял, все работает). Вот собственно код:
Код

#include <dos.h>
#include <conio.h>
#include <stdio.h>
int Out_Add = 0x3bc; //вот это вроде адрес порта, может кроме адреса необходимо как-то подключиться к нему?
void main()
{
  int data,error=1;
  clrscr();
  printf("\033[5;5H enter two HEX numbers");
  printf("keypad for exit with programm");
  printf("press Enter");
  do
  {
   gotoxy(35,5);
   fflush(stdin);
   error = scanf("%2X",&data);
   outp(Out_Add,data);//это вроде бы как вывод на порт

  }
  while (error!=0);


}

Спасибо. Очень хотел бы услышать ваше мнение на данный вопрос.

Автор: cppforever 28.9.2006, 21:25
Уточни, пожалуйста, какую ОС используешь. Дело в том, что Win NT, 2000, XP не разрешает работать напрямую (с помощью функций outp() и  inp()) с портами, как это раньше делалось в DOS. В Win 98/95 пример должен работать. Причем не стоит забывать, что у LPT порта есть три регистра (Data, Status, Control). Мне когда надо было общаться с модулем АЦП через LPT я использовал библиотеку WinIO которая позволяет обходить защиту ОС и обращаться к порту напрямую...

Автор: AndAnd 29.9.2006, 05:54
Цитата(cppforever @ 28.9.2006,  21:25)
Уточни, пожалуйста, какую ОС используешь.

Использую WinXP. На других не проверял. Но мне бы желательно именно на последних версиях ОС. А что там за защита в NT и как ее обойти своими средствами (не используя драйвера скаченые с инета), можешь дать иформацию, хоть какую-нибудь, или примерчик.
Цитата(cppforever @ 28.9.2006,  21:25)
Причем не стоит забывать, что у LPT порта есть три регистра ....

У меня используется один из регистров (с 2 по 9) и земля, т.е. два контакта мы подсоединяем к прибору.

Автор: AndAnd 29.9.2006, 21:40

Код


hLpt =
 CreateFile( "LPT1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );

 sprintf(buf, "1111");

 BOOL res =
 WriteFile(hLpt, &buf, strlen(buf), &ret, NULL);

 CloseHandle(hLpt);



Будут ли подваться импуьсы на lpt, если зациклить этот кусок кода (теоретически)? Может есть еще какие-нибудь способы?

Автор: cppforever 1.10.2006, 12:01
Мне тоже не нравился тогда вариант с использованием дополнительных библиотек и драйверов. Пытался разобраться как писать/читать из порта с помощью CreateFile(), WriteFile(), ReadFile() - не получилось. Пришлось использовать первый подход. Причем я перепробовал несколько библиотек и выбрал WinIO т.к. она оказалась самой быстрой. Так что если у тебя получится применить второй подход буду признателен если расскажешь КАК ;)

Автор: GremlinProg 1.10.2006, 16:23
ЛПТ - не самый лучший вариант по определению, этот интерфейс не может быть реализован асинхронно, как альтернатива - КОМ. С комом и апешек поболее и работать приятно. Но если все же вам хочется позаморачиваться с роритетным лпт, то вот ссылочка на очень понятно расписанный ресурс "Работа с параллельным портом в Windows NT":
http://junglewin.narod.ru/lpt.html
ключевой момент в лпт - получение и установка состояния порта(чтение/запись), которое, как вы уже поняли, нужно включать и выключать перед записью. Для этого автор использует иоктл-коды из ддк и DeviceIoControl.
Если вы все же полезете в эти дебри, то самым ленивым может понадобиться ntddpar.h для Parclass.sys, пишите, поищу.

Автор: MoZy 5.10.2006, 18:26
Проблема вся в том, что если без левых драйверов хочется обойтись, то нужно ваш "принтер" переключить в обычное состояние. а именно спаять контакты земли (18-25) с 11 и 12 (busy и paperend), тем самым переведя в состояние log0 или по-просту false.

а теперь все будет работать
Код

hLPT = CreateFile("LPT1",
      GENERIC_READ | GENERIC_WRITE,
      0,    /* comm devices must be opened w/exclusive-access */
      NULL, /* no security attrs */
      OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */
      0,//FILE_FLAG_OVERLAPPED,  /* not overlapped I/O */
      NULL  /* hTemplate must be NULL for comm devices */
      );
    
if(hLPT == INVALID_HANDLE_VALUE) errt("Didn't open port");
 
char data=0xff;

WriteFile(hLPT,&data,(DWORD)1,(DWORD*)&wrot,NULL); 



вот тут http://www.radioland.net.ua/sxema-maincat-7.html
http://LPT-PORT.NAROD.RU

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