Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.03.2012, 11:50
Аватар для zoox
zoox zoox вне форума
Прохожий
 
Регистрация: 04.03.2012
Сообщения: 3
Репутация: 10
По умолчанию Работа с LPT портом

Нужно сделать программу для передачиданных в lpt и чтения с него. Пробовал использовать драйвера такие как giveio.sys и inpout32.dll. Сразу скажу что результат одинаковый поэтому буду приводить на примере inpout32.dll. Библиотека работает но не так как мне нужно. Я сделал маленькую тестовую программку и обнаружил следующее при ее работе: максимальная частота передачи данных на LPT примерно 50 Гц. А мне нужно 3-5 кГц
Я использовал таймер на вызов функции передачи данных в порт. В программке есть SpinEdit и он управляет интервалом таймера. Так вот: при изменении значения spinedit я заметил что регулировка выходной частоты на порте производится ступеньками, тоесть изменения частоты вступают в силу только при изменении интервала на 15-20 делений. (может проблема в таймере?)
Но я пробовал и без таймера. Просто цыкл, даже без задержек чтоб получить максимальную частоту на выходе порта. Получил теже 50 Гц только с менее стабильной частотой. Работаю с портом под ХР.
У меня есть уже готовая программка которая выдает под ХР на порт даже 10 кГц но проблема в том что я незнаю через какой она драйвер работает и она меня не устраивает по функционалу. Может приложению нужно установить привелегии? Скажите, как мне решить проблему...
З.Ы. Если нужно - могу выложить исходник своей тестовой программки, она маленькая
Ответить с цитированием
  #2  
Старый 04.03.2012, 14:06
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

а если попробовать без библиотек м.б. в них что-то не то при работе в WinXP с каким-либо сервис паком или так может что-то проясниться
Ответить с цитированием
  #3  
Старый 04.03.2012, 19:31
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

А если попробовать без LPT? Я так понял, что связь не с принтером? (У нас CAN была настроена на 125Кбод. Хотя можно было и увеличить скорость. Переходники есть через USB и Ethernet).

Последний раз редактировалось AlexSku, 04.03.2012 в 19:34.
Ответить с цитированием
  #4  
Старый 04.03.2012, 21:00
Аватар для zoox
zoox zoox вне форума
Прохожий
 
Регистрация: 04.03.2012
Сообщения: 3
Репутация: 10
По умолчанию

Нет, нужен именно LPT. Хотя в программе будет поддерживатся еще и USB. Но сейчас вопрос стоит только для LPT. Это для станков ЧПУ и большинство станков работают именно по LPT. Поэтому и скорость нужна большая (для шаговых двигателей) и стабильная регулировка частот на выходе порта.
Насчет работы с портом через файл если честно немного не понял. Обьясните кто знает. Вот исходник:
Код:
var
  Form1: TForm1;
  hLPT: THandle;
  Data: byte;
  Data2: byte;
  ret: DWORD;
  Address: byte;

const
IOCTL_PAR_SET_WRITE_ADDRESS = $16001C;

Далее процедура при нажатии на кнопку:

Address := $AA;
hLpt := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, 0, nil,
        OPEN_EXISTING, 0, 0);
DeviceIoControl(hLpt, IOCTL_PAR_SET_WRITE_ADDRESS, @Address, 1, nil, 0, ret, nil);
// Запись
writefile(hlpt, [$55], 1, ret, nil);
// Чтение по адресу
ReadFile(hLPT, Data2, 1, ret, nil);
Panel1.Caption := inttostr(data2);
CloseHandle(hLpt);
Админ: Пользуемся тегами для оформления кода!

Обьясните для чайника где адрес порта? Если это переменная address то почему ее значение $AA? Это же не лпт порт... Пробовал вместо $AA писать 888 и $378, кидал туда самые разные данные но на выходе порта ничего не происходило. Что я делаю нетак?
Ответить с цитированием
  #5  
Старый 05.03.2012, 00:20
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
Сообщение от zoox
Код:
hLpt := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, 0, nil,
        OPEN_EXISTING, 0, 0);
hLpt-хэндл (системный ID) LPT порта, CreateFile открывает порт с установленными параметрами (здесь открываем для записи и для чтения, уже существующий (а как иначе))) с текущими привилегиями и дескриптором защиты) подробнее тут или тут
Цитата:
Сообщение от zoox
Код:
DeviceIoControl(hLpt, IOCTL_PAR_SET_WRITE_ADDRESS, @Address, 1, nil, 0, ret, nil);
настраиваем LPT порт (через драйвер порта) подробнее тут или тут

Цитата:
Сообщение от zoox
Код:
// Запись
writefile(hlpt, [$55], 1, ret, nil);
записываем в ранее открытый порт ОДИН байт со значением 0х55
Цитата:
Сообщение от zoox
Код:
// Чтение по адресу
ReadFile(hLPT, Data2, 1, ret, nil);
Panel1.Caption := inttostr(data2);
читаем из ранее открытого порта ОДИН байт и выводим его занчение
Цитата:
Сообщение от zoox
Код:
CloseHandle(hLpt);
закрываем порт и освобождаем занятый хэндл

фактически адрес порта это и есть его хэндл, по другому как-то понять
Цитата:
Обьясните для чайника где адрес порта?
мой мозг отказывается

как-то так

Последний раз редактировалось cotseec, 05.03.2012 в 00:24.
Ответить с цитированием
  #6  
Старый 05.03.2012, 22:37
Аватар для zoox
zoox zoox вне форума
Прохожий
 
Регистрация: 04.03.2012
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо, уже понял. Но почемуже тогда на порт ничего не выходит? на пинах нет изменения и при чтении выдает зеро
Ответить с цитированием
  #7  
Старый 05.03.2012, 23:31
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Если по аналогии с СОМ портом...
прочитаем что-то с порта только если на порт что-то ответило подключенное устройство, в противном случае - нуль

если вы пытаетесь посмотреть изменение на контактах порта в процессе работы рассмотренной ранее процедуры, то по идее просто не успеете (открыли порт, настроили, что-то отослали, закрыли) - доли секунды
по одной кнопке открывайте и отправляйте, а по другой - закрывайте порт, смотрите изменение между нажатиями на кнопки (т.е. до закрытия порта, пока хендл порта не уничтожен), как-то так, что-то иное предложить пока не очень
Ответить с цитированием
  #8  
Старый 05.03.2012, 23:38
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Могу скинуть мой пример, он переключал светодиоды, но, в принципе, предназначалса для тех же самых целей. Делал давно, сор за украинский интерфейс) еще на 2м курсе универа. Для работы нужен драйвер lptwdmio.sys (есть в папке с проектом, пусть там и остается). Так же есть возможность принимать и входные сигналы, здесь не реализированно.
Весь мануал и примеры тогда взялздесь
Вложения
Тип файла: rar LPTProject.rar (47.0 Кбайт, 47 просмотров)

Последний раз редактировалось YVitaliy, 05.03.2012 в 23:50.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter