Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как из под WIndows 9x/NT ловить прерывания? [Win95/98, NT4]


Страницы:   1 2 3

Ш-К ©   (2002-10-07 04:28:00) 

Есть проблема с получением данных через lpt порт. Заслать данные то я могу, а вот "поймать момент" когда порт начинает передавать данные - не получается.

Я использую TDLPortIO.dll, как драйвер пр. режима. Через него можно только читать данные. А как узнать "когда"?

Есл я понимаю правильно, надо обрабатывать int7. Или, может, есть какие обходные варианты для решения проблемы? Не только через прерывания.


Пятачок   (2002-11-04 06:40:00) [1]

Ой мамочка!!!....


Digitman   (2002-10-25 16:22:00) [2]

>jonik pegas
>>В Microsoft не учли ...

Да вот как раз и учли) ... Иначе - кому эта P&P нужна, спрашивается)...


Eliseev Andrey   (2002-10-25 16:16:00) [3]

Есть такая библиотека TetaPCHW ( http://www.geocities.com/tetasoft/).

Там есть все функции для работы с LPT включая установку IRQ.
Вот цитата из ReadMe.

procedure LPTEnableIRQ(IRQEnabled: Boolean);
--------------------------------------------
Forces an LPT device to generate interruptions when ACK line(Pin 10) has a HIGH
electrical level.

type
TInterruptHandler = procedure (IrqNumber : WORD) of object;
property OnHwInterrupt: TInterruptHandler;
------------------------------------------
This is an event property which allows you to install your own application
handler for all IRQs. Note, due to Windows is not a verily multi-task system of
real time the time of delivery a message about an IRQ generated up to your
application interrupt handler is not assured.


jonik pegas   (2002-10-25 16:13:00) [4]

Дополнение
Точнее наверняка можно это делать и на WinApi через DeviceIOControl но пока неясно как


Eliseev Andrey   (2002-10-25 16:10:00) [5]

Есть такая библиотека TetaPCHW ( http://www.geocities.com/tetasoft/).

Там есть все функции для работы с LPT включая установку IRQ.
Вот цитата из ReadMe.

procedure LPTEnableIRQ(IRQEnabled: Boolean);
--------------------------------------------
Forces an LPT device to generate interruptions when ACK line(Pin 10) has a HIGH
electrical level.

type
TInterruptHandler = procedure (IrqNumber : WORD) of object;
property OnHwInterrupt: TInterruptHandler;
------------------------------------------
This is an event property which allows you to install your own application
handler for all IRQs. Note, due to Windows is not a verily multi-task system of
real time the time of delivery a message about an IRQ generated up to your
application interrupt handler is not assured.


jonik pegas   (2002-10-25 16:09:00) [6]

>Diditman
>1. значение FLPTBase ты откуда взял ?
>Из книжки по программированию станд.портов под MS-DOS ?
>Если так, то для Win32 это не годится. Мало ли какие ресурсы (в >части базы портов в/в) выделит система на этапе старта для LPT->дивайса при его инициализации ! Мало ли как P&P во >взаимодействии с legacy-установками отработает !
Ты безусловно прав. НО! Для COM порта такие вещи проходят-WIN API функции в принципе позволят реализовать любой протокол обмена. С принтерным портом-такие вещи не проходят. В Microsoft не учли что существуют маньяки которые в принтерный порт всякую ерунду а не принтеры пихают. Если бы можно было сделать что то вроде
hPort=CreateFile ("LPT1",...
SetPortMode(hPort,EPP_MODE
SetPortState(hPort,ACK_HI-и т.д -например проблемы бы не было



Digitman   (2002-10-25 16:03:00) [7]


> А ничего не может говорится, потому что эти функции всего
> лишь обертки для ассемблерных функций in и out. Откуда они
> узнают о готовности порта ?


Я и спрашиваю о документации, потому что понятия не имею, так ли выглядит на самом деле то, о чем ты говоришь в отношении конкретно данного библиотечного интерфейса


Digitman   (2002-10-25 15:58:00) [8]

Ну какое тебе, скажи на милость, дело до того, как таймауты реализованы ? Если есть возможность изменить таймауты на любое нужное тебе значение, почему не попробовать воспользоваться этим ?


jonik pegas   (2002-10-25 15:58:00) [9]

>Digitman
> Меня интересует, что говорится в док-ции по поводу >синхронизации этих ф-ций с состоянием готовности порта к >приему/передаче.
А ничего не может говорится, потому что эти функции всего лишь обертки для ассемблерных функций in и out. Откуда они узнают о готовности порта? (Хотя мы наверное говорим о разных портах-я о портах ввода/вывода аппаратуры, а не о томчто в CreateFile подставляются ). Их поведение целиком определяется аппаратурой. Скажем записывая в регистр порта LPT_BASE_ADDRESS+3 байт (каким угодно способом) мы генерируем шинный цикл EPP. Данные выставляется, процессор приостанавливается и ожидает ответа от перифирийного устройства. Если оно пришло-процессор выполняет следующую команду, не пришло-через 10 мкс он все равно выполняет следующую команду. Узнать о успехе/неуспехе/неготовности операции можно только прочитав определенной бит регистра порта. Это определяется аппаратурой и совершенно не зависит от программной реализации.
>Ш-К
1.IMНО неправильная логика работы аппаратуры. И с никакими тайм-аутами DLPort не работает-читай выше.


Ш-К   (2002-10-25 15:49:00) [10]

Согласен, с 9х проблем меньше.

1. Поле объекта, реально вычисляется в конструкторе. Но это сейчас не актуально.

2. Таймауты реализованы на аппаратной части в маме. Они стандартны. А вызов функции ReadByte - это запуск цикла чтения чипсета.

Имхо, Винда программно может реализовать тоже самое. Сейчас DDK нет под рукой, но помню, есть файл ерр.с, где протокол расписан.


Digitman   (2002-10-25 15:27:00) [11]

>Ш-К

Нет, подожди).. Мы тут как бы об NT-платформе рассуждаем в 1-ю очередь. В Маздае - там все до смешного просто, в т.ч. и доступ к IDT с целью установки собственного дескриптора шлюза

1. значение FLPTBase ты откуда взял ?
Из книжки по программированию станд.портов под MS-DOS ?
Если так, то для Win32 это не годится. Мало ли какие ресурсы (в части базы портов в/в) выделит система на этапе старта для LPT-дивайса при его инициализации ! Мало ли как P&P во взаимодействии с legacy-установками отработает !


2. >>И вообще, работает на таймаутах (~10 Мкс).
Вот это уже "ближе к телу". Что мешает тебе установить иной таймаут (вплоть до INFINITE-) для коммуникационного дивайса вызовом SetCommTimeouts() ?


Ш-К   (2002-10-25 15:08:00) [12]


> инициализация EPP-режима вполне может быть доступна через
> ControlService(),

Хотелось бы, чтоб и под 9х работало. Хотя интересно - сюда ещё не лазил.

> взглянуть на реестровые записи для установленного в систему
> IOmega ZipDrive

Или другого устройства, реально работающего с ЛПТ. Чувствую будет там работа простого самолепного кернел-драйвера.


Ш-К   (2002-10-25 14:52:00) [13]

function PinACK: boolean;
begin
result:= (Port[FLPTBase+1] and $40)<>0;
end;

А что ещё тут может быть?

TDlPortReadPortUchar = function(Port : Word) : Byte; stdcall;

ReadByte : TDlPortReadPortUchar;

@ReadByte:=GetProcAddres(FDLLInst,"DlPortReadPortUchar");


Всё, больше никакой инфы по функциям. Ни в доках ни в текстах.

> Меня интересует, что говорится в док-ции по поводу синхронизации
> этих ф-ций с состоянием готовности порта к приему/передаче.

Ничего не говорится. Имхо её нет. Собственно, к этой синхронизации и больше не к чему я и пытаюсь подобраться.

> Возвращает ли , скажем, вызванная тобой ф-ция PortRead()
> управление вызывающему коду немедленно или блокирует выполнение
> код.потока до тех пор, пока порт не будет готов к чтению
> принятых данных ?

Возвращает немедленно. И вообще, работает на таймаутах (~10 Мкс).

> Что возвращает ф-ция, если данные отсутствуют ?

Они не могут отсутсвовать. Стоит например в порту $FF или $00, так функция будет считывать этот бай постоянно. С таймаутами через 10 Мкс. Если ПУ отвечает, то на порядок быстрее. И этот байт будет стоять пока либо хост, либо ПУ его не изменит.


Digitman   (2002-10-25 14:39:00) [14]

Оч показательно и полезно, думаю, будет взглянуть на реестровые записи для установленного в систему IOmega ZipDrive, соврем.модели которого, как известно, как раз позволяют использовать LPT для работы в EPP-режиме с использованием прерываний


Digitman   (2002-10-25 14:34:00) [15]

Кр. того. подозреваю, что инициализация EPP-режима вполне может быть доступна через ControlService(), подобно тому, как система работает со станд.сервисом с именем "Parport"

см.для примера
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ACPI\PNP0401\3&61aaa01&0


Digitman   (2002-10-25 14:03:00) [16]


> PinACK - это Pin ACK. Штырёк (ножка порта)


При чем здесь "штырек" ? Я спросил - что за идентификатор "PinACK" в твоей программе ? Как он объявлен у тебя ? Это что - переменная или ф-ция ?


Приведи описания ф-ций

PortRead/Write
PortWRead/Write
PortLRead/Write

Меня интересует, что говорится в док-ции по поводу синхронизации этих ф-ций с состоянием готовности порта к приему/передаче.

Возвращает ли , скажем, вызванная тобой ф-ция PortRead() управление вызывающему коду немедленно или блокирует выполнение код.потока до тех пор, пока порт не будет готов к чтению принятых данных ? Что возвращает ф-ция, если данные отсутствуют ?


Ш-К   (2002-10-25 13:50:00) [17]

jonik pegas ©

> Раз вы уже уволили инженера, теперь нанимайте системотехника
> который сделает вам буферную память+микроконтроллер, который
> снимет проблему Realtime. Иначе никак, если не хотите юзать
> цикл.

Проблема не Realtime. Есть и буферная память, и микроконтроллер. Просто логика оборудования такова, что оно может попасть в режим общения с очень мелкими пакетами (до 50 байт). И тогда получится, что скорость обмена падает и, как следствие, возникают искажения.

> Единственно предоставляемая ими функция-читать писать в порт

А зачем тогда их вообще создают? Пятивольтовые лампочки включать?


Ш-К   (2002-10-25 13:35:00) [18]

Digitman ©

PinACK - это Pin ACK. Штырёк (ножка порта), при изменении состояния которой с 0 на 1 вызывается прерывание. Которое поймать не могу. Вот приходится программно за ней следить.

> Где писал-то ? Про *.SYS ? Первый раз слышу от тебя в этой
> ветке, что драйвер таки есть в составе пакета. А это уже
> меняет дело.

Моя цитата: " TDLPortIO.dll работает под NT. Это не совсем драйвер. Это драйвер и библиотека длл,...". В смысле два разных файла. Не точно выразился, скз. А "TDLPortIO.dll" вообще название компонента.

Теперь понятно, почему не понятно.

Имеется два файла DLPORTIO.sys и DLPORTIO.dll.

DLPortIO.dll

This is the DriverLINX DLL which provides Port I/O in Win95/98, and an interface to the WinNT kernel mode driver in Windows NT.

DLPortIO.sys

This is the DriverLINX kernel mode driver which provides Port I/O in WinNT, and as such is only
required if you are running Windows NT.

[procedure] OpenDriver()

Opens the DriverLINX DLL. If running under Windows NT, it will start the kernel mode driver, and if the driver isn’t installed, it will attempt to install it into the system.

[procedure] CloseDriver()

Closes the DriverLINX DLL. If running under Windows NT, it will stop the kernel mode driver (if started in OpenDriver), and remove it if it was installed in OpenDriver.

Properties
[Byte] Port[Address] Read/Write
[Word] PortW[Address] Read/Write
[DWord] PortL[Address] Read/Write


Функции (6 штук) для этих свойств загружаются из DLPortIO.dll.

Вот из функциии DriverInstall:
...........
Сначала проверка на OpenService, а потом:

hService:=CreateService(
hSCMan,
"DLPortIO",
"DriverLINX Port I/O Driver",
SERVICE_START or SERVICE_STOP or DELETE or SERVICE_QUERY_STATUS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
PChar(DriverPath),
"SST miniport drivers",
nil, nil, nil, nil);


DriverPath - путь к DLPORTIO.sys.
...........

Весь остальной код компонента - обёртка загруженых 6-и функций из DLPortIO.dll.

Т.е., все манипуляции с портом, "для удобства юзера", спрятаны в DLPortIO.dll. Сорцов которой нет.


Digitman   (2002-10-25 13:09:00) [19]

LPT | Port Settings | Filter Resource Method | Use Any Interrupt Assigned to the Port :

Click to have the parallel port driver accept and use any interrupt signal assigned to it. This option disables the parallel port driver interrupt resource filtering. This option should be selected only if one of the following two cases applies: (1) The computer has broken hardware, BIOS, or legacy drivers that prevent the computer from working properly unless the parallel port has an interrupt resource, or (2) the user has installed a high speed parallel port device and driver that is known to be able to use an interruptAND the user does not have any legacy sound or network devices that require the interrupt to work properly.


Digitman   (2002-10-25 13:06:00) [20]

LPT | Port Settings | Filter Resource Method | Use Any Interrupt Assigned to the Port :

Click to have the parallel port driver accept and use any interrupt signal assigned to it. This option disables the parallel port driver interrupt resource filtering. This option should be selected only if one of the following two cases applies: (1) The computer has broken hardware, BIOS, or legacy drivers that prevent the computer from working properly unless the parallel port has an interrupt resource, or (2) the user has installed a high speed parallel port device and driver that is known to be able to use an interruptAND the user does not have any legacy sound or network devices that require the interrupt to work properly.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо