Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
fit
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
#1

Чтение из LPT порта - C++

29.12.2014, 01:25. Просмотров 1737. Ответов 18
Метки нет (Все метки)

LPT порт в режиме EPP. С некоторой частотой на него приходит последовательность импульсов, которые надо прочитать. Читать в бесконечном цикле (даже с задержкой) не безопасно (что-то пропускает, что-то читает 2 и более раз). Как организовать процесс, чтобы читать порт только тогда, когда на него пришли данные?
http://www.cyberforum.ru/cpp-beginners/thread246105.html
Гугл советует под линуксом юзать для этой цели select, но в винде это не работает. Больше ничего толкового пока не нашел.
Для доступа к порту использую готовый драйвер inpout32.dll, но при необходимости и через WinApi можно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2014, 01:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чтение из LPT порта (C++):

Побайтовое чтение COM порта
Доброго времени суток. Обычно из COM порта читают передавая в функцию чтения...

Определение паузы при чтение с COM порта
Пишу под OS Windows 7 visual studio c использованием MFC. Нужно добиться...

Непрерывное чтение и обработка с com порта (последовательный порт) в Visual C++
Здравствуйте, я задумал одну идею с GPS приемником, но для того чтобы...

Тестирование LPT порта
Здравствуйте. нашел в интернете код программы который может включить светодиод...

Программирование LPT
Всем привет. Только недавно начал заниматься программированием на С++, и...

18
fit
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
01.01.2015, 23:23  [ТС] #2
актуально
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
02.01.2015, 06:41 #3
Читать надо однозначно через WinAPI.
0
fit
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
03.01.2015, 02:10  [ТС] #4
дело в том, что по умолчанию винда расценивает LPT как порт принтера. стандартный драйвер винды заточен под то, что к LPT подключено устройство "а-ля принтер", которое поддерживает соответствующий аппаратный протокол обмена (железка должна в состоянии обработать управляющие сигналы strobe/ack,и проинформировать об этом хост). для моего внешнего устройства это не реально - оно не принтер, не сканер и даже не программируемо. соответственно и работать с ним через стандартные средства WinAPI в полной мере невозможно. открыть порт (CreateFile), отправить в него что-то (WriteFile) - можно. а вот прочитать (ReadFile), да еще по прерыванию не получится.
по крайней мере у меня не выходит. да и в интернетах пишут тоже самое
0
MickeyBlueEyes
Студент
120 / 131 / 39
Регистрация: 07.04.2011
Сообщений: 503
03.01.2015, 11:59 #5
В boost::asio есть фича, но там вроде только для последовательного порта, почитайте об этом, может ошибаюсь.
0
raxp
10180 / 6563 / 491
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
03.01.2015, 14:48 #6
С некоторой частотой на него приходит последовательность импульсов
и с какой же частотой? Винда не реалтайм ОС. Сам LPT тоже имеет ограничение по скорости, тем паче, если не выпаяны емкости на DATA пинах на материнке, сглаживающие фронты.

Читать в бесконечном цикле (даже с задержкой) не безопасно (что-то пропускает, что-то читает 2 и более раз)
это зависит от того как вы читаете и что собой представляет последовательность импульсов, сферическая между прочим. Ни указания длительности одиночного импульса, ни частоты следования.

Читать надо в потоке, а отслеживать длительность можно микросекундным таймером http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx, предварительно калибруя в зависимости от процессора.

P.S.: и вообще, имхо, рулить из LPT (движком, ЧПУ и прочими) некошерно на сегодняшний момент, даже если и аппелировать к старому ПК. Должен быть внешний контроллер, который всем занимается и принимает лишь управляющие общие команды, отсылая диагностическую информацию на верхний уровень.
0
maxillion
273 / 183 / 52
Регистрация: 25.12.2012
Сообщений: 616
03.01.2015, 18:08 #7
Чтобы не читать в бесконечном цикле, нужно найти какую то dll или sys который отлавливает прерывания порта, и может их передать в заранее установленный обработчик. Ну или установить свой обработчик на прерывания порта, правда для этого нужно писать свой драйвер.
0
raxp
10180 / 6563 / 491
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
03.01.2015, 19:18 #8
inpout (winlpt, giveio, io и прочие сиси) и есть драйвер обхода системы в третье кольцо и прямого доступа к LPT-порту, другого способа нет.
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
03.01.2015, 19:40 #9
Нельзя серьёзный проект строить на штуках, типа, inpout, неизвестно как они себя поведут при длительном использовании. Там же общий контроллер для LPT, COM, Floppy и т. д. Конфликты могут быть.
0
raxp
10180 / 6563 / 491
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
03.01.2015, 19:51 #10
1- перечитайте мой посткриптум выше в посте #6. Нельзя вообще использовать бытовой ПК, тем паче с виндами на борту для промышленных целей. Должен быть внешний железный контроллер для реалтайм и автономности и не самопальщина. Или промПК с QNX-ом или WinCE аля RTX, как вариант.
2- конфликты с чем это там они могут быть? Область памяти известна, никто никуда не лезет куда не надо.
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
03.01.2015, 19:57 #11
Если я правильно понял документацию, для программирования контроллера I/O используется один и тот же набор портов, поэтому драйверы должны как-то по очереди это делать. Inpout это обеспечивает?
0
raxp
10180 / 6563 / 491
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
03.01.2015, 20:01 #12
Это вы можете узнать у разработчика http://www.logix4u.net/inpout32.htm
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
03.01.2015, 20:07 #13
Вопрос больше риторический. Драйвер просто читает/записывает порты и всё.
0
fit
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
04.01.2015, 04:07  [ТС] #14
Цитата Сообщение от raxp
это зависит от того как вы читаете и что собой представляет последовательность импульсов, сферическая между прочим. Ни указания длительности одиночного импульса, ни частоты следования.

Читать надо в потоке, а отслеживать длительность можно микросекундным таймером http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx, предварительно калибруя в зависимости от процессора.
частота небольшая, далеко не реалтайм. чтение в отдельном потоке реализовано)
просто хотелось бы сделать по-нормальному: пришли новые данные - прочитали порт и никаких опасений, что какие-то импульсы не прочитает/прочитает несколько раз. заодно по возникновению прерывания можно было бы и время прихода нового импульса отследить.
в линуксе вот есть хотя бы select, которому можно скормить дескриптор порта. а в винде, похоже, надо писать свой драйвер с обработчиком прерываний

Цитата Сообщение от nmcf
Нельзя серьёзный проект строить на штуках, типа, inpout, неизвестно как они себя поведут при длительном использовании. Там же общий контроллер для LPT, COM, Floppy и т. д. Конфликты могут быть.
бесполезность и глупость этой затеи, стала понятна как только я этот inpout заюзал. как выяснилось он даже не предоставляет нужной функциональности. полезно было бы, разве что, посмотреть его код))
но стандартный виндовый драйвер для LPT в плане применимости в рамках моей задачи так же огорчает

Добавлено через 5 минут
Цитата Сообщение от maxillion Посмотреть сообщение
Чтобы не читать в бесконечном цикле, нужно найти какую то dll или sys который отлавливает прерывания порта, и может их передать в заранее установленный обработчик. Ну или установить свой обработчик на прерывания порта, правда для этого нужно писать свой драйвер.
пока такой библиотеки не нашел. а что толкового можно почитать про написание драйверов под винду?
0
maxillion
273 / 183 / 52
Регистрация: 25.12.2012
Сообщений: 616
04.01.2015, 04:21 #15
fit, Программирование драйверов Windows, Солдатов В.П., 2004 вроде не плохая книжка, хотя сам толком не читал. Для создания драйвера воспользуйтесь DDK. А в обще драйвер имеет схожую с exe структуру, и его можно построить в Visual Studio.
0
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,201
04.01.2015, 04:33 #16
Цитата Сообщение от fit Посмотреть сообщение
частота небольшая, далеко не реалтайм.
реалтайм это не обязательно быстро
Это обязательно конкретное время, хоть час, но всегда час, ни больше не меньше, т.е сигнал пришел и ровно через час получили ответ системы, ни винда ни дос ни линукс такого гарантировать не могут,
они могут отработать и 55 минут и 65, примерно час
Цитата Сообщение от fit Посмотреть сообщение
а что толкового можно почитать про написание драйверов под винду?
поиши здесь на форуме Убежденный, он пишет драйвера и может конкретно что то посоветовать
А пока с такой постановкой задачи
Цитата Сообщение от fit Посмотреть сообщение
LPT порт в режиме EPP. С некоторой частотой на него приходит последовательность импульсов, которые надо прочитать. Читать в бесконечном цикле (даже с задержкой) не безопасно
Могу предложить отдельный поток, и в нем DeviceIoControl
http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx
http://www.firststeps.ru/mfc/winapi/r.php?166
пускай считывает данные допустим каждую секунду, или десять раз в секунду, и складывает в буфер
а основная программа будет анализировать
насколько помню даже во времена ДОС параллельный порт не генерил прерывания по шине данных, также приходилось опрашивать, хотя столько лет прошло могу и ошибатся

Добавлено через 3 минуты
Цитата Сообщение от maxillion Посмотреть сообщение
А в обще драйвер имеет схожую с exe структуру, и его можно построить в Visual Studio.
особенно если учесть что он работает в 0 кольце, и с памятью там ой как нужно быть осторожным, а равно и с другими ресурсами
кстати функции для работы с памятью там совершенно другие
0
maxillion
273 / 183 / 52
Регистрация: 25.12.2012
Сообщений: 616
04.01.2015, 05:04 #17
Цитата Сообщение от ValeryS Посмотреть сообщение
и с памятью там ой как нужно быть осторожным
Если драйвер работает на уровне PASSIVE_LEVEL то допускается исключения ACCESS_VIOLATION и их перехват, как в обычной программе.
Цитата Сообщение от ValeryS Посмотреть сообщение
кстати функции для работы с памятью там совершенно другие
Мне удалось прикрутить программу на С++ с STL map к драйверу путём подмены значений всего двух WinApi.
0
maxillion
273 / 183 / 52
Регистрация: 25.12.2012
Сообщений: 616
04.01.2015, 05:04 #18
Удалите дубликат , толи инет заглючил толи браузер.
0
raxp
10180 / 6563 / 491
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
04.01.2015, 12:44 #19
частота небольшая, далеко не реалтайм
ни о чем.
0
04.01.2015, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2015, 12:44
Привет! Вот еще темы с решениями:

Работа с LPT
Всем привет !! У меня такая проблимка мне надо написать программу которая...

Управление LPT портом
Нужно управлять LPT портом в BORLAND C++ 3.1 Подскажите каким образом...

И снова LPT порт и все вытекающие
Собственно, проблема: на компе нужно заюзать LPT-порт в качестве банального IO....

LPT порт, Ubuntu, code::blocks
Итак, название темы говорит само за себя. Нужно в консольном приложении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru