Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2009, 03:02   #1
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
Вопрос Работа с LPT-портом

Если что прошу прощения, опять врываюсь в панике и могу наследить не там где нуно.... но вообщем вот:

Передо мной стоит задача - написать на Делфях дрова для девайса, подключённого к компу через LPT-порт.
На данный момент я не знаю особенностей девайса и вообще как писать дрова на Делфях, и вообще как писать дрова О_о ...
Всё что мне сказали в двух словах - цель: перекидываться с девайсом байтами - т.е. считывать и посылать переменные типа 01110011 ... Впихнули в лапы пример этих дров, но написанных на Сишке... В Сишке я не бум-бум(знаю тока строение прог и как вводить и выводить переменные... и то точно не помню...)... Заметил только, что в этих дровах активно используется команда сетбайт и гетбайт ... Разбираться буду на этих выходных...

Ну и в общем, прошу помощи:
Киньте ссылку на хороший мануал по написанию дров на делфи для LPT-портов. Расскажите(если это можно рассказать в двух-трёх-пяти словах) как можно осуществить перекидывание байтами с LPT-портом. Ответьте - есть ли какой нибудь конвентер/перекодировщик из Сишки в Делфю и поможет ли он мне в моей проблеме...
И скажите что это просто... так, для моего самоуспокоения))))

PS: Ыть, увидел внизу тему сноски на похожие темы)))) Не ругайтесь, щас их тоже почитаю)))
Я вредный и нервный, но бдобр.

Последний раз редактировалось Karp_13; 22.10.2009 в 03:06.
Karp_13 вне форума Ответить с цитированием
Старый 22.10.2009, 03:28   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если написать приложение которое будет взаимодействовать с портом то реально на Делфи...драйвер нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.10.2009, 07:51   #3
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Для работы в Дельфи с LPT - портом удобно использовать готовую СИ -шную библиотеку inpout32.dll. Используются функции :
Код:
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
 function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
Inp32 - читает число (тип - байт) с порта, Out32 - записывает такое же число в порт.
О портах LPT ($378,$379,$37A) почитайте в сети (есть ссылки в темах внизу).
Для работы побайтово, я написал функцию перевода десятичного числа в бинарное:
Код:
TMas = Array[0..7]of byte;

// ********** преобразование числа (десятичный код) в бинарный  массив ****
function Dec_Bin(N_dec: integer): TMas;
var i: byte;
    weight: byte;  // "вес" разряда
    mas_bit: TMas;
begin
  weight:= 128;
  for i:= 7 downto 0 do
  begin
    mas_bit[i]:= N_dec div weight;
    if mas_bit[i] = 1 then N_dec:= N_dec - weight;
    weight:= weight div 2;
  end;
  Result:= mas_bit;
end;
Функция возвращает массив битов байта числа N_dec.
В общем виде чтение конкретного [i] бита порта следующее:
Dec_Bin(inp32($378))[i]
Для отправки через порт конкретного бита ( например 3-го) записываем в порт соответствующее десятичное число - 8 ( b00001000).Если следующим надо изменить 5-й бит, не меняя предыдущее состояние остальных битов, то , соответственно, записываем 40 (b00101000).
И т.п.
Важно отметить, что состояния уровней в портах не совсем соответствует двоичному коду, так как некоторые биты используются с инверсией.Так, например, коду b01111000 (dec 120) в $379 соответствуют уровни напряжения на выходе порта - 1,1,1,1,1,(0,0,0 -три последних физически отсутствуют). Это обязательно надо учитывать.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 22.10.2009, 12:12   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Для работы в Дельфи с LPT - портом также удобно использовать готовый драйвер - giveosys.sys/
достаточно инициализировать его запуск из своего проекта и в nt можно обращаться напрямую к портам...

модуль и драйвер (в pas):
Вложения
Тип файла: zip raport.zip (4.2 Кб, 234 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 22.10.2009 в 12:19.
raxp вне форума Ответить с цитированием
Старый 22.10.2009, 23:40   #5
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
По умолчанию

Гыг, громадный сенкс за помощь, на выходных буду копаться =))))

А пока отходя от темы и принимая во внимание сообщение ПФеникса:
А что, с написанием дров для разнообразных девайсов на Делфях действительно всё так плохо? Или просто(как многократно слышу отовсюду) дело в том, что для Делфей мало исходников в сети(и отсюда больше мороки)?
Кто может мне мини лекцию прочитать(опять же в двух-трёх-пяти словах) с ответом на этот самый вопрос "почему?"? -_- ))
*что переходить на Си нуно - это я и так знаю... но просто лень пока, недостаток времени мешает и (быть может из-за первых двух пунктов) интересно ещё в Делфях покопаться немного)))*
Я вредный и нервный, но бдобр.
Karp_13 вне форума Ответить с цитированием
Старый 22.10.2009, 23:47   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
в двух-трёх-пяти словах
просто ddk на delphi очень мало переведено, в основном все на си... а так способы есть, просто мало кто знает, да и смысла особого нет
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 25.10.2009, 19:06   #7
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
По умолчанию

Ага, получилось. Научился(через библиотеку inpout32.dll) управлять портом 378 - пинами со 2-го по 9-ый - вставленные в них диоды гаснут и загораются по моей воле.)))

Так, теперь можно небольшое уточнение(каша в голове):
Адрес 378(пины 2-9) используется для чтения и передачи данных;
Адрес 379(пины 10-13,15) - только приём данных с внешнего устройства;
Адрес 37А(пины 1,14,16-17) - только передача данных на внешнее устройство;

Адрес 378, как выше и писал, я победил - понял как обращаться к определённому пину. Но чёрт, никак не пойму как быть с 379 и 37А - как обратиться к определённому пину из этих адресов(в чём там логика)? О_о ...
Я вредный и нервный, но бдобр.
Karp_13 вне форума Ответить с цитированием
Старый 25.10.2009, 19:28   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

к определенному пину можно так обратиться:
Код:
function getbit(data,num:byte): boolean;
 begin
  result:= data and num = num
 end;
- а распределение там следующее (все это есть в raport.pas)
Цитата:
const BA = $378; //базовый адрес LPT
BR = BA+1; //регистр контроля
BU = BA+2; //регистр управления $37A
{
PIN сигнал I/O BIT
2 D0 O 0 (BA)
3 D1 O 1 (BA)
4 D2 O 2 (BA)
5 D3 O 3 (BA)
6 D4 O 4 (BA)
7 D5 O 5 (BA)
8 D6 O 6 (BA)
9 D7 O 7 (BA)

1 strobe O 0 (BA+1) INV
14 auto fd O 1 (BA+1) INV
16 init O 2 (BA+1)
17 slct in O 3 (BA+1) INV

15 error I 3 (BA+2)
13 slct I 4 (BA+2)
12 pe I 5 (BA+2)
10 ack I 6 (BA+2)
11 busy I 7 (BA+2) INV

18..25 земля -
}
- например вам нужен ACK (6 бит), т.е читаете $37A и выделяем 6 через
getbit(data,6)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 25.10.2009 в 19:30.
raxp вне форума Ответить с цитированием
Старый 26.10.2009, 01:09   #9
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
Вопрос

*Чёрт, сижу с градусником под мышкой и пачкой цитрамона в обнимку... так что если что не кидайте тапками)))*

raxp, как я понял, чтобы разобраться в твоём сообщении, нужно разобраться с содержимым файла raport.pas. Ладно, займусь, но завтра(как полегчает)...)))
А пока, просто задам два-три вновь всплывших у меня вопроса:

1. Что касается портов 379 и 37А - на первый положено 5 бит(по числу пинов), на второй 4 бита. Я хочу послать, допустим, в адрес 37А число в десятеричной системе исчисления и чтобы в этом адресе(если что, извиняйте за корявую терминологию) в итоге была картина типа '0100' - т.е. "зажечь" 16-ый пин. И вот теперь, чъорт, я туплю - какое это должно быть число? Не могу определить зависимость между этими самыми числами в десятеричной системе исчисления и тем что получается на порту. К примеру, что касается порта 378 - там всё понятно - хотим зажечь 9-ый пин - кидаем в порт число 128 - 128 ведь кок раз в двоичной системе выглядит как '10000000' - 9-ый пин "зажигается". Но что делать с адресами 379 и 37А не врублюсь...
В программе 3D Hard Analyzer видимо(т.е. наверняка) есть функция этого самого перевода - но я щас не в состоянии перекапывать ради неё весь код той программы %((
Может кто так подскажет?

2. Как понял, у ЛПТ порта есть так называемые режимы работы. О_о И как понял, зависят они от ноликов и единичек на пинах по адресу 37А. (к примеру, пин 1 везде подписывают как Data Strobe ...)
Не нашёл мануала, подробно повествующего об этом. Может кто сможет что нибудь подобное посоветовать? О_о
(ps: нашёл вот такую ссылку http://citforum.univ.kiev.ua/operati...dows/parp_win/ - там много всего непонятного написанно... завтра буду разгребать... вроде что-то похожее там есть...)

3. Производственный процесс показал, что мне следует сменить библиотеку inpout32.dll на WinIO.dll.
И вот не могу найти приличного мануала(или хотя бы списка команд) для этой(WinIO.dll) библиотеки. Может кто нибудь что нибудь посоветовать?

ps: Кстать, DeKot, спасибо за функцию - помогла)))
Я вредный и нервный, но бдобр.

Последний раз редактировалось Karp_13; 26.10.2009 в 01:23.
Karp_13 вне форума Ответить с цитированием
Старый 26.10.2009, 12:05   #10
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
Как понял, у ЛПТ порта есть так называемые режимы работы.
Все режимы обеспечиваются программно.Порт LPT в основном был разработан для работы с принтерами (отсюда и специфические названия выводов/вводов портов).Если запущен какой либо драйвер работы с принтером, тогда состояния порта $379 влияет на состояния портов вывода $378, $37A.В обычном состоянии компьютера порты вывода могут иметь любые случайные значения, а порт $379 (status) имеет уровни
1 1 1 1 1 или код bin 0 1 1 1 1 (dec 120).
Коды и состояния портов смотри на рисунке ( для $379 часть из 32 возможных состояний).

Для управления портом $379 следует подавать нулевой уровень (желательно через сопротивление 430 - 510 Ом) на контакты порта.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление LPT портом nikleb Паскаль, Turbo Pascal, PascalABC.NET 5 27.05.2010 19:40
Управление LPT портом Kuzmichinishe Помощь студентам 3 28.09.2009 11:07
Не получается управлять LPT-портом NikVE Общие вопросы C/C++ 3 06.04.2009 12:50
Работа с LPT портом chingiz Паскаль, Turbo Pascal, PascalABC.NET 1 17.11.2007 21:21