Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
#1

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

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

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

Чтение из COM-порта - C++
Здравствуйте! Никак не могу правильно прочитать данные из COM-порта. Мой процессор отправляет в компорт в бесконечном цикле (каждые...

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

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

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

Тестирование LPT порта - C++
Здравствуйте. нашел в интернете код программы который может включить светодиод и отключить его. вот код #include "stdafx.h" ...

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

18
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
01.01.2015, 23:23  [ТС] #2
актуально
0
nmcf
5545 / 4855 / 1647
Регистрация: 14.04.2014
Сообщений: 19,716
02.01.2015, 06:41 #3
Читать надо однозначно через WinAPI.
0
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
03.01.2015, 02:10  [ТС] #4
дело в том, что по умолчанию винда расценивает LPT как порт принтера. стандартный драйвер винды заточен под то, что к LPT подключено устройство "а-ля принтер", которое поддерживает соответствующий аппаратный протокол обмена (железка должна в состоянии обработать управляющие сигналы strobe/ack,и проинформировать об этом хост). для моего внешнего устройства это не реально - оно не принтер, не сканер и даже не программируемо. соответственно и работать с ним через стандартные средства WinAPI в полной мере невозможно. открыть порт (CreateFile), отправить в него что-то (WriteFile) - можно. а вот прочитать (ReadFile), да еще по прерыванию не получится.
по крайней мере у меня не выходит. да и в интернетах пишут тоже самое
0
MickeyBlueEyes
Студент
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
03.01.2015, 11:59 #5
В boost::asio есть фича, но там вроде только для последовательного порта, почитайте об этом, может ошибаюсь.
0
raxp
10166 / 6552 / 477
Регистрация: 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 / 38
Регистрация: 25.12.2012
Сообщений: 616
03.01.2015, 18:08 #7
Чтобы не читать в бесконечном цикле, нужно найти какую то dll или sys который отлавливает прерывания порта, и может их передать в заранее установленный обработчик. Ну или установить свой обработчик на прерывания порта, правда для этого нужно писать свой драйвер.
0
raxp
10166 / 6552 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
03.01.2015, 19:18 #8
inpout (winlpt, giveio, io и прочие сиси) и есть драйвер обхода системы в третье кольцо и прямого доступа к LPT-порту, другого способа нет.
0
nmcf
5545 / 4855 / 1647
Регистрация: 14.04.2014
Сообщений: 19,716
03.01.2015, 19:40 #9
Нельзя серьёзный проект строить на штуках, типа, inpout, неизвестно как они себя поведут при длительном использовании. Там же общий контроллер для LPT, COM, Floppy и т. д. Конфликты могут быть.
0
raxp
10166 / 6552 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
03.01.2015, 19:51 #10
1- перечитайте мой посткриптум выше в посте #6. Нельзя вообще использовать бытовой ПК, тем паче с виндами на борту для промышленных целей. Должен быть внешний железный контроллер для реалтайм и автономности и не самопальщина. Или промПК с QNX-ом или WinCE аля RTX, как вариант.
2- конфликты с чем это там они могут быть? Область памяти известна, никто никуда не лезет куда не надо.
0
nmcf
5545 / 4855 / 1647
Регистрация: 14.04.2014
Сообщений: 19,716
03.01.2015, 19:57 #11
Если я правильно понял документацию, для программирования контроллера I/O используется один и тот же набор портов, поэтому драйверы должны как-то по очереди это делать. Inpout это обеспечивает?
0
raxp
10166 / 6552 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
03.01.2015, 20:01 #12
Это вы можете узнать у разработчика http://www.logix4u.net/inpout32.htm
0
nmcf
5545 / 4855 / 1647
Регистрация: 14.04.2014
Сообщений: 19,716
03.01.2015, 20:07 #13
Вопрос больше риторический. Драйвер просто читает/записывает порты и всё.
0
fit
14 / 14 / 0
Регистрация: 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 / 38
Регистрация: 25.12.2012
Сообщений: 616
04.01.2015, 04:21 #15
fit, Программирование драйверов Windows, Солдатов В.П., 2004 вроде не плохая книжка, хотя сам толком не читал. Для создания драйвера воспользуйтесь DDK. А в обще драйвер имеет схожую с exe структуру, и его можно построить в Visual Studio.
0
04.01.2015, 04:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2015, 04:21
Привет! Вот еще темы с ответами:

Работа с LPT - C++
Всем привет !! У меня такая проблимка мне надо написать программу которая будет выщитывать двоичный код затем обращаться к лпт порту и ...

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

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

Управление LPT портом под FreeBSD - C++
Здравствуйте! Пытаюсь откомпилировать следующий код под FreeBSD: #include <stdio.h> #include <fcntl.h> #include <sys/ioctl.h> ...


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

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

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