Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова LPT 
:(
    Опции темы
AndAnd
Дата 28.9.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, участники форума! Знаю, что данная тема поднималась не раз, проглядел поиск, но подходящей информации не нашел или не смог ее правильно применить. В  общем я хотел бы подавать импульсы с определенным периодом на осциллограф (на нем должны быть четкие ступеньки видны), так вот вопрос как в 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);


}

Спасибо. Очень хотел бы услышать ваше мнение на данный вопрос.
PM MAIL   Вверх
cppforever
Дата 28.9.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Шустрый
*


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

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



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

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

У меня используется один из регистров (с 2 по 9) и земля, т.е. два контакта мы подсоединяем к прибору.
PM MAIL   Вверх
AndAnd
Дата 29.9.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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




Код


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, если зациклить этот кусок кода (теоретически)? Может есть еще какие-нибудь способы?
PM MAIL   Вверх
cppforever
Дата 1.10.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне тоже не нравился тогда вариант с использованием дополнительных библиотек и драйверов. Пытался разобраться как писать/читать из порта с помощью CreateFile(), WriteFile(), ReadFile() - не получилось. Пришлось использовать первый подход. Причем я перепробовал несколько библиотек и выбрал WinIO т.к. она оказалась самой быстрой. Так что если у тебя получится применить второй подход буду признателен если расскажешь КАК ;)
PM MAIL   Вверх
GremlinProg
Дата 1.10.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MoZy
Дата 5.10.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Проблема вся в том, что если без левых драйверов хочется обойтись, то нужно ваш "принтер" переключить в обычное состояние. а именно спаять контакты земли (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); 



вот тут немножко про лпт - полезно
и тут
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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