Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102

Чтение из LPT порта

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

Студворк — интернет-сервис помощи студентам
LPT порт в режиме EPP. С некоторой частотой на него приходит последовательность импульсов, которые надо прочитать. Читать в бесконечном цикле (даже с задержкой) не безопасно (что-то пропускает, что-то читает 2 и более раз). Как организовать процесс, чтобы читать порт только тогда, когда на него пришли данные?
Гугл советует под линуксом юзать для этой цели select, но в винде это не работает. Больше ничего толкового пока не нашел.
Для доступа к порту использую готовый драйвер inpout32.dll, но при необходимости и через WinApi можно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2014, 01:25
Ответы с готовыми решениями:

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

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

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

18
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
01.01.2015, 23:23  [ТС]
актуально
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.01.2015, 06:41
Читать надо однозначно через WinAPI.
0
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
03.01.2015, 02:10  [ТС]
дело в том, что по умолчанию винда расценивает LPT как порт принтера. стандартный драйвер винды заточен под то, что к LPT подключено устройство "а-ля принтер", которое поддерживает соответствующий аппаратный протокол обмена (железка должна в состоянии обработать управляющие сигналы strobe/ack,и проинформировать об этом хост). для моего внешнего устройства это не реально - оно не принтер, не сканер и даже не программируемо. соответственно и работать с ним через стандартные средства WinAPI в полной мере невозможно. открыть порт (CreateFile), отправить в него что-то (WriteFile) - можно. а вот прочитать (ReadFile), да еще по прерыванию не получится.
по крайней мере у меня не выходит. да и в интернетах пишут тоже самое
0
Студент
 Аватар для MickeyBlueEyes
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
03.01.2015, 11:59
В boost::asio есть фича, но там вроде только для последовательного порта, почитайте об этом, может ошибаюсь.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.01.2015, 14:48
С некоторой частотой на него приходит последовательность импульсов
и с какой же частотой? Винда не реалтайм ОС. Сам LPT тоже имеет ограничение по скорости, тем паче, если не выпаяны емкости на DATA пинах на материнке, сглаживающие фронты.

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

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

P.S.: и вообще, имхо, рулить из LPT (движком, ЧПУ и прочими) некошерно на сегодняшний момент, даже если и аппелировать к старому ПК. Должен быть внешний контроллер, который всем занимается и принимает лишь управляющие общие команды, отсылая диагностическую информацию на верхний уровень.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
03.01.2015, 18:08
Чтобы не читать в бесконечном цикле, нужно найти какую то dll или sys который отлавливает прерывания порта, и может их передать в заранее установленный обработчик. Ну или установить свой обработчик на прерывания порта, правда для этого нужно писать свой драйвер.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.01.2015, 19:18
inpout (winlpt, giveio, io и прочие сиси) и есть драйвер обхода системы в третье кольцо и прямого доступа к LPT-порту, другого способа нет.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.01.2015, 19:40
Нельзя серьёзный проект строить на штуках, типа, inpout, неизвестно как они себя поведут при длительном использовании. Там же общий контроллер для LPT, COM, Floppy и т. д. Конфликты могут быть.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.01.2015, 19:51
1- перечитайте мой посткриптум выше в посте #6. Нельзя вообще использовать бытовой ПК, тем паче с виндами на борту для промышленных целей. Должен быть внешний железный контроллер для реалтайм и автономности и не самопальщина. Или промПК с QNX-ом или WinCE аля RTX, как вариант.
2- конфликты с чем это там они могут быть? Область памяти известна, никто никуда не лезет куда не надо.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.01.2015, 19:57
Если я правильно понял документацию, для программирования контроллера I/O используется один и тот же набор портов, поэтому драйверы должны как-то по очереди это делать. Inpout это обеспечивает?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.01.2015, 20:01
Это вы можете узнать у разработчика http://www.logix4u.net/inpout32.htm
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.01.2015, 20:07
Вопрос больше риторический. Драйвер просто читает/записывает порты и всё.
0
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
04.01.2015, 04:07  [ТС]
Цитата Сообщение от raxp
это зависит от того как вы читаете и что собой представляет последовательность импульсов, сферическая между прочим. Ни указания длительности одиночного импульса, ни частоты следования.

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

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

Добавлено через 5 минут
Цитата Сообщение от maxillion Посмотреть сообщение
Чтобы не читать в бесконечном цикле, нужно найти какую то dll или sys который отлавливает прерывания порта, и может их передать в заранее установленный обработчик. Ну или установить свой обработчик на прерывания порта, правда для этого нужно писать свой драйвер.
пока такой библиотеки не нашел. а что толкового можно почитать про написание драйверов под винду?
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
04.01.2015, 04:21
fit, Программирование драйверов Windows, Солдатов В.П., 2004 вроде не плохая книжка, хотя сам толком не читал. Для создания драйвера воспользуйтесь DDK. А в обще драйвер имеет схожую с exe структуру, и его можно построить в Visual Studio.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
04.01.2015, 04:33
Цитата Сообщение от fit Посмотреть сообщение
частота небольшая, далеко не реалтайм.
реалтайм это не обязательно быстро
Это обязательно конкретное время, хоть час, но всегда час, ни больше не меньше, т.е сигнал пришел и ровно через час получили ответ системы, ни винда ни дос ни линукс такого гарантировать не могут,
они могут отработать и 55 минут и 65, примерно час
Цитата Сообщение от fit Посмотреть сообщение
а что толкового можно почитать про написание драйверов под винду?
поиши здесь на форуме Убежденный, он пишет драйвера и может конкретно что то посоветовать
А пока с такой постановкой задачи
Цитата Сообщение от fit Посмотреть сообщение
LPT порт в режиме EPP. С некоторой частотой на него приходит последовательность импульсов, которые надо прочитать. Читать в бесконечном цикле (даже с задержкой) не безопасно
Могу предложить отдельный поток, и в нем DeviceIoControl
http://msdn.microsoft.com/ru-r... s.85).aspx
http://www.firststeps.ru/mfc/winapi/r.php?166
пускай считывает данные допустим каждую секунду, или десять раз в секунду, и складывает в буфер
а основная программа будет анализировать
насколько помню даже во времена ДОС параллельный порт не генерил прерывания по шине данных, также приходилось опрашивать, хотя столько лет прошло могу и ошибатся

Добавлено через 3 минуты
Цитата Сообщение от maxillion Посмотреть сообщение
А в обще драйвер имеет схожую с exe структуру, и его можно построить в Visual Studio.
особенно если учесть что он работает в 0 кольце, и с памятью там ой как нужно быть осторожным, а равно и с другими ресурсами
кстати функции для работы с памятью там совершенно другие
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
04.01.2015, 05:04
Цитата Сообщение от ValeryS Посмотреть сообщение
и с памятью там ой как нужно быть осторожным
Если драйвер работает на уровне PASSIVE_LEVEL то допускается исключения ACCESS_VIOLATION и их перехват, как в обычной программе.
Цитата Сообщение от ValeryS Посмотреть сообщение
кстати функции для работы с памятью там совершенно другие
Мне удалось прикрутить программу на С++ с STL map к драйверу путём подмены значений всего двух WinApi.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
04.01.2015, 05:04
Удалите дубликат , толи инет заглючил толи браузер.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.01.2015, 12:44
частота небольшая, далеко не реалтайм
ни о чем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2015, 12:44
Помогаю со студенческими работами здесь

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

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

Обработка LPT порта
Вечер добрый! Если кто работал с LPT в Builder, подскажите. Как связаться с ним, обрабатывать и отправлять сигналы?

Программирования LPT-порта
Помогите пожалуйста! Программирования Lpt-порта, надо Builder, если есть на других средах, то тоже подойдет, только мне надо вся информация...

Программирование LPT порта
Мне нужно сделать недольшое устройство для компьютера, которое подключено к почту принтера. Как управлять этим портом? Я знаю, что там есть...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru