Необходимо организовать двуноправленный обмен данными между ПУ и программой через LPT. Если у кого есть нароботки или опыт и готовность поделиться !Заранее спасибо !
Здравствуйте Rechkin, Вы писали:
R>Необходимо организовать двуноправленный обмен данными между ПУ и программой через LPT. Если у кого есть нароботки или опыт и готовность поделиться !Заранее спасибо ! R>
Если ты хочешь это делать под DOS, то я тебе предложу целую толпу способов, а вот с виндой посложнее будет. Надо писать свой драйвер LPT порта — я пока в этой области начинающий. Простым API с LPT работать не знаю как, как открыть знаю, а вот как читать состояние принтера не знаю, подозреваю что простой записью можно выдать байт на шину данных. Если будут вопроссы связанные с железом тоже могу чего подсказать.
Здравствуйте Rechkin, Вы писали:
R>Необходимо организовать двуноправленный обмен данными между ПУ и программой через LPT. Если у кого есть нароботки или опыт и готовность поделиться !Заранее спасибо !
Я сейчас как раз этим занимаюсь. Для обеспечения доступа к контактам в ОС Windows и правда нужен драйвер. Так как я сейчас пишу тестовое приложение то пользуюсь DlPortIO.
Вот что создатели этого драйвера пишут:
TDLPortIO v1.2: DriverLINX Win95/98/NT Port IO driver wrapper.
TDLPortIO is (c) 1999 John Pappas (DiskDude).
DriverLINX is (c) 1996 Scientific Software Tools, Inc.
This package allows read/write of IO ports in Win95/98/NT.
Includes:
o C++ Builder 3/4 VCL component
o Delphi 3/4 VCL component
o ActiveX (OCX) control (for Visual BASIC)
o DLL version equivalent
o All source code
o Quick Windows NT System Admin driver installer
o Examples (project sources)
o Compatibility with the TVicPort shareware package
FreeWare!
Email: diskdude@poboxes.com
WWW: http://diskdude.cjb.net/
Если нужно, я тебе скину и драйвер и свой код, который к этому относится. В принципе, советую посетить их сайт, т.к. если ты пишешь комерческий продукт, то в качестве примера по написанию подобного драйвера DLPortIO подойдёт идеально.
Драйвер под Winды в данном случае необходим, только если есть потребность в обработке прерывания от ПУ. Если же такой необходимости нет, то общаться можно простыми чтением/записью в порт — также как и под дос. Это касается 95/98/МЕ: под NT — не знаю точно, там могут возникнуть проблемы с привилегиями.
Здравствуйте Adil, Вы писали:
A>Драйвер под Winды в данном случае необходим, только если есть потребность в обработке прерывания от ПУ. Если же такой необходимости нет, то общаться можно простыми чтением/записью в порт — также как и под дос. Это касается 95/98/МЕ: под NT — не знаю точно, там могут возникнуть проблемы с привилегиями.
Буду очень признателен, если Вы мне объясните, как написать следующую функцию OC WinNT, LPT порт:
void PortWriteUlong (ULONG Port, ULONG Value);
Пример использования:
PortWriteUlong (0x378, 1);
Лично я твёрдо убеждён, что без драйвера это невозможно, по крайней мере, в NT/2000/XP. Впрочем, буду рад если ошибаюсь.
В>>Лично я твёрдо убеждён, что без драйвера это невозможно, по крайней мере, в NT/2000/XP. Впрочем, буду рад если ошибаюсь.
Не, ты не ошибаешься. Но есть несколько драйверов для доступа к почти любым портам из юзермоды. Один вроде называется giveio.sys. В принципе, берешь почти любую программу мониторинга температуры процессора и с вероятностью 95% она использует один из таких уневерсальных драйверов. Вот только виндовый драйвер LPT-порта боюсь, придется снести или задизейблить.
A>Я же писал, что точно не знаю как под NT, но под Win9x/ME это точно работает: A>
A>void PortWriteUlong(unsigned short adr, unsigned long val)
A>{
A> asm{
A> mov eax, val
A> mov dx, adr
A> out dx, eax
A> }
A>}
A>
A>Пример использования:
A>
A>PortWriteUlong (0x378, 1l);
A>
Под 9x операционками это тоже работает не всегда — во-первых, не для всех портов, во вторых, возможность доступа к принтерному порту зависит достаточно неочевидным образом от настроек спулера. Список портов, к которым ОС пускает из юзермоды, меняется от версии к версии.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
S>Здравствуйте Adil, Вы писали: В>>>Лично я твёрдо убеждён, что без драйвера это невозможно, по крайней мере, в NT/2000/XP. Впрочем, буду рад если ошибаюсь.
Это не я писал!
S>Под 9x операционками это тоже работает не всегда — во-первых, не для всех портов, во вторых, возможность доступа к принтерному порту зависит достаточно неочевидным образом от настроек спулера. Список портов, к которым ОС пускает из юзермоды, меняется от версии к версии.
Хоть один недоступный порт к примеру?
Удачи.
Удачи.
Re[2]: Двуноправленный обмен данными
От:
Аноним
Дата:
08.06.02 06:54
Оценка:
Здравствуйте Adil, Вы писали:
A>Драйвер под Winды в данном случае необходим, только если есть потребность в обработке прерывания от ПУ. Если же такой необходимости нет, то общаться можно простыми чтением/записью в порт — также как и под дос. Это касается 95/98/МЕ: под NT — не знаю точно, там могут возникнуть проблемы с привилегиями.
A>Удачи.
Драйвер, драйвер — ачто это такое и счем это едят!
Какой принцип написания!
Здравствуйте Adil, Вы писали:
В>>>>Лично я твёрдо убеждён, что без драйвера это невозможно, по крайней мере, в NT/2000/XP. Впрочем, буду рад если ошибаюсь. A>Это не я писал!
S>>Под 9x операционками это тоже работает не всегда — во-первых, не для всех портов, во вторых, возможность доступа к принтерному порту зависит достаточно неочевидным образом от настроек спулера. Список портов, к которым ОС пускает из юзермоды, меняется от версии к версии. A>Хоть один недоступный порт к примеру?
Точно не помню, давно дело было. Нет у меня сейчас под рукой ни Win98, ни ME. Кроме того, это зависит еще и от набора драйверов, установленных в системе. Набери в SoftIce команду TSS, она тебе покажет список виртуализированных портов и адресов обработчиков доступа к ним для текущей задачи. Потом можешь начинать разбираться, какой обработчик просто игнорирует команду ввода или вывода, какой кидает при этом исключение, а какой — делает в ответ на попытку доступа что-то полезное, например, эмулирует устройство.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Аноним, Вы писали: А>Драйвер, драйвер — ачто это такое и счем это едят! А>Какой принцип написания!
А>Если у кого есть опыт поделитесь!
Беда в том, что рамок этого форума не хватит, что бы объяснить "принцип написания" драйверов.
Для начала я посоветовал бы просто поставить NuMega DriverStudio и покопаться в их хелпах и примерах (для начала VToolsD — vxd-драйвера). Можно еще почитать популярную литературу (в Сети ее навалом), чтобы получить общее представление. Я не скажу, что все это сложно, просто это несколько отличается от обычного программирования под Windows, но в принципе за пару недель можно разобраться.
На самом деле, ищи в области CreateFile("lpt1", ....); (см MSDN)
Возвращается хандл параллельного порта.
Тут возможны как синхронная работа, так и асинхронная.
Чтение и запись — ReadFile, WriteFile....
Все просто. На самом деле, тут уже обсуждались вопросы программирования последовательного ввода/вывода, с точки зрения программинга, работа с последовательным портом осуществляется аналогично. Использовать запись непосредственную в порт некорректно — порт может быть виртуальным, и поддержка VM (или PM) режимов для эмуляции дос программ (а именно это позволяет записать байт в порт напрямую) в драйвере может быть не реализована.
И более того, использовать IOport библиотеки для этих целей глупо. Зачем делать лишний раз то, что уже сделано майкрософтом?
Успехов.
AS>На самом деле, ищи в области CreateFile("lpt1", ....); (см MSDN) AS>Возвращается хандл параллельного порта. AS>Тут возможны как синхронная работа, так и асинхронная. AS>Чтение и запись — ReadFile, WriteFile.... AS>Все просто. На самом деле, тут уже обсуждались вопросы программирования последовательного ввода/вывода, с точки зрения программинга, работа с последовательным портом осуществляется аналогично. Использовать запись непосредственную в порт некорректно — порт может быть виртуальным, и поддержка VM (или PM) режимов для эмуляции дос программ (а именно это позволяет записать байт в порт напрямую) в драйвере может быть не реализована. AS>И более того, использовать IOport библиотеки для этих целей глупо. Зачем делать лишний раз то, что уже сделано майкрософтом? AS>Успехов.
Привет! Имею опыт работы с СОМ портом посредством жтих функций. Интересовался как ими же работать LPTшником но увы, MSDN про это молчит. Например как прочитать состояние принтера в режиме SPP (он самый простой). Так же читал где-то, что стандартный драйвер, через который все это проходит, заточен исключительно под принтер и ничего с него больше не вытянешь (может я ошибаюсь?). Еще встречал примерчик дающий корректный досту к любым портам I/O, даже под 2000, но прерывания естественно отсутствуют.
На самом деле, наверное, все почти так же. Можно попробовать так:
(наверное, т.к. сам я это не делал — незачем. Но по обрывкам воспоминаний + MSDN...В любом случае, попробовать много времени не займет, а это все же лучший вариант, нежели обращенение к io портам напрямую. По крайней мере, хандл успешно создается, а проверить, как туда пишется, проще на уровне аппаратного принтера (например, Epson LX100), куда можно просто символы выводить, у меня такого нет и не было)
Это для случая синхронного обмена.
Далее можно использовать ReadFile для чтения данных из порта, и WriteFile для записи туда. Режим обмена теоретически значения не имеет, все преобразования данных осуществляет win32.
Более удобен асинхронный режим работы, где можно использовать WaitForSingleObject в файловых операциях чтения и записи, хотя это ... хм.. на вкус программиста, можно и разные треды использовать. Вообще, в вин9х даже интерфейс LPT и COM не различается на уровне драйвера — используется все тот же VCOMM.
Вот выдержка из MSDN по этому поводу
A process uses the CreateFile function to open a handle to a communications resource. For example, specifying COM1 opens a handle to a serial port, and LPT1 opens a handle to a parallel port. If the specified resource is currently being used by another process, CreateFile fails. Any thread of the process can use the handle returned by CreateFile to identify the resource in any of the functions that access the resource.
...
When the process calls CreateFile to open a communications resource, it specifies the following attributes:
What type of read/write access exists for the specified resource.
Whether the handle can be inherited by child processes.
Whether the handle can be used in overlapped (asynchronous) I/O operations. (For a description of overlapped operations, see Synchronization.)
When the process uses CreateFile to open a communications resource, it must specify certain values for the following parameters:
The fdwShareMode parameter must be zero, opening the resource for exclusive access.
The fdwCreate parameter must specify the OPEN_EXISTING flag.
The hTemplateFile parameter must be NULL.
GDV>Привет! Имею опыт работы с СОМ портом посредством жтих функций. Интересовался как ими же работать LPTшником но увы, MSDN про это молчит. Например как прочитать состояние принтера в режиме SPP (он самый простой). Так же читал где-то, что стандартный драйвер, через который все это проходит, заточен исключительно под принтер и ничего с него больше не вытянешь (может я ошибаюсь?). Еще встречал примерчик дающий корректный досту к любым портам I/O, даже под 2000, но прерывания естественно отсутствуют.