| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > И снова LPT |
| Автор: AndAnd 28.9.2006, 20:24 | ||
Здравствуйте, участники форума! Знаю, что данная тема поднималась не раз, проглядел поиск, но подходящей информации не нашел или не смог ее правильно применить. В общем я хотел бы подавать импульсы с определенным периодом на осциллограф (на нем должны быть четкие ступеньки видны), так вот вопрос как в C++ (DOS) или Builder или Delphi сделать правильное обращение к порту и подавать значения на него. Видел много сорсов, но в них используется какой-то драйвер,кода которого нигде нет, через который на LPT подаются эти значения и вообще инициализируется порт. Может кто может объяснить как, что и зачем должно идти при работе с портом. Есть простенькая программа из книги, но она не пашет,т.е. никаких импульсов не выдает (программы, которые через драйвер проверял, все работает). Вот собственно код:
Спасибо. Очень хотел бы услышать ваше мнение на данный вопрос. |
| Автор: cppforever 28.9.2006, 21:25 |
| Уточни, пожалуйста, какую ОС используешь. Дело в том, что Win NT, 2000, XP не разрешает работать напрямую (с помощью функций outp() и inp()) с портами, как это раньше делалось в DOS. В Win 98/95 пример должен работать. Причем не стоит забывать, что у LPT порта есть три регистра (Data, Status, Control). Мне когда надо было общаться с модулем АЦП через LPT я использовал библиотеку WinIO которая позволяет обходить защиту ОС и обращаться к порту напрямую... |
| Автор: AndAnd 29.9.2006, 05:54 | ||||
Использую WinXP. На других не проверял. Но мне бы желательно именно на последних версиях ОС. А что там за защита в NT и как ее обойти своими средствами (не используя драйвера скаченые с инета), можешь дать иформацию, хоть какую-нибудь, или примерчик.
У меня используется один из регистров (с 2 по 9) и земля, т.е. два контакта мы подсоединяем к прибору. |
| Автор: AndAnd 29.9.2006, 21:40 | ||
Будут ли подваться импуьсы на lpt, если зациклить этот кусок кода (теоретически)? Может есть еще какие-нибудь способы? |
| Автор: cppforever 1.10.2006, 12:01 |
| Мне тоже не нравился тогда вариант с использованием дополнительных библиотек и драйверов. Пытался разобраться как писать/читать из порта с помощью CreateFile(), WriteFile(), ReadFile() - не получилось. Пришлось использовать первый подход. Причем я перепробовал несколько библиотек и выбрал WinIO т.к. она оказалась самой быстрой. Так что если у тебя получится применить второй подход буду признателен если расскажешь КАК ;) |
| Автор: GremlinProg 1.10.2006, 16:23 |
| ЛПТ - не самый лучший вариант по определению, этот интерфейс не может быть реализован асинхронно, как альтернатива - КОМ. С комом и апешек поболее и работать приятно. Но если все же вам хочется позаморачиваться с роритетным лпт, то вот ссылочка на очень понятно расписанный ресурс "Работа с параллельным портом в Windows NT": http://junglewin.narod.ru/lpt.html ключевой момент в лпт - получение и установка состояния порта(чтение/запись), которое, как вы уже поняли, нужно включать и выключать перед записью. Для этого автор использует иоктл-коды из ддк и DeviceIoControl. Если вы все же полезете в эти дебри, то самым ленивым может понадобиться ntddpar.h для Parclass.sys, пишите, поищу. |
| Автор: MoZy 5.10.2006, 18:26 | ||
| Проблема вся в том, что если без левых драйверов хочется обойтись, то нужно ваш "принтер" переключить в обычное состояние. а именно спаять контакты земли (18-25) с 11 и 12 (busy и paperend), тем самым переведя в состояние log0 или по-просту false. а теперь все будет работать
вот тут http://www.radioland.net.ua/sxema-maincat-7.html http://LPT-PORT.NAROD.RU |