Работа с LPT под XP

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
ksu2ksu
Сообщения: 2
Зарегистрирован: 29 июн 2009, 11:27

Управление лабораторным анализатором поизводится c LPT1 по специальному кабелю со своими тригерами и регистрами программой на паскале с ассемблерными вставками. Под XP программа не видит изменения портов и висит в ожидании. Что можно сделать чтоб XP полностью освободил LPT1, т.к. он нужен только для работы с анализатором.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Начиная с Windows NT/2000 работать с LPT портом напрямую нельзя, порт берёт под свой контроль операционная система, защищая его и позволяя обращаться к нему через свои API. Для того, чтобы твоя порграмма заработала под Windows, тебе нужно переписать её на Win32 API. Плясать нужно от функции CreateFile, которой в качестве первого параметра передаётся строка "LTP1", далее читать MSDN.

Как вариант, можно почитать вот эту статейку:
http://junglewin.narod.ru/lpt.html
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
demon416
Сообщения: 178
Зарегистрирован: 30 янв 2006, 14:03
Откуда: kirovskoe

Или просто вынести код работы с портом в dll :)
ака хинт: коментируйте код, самим же легче будет разобраться ;)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Как это поможет?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
demon416
Сообщения: 178
Зарегистрирован: 30 янв 2006, 14:03
Откуда: kirovskoe

Это одна из особенностей системы защиты windows
ассемблерный код работы с портами нельзя использовать в приложении, но можно использовать в dll. Два года назад, когда я разбирался с этой темой, в интернете было много информации, сейчас, почемуто, гуглиться только одна расклонированная статья в которой все описание ограничено "Если вы все-таки решили писать низкоуровневое чтение то эти процедуры нужно выносить в отдельную DLL или VXD", на этом принципе работает общеизвестная giveio32.dll.
ака хинт: коментируйте код, самим же легче будет разобраться ;)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

С ума сойти, первый раз об этом слышу. Век живи, чек учись :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Я правда работал с COM-портами, а не с LPT, путем чтения/записи напрямую используя ассемблер. Код в DLL не выносил, все прекрасно работало и в 3-ем кольце защиты. Странно почему же с LPT все по другому, может просто у автора статьи этот порт был занят принтером, и сам драйвер принтера защитил и вывел это адресное пространство из 3-го во 2-ое, к примеру, кольцо? Мне напоминает работу с хуками - но там все понятно, приложение завершается, освобождает память - но хук должен работать. А здесь что за ограничения такие....
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Вот вроде бы неплохая подборка статей по этой теме...

http://www.pcports.ru/Articles.php
retaig
Сообщения: 7
Зарегистрирован: 08 сен 2009, 21:53

Возможно кто-то сталкивался с такой задачей...
Есть желание использовать LPT порт в качестве генератора имрульсов для управления шаговым двигателем.
Есть ли необходимость в перекомпилировании ядра Linux и написпнии софта используя RealTime функции или все можно сделать как-нибудь проще?

P.S. У меня есть пара вопросов уровня курсовика по ТУ по шаговым двигателям если кто может проконсультировать напишите в ЛС, а то на форуме нет подходящего раздела чтобы туда запостить.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Честно говоря, плохая идея, чтобы компьютер сам генерировал последовательность управляющих импульсов для шагового электродвигателя. Для этого лучше собрать отдельный генератор импульсов, а с помощью компьютера управлять этим генератором. Тогда ты вообще не будешь зависеть от операционной системы компьютера.
К примеру для сборки генератора управляющих импульсов тебе потребуется задающий генератор тактовой частоты, логический делитель частоты, счётчик импульсов и дешифратор, с выходов которого и будут поступать импульсы на управление шаговым двигателем. А компьютер через LPT-порт будет тебе передавать на логический делитель число, соответствующее коэффициенту деления тактовой частоты задающего генератора. Предположим, что тактовая частота у генератора импульсов равна 1000 Гц, а компьютер передаёт через LPT-порт число 100. В итоге шаговый двигатель будет выполнять 10 шагов в секунду. Можно так же предусмотреть вариант полной остановки двигателя, например: подать с компьютера значение 0.
Ответить