Найти - Пользователи
Полная версия: COM-порт. Совместное использование двумя программами
Начало » Python для экспертов » COM-порт. Совместное использование двумя программами
1
Rosa
У меня на одном COM-порту подключено два типа оборудование. Один тип опрашивается Программой №1 раз в час (настроен crontab), второй - должен опрашиваться постоянно (в цикле в Программе №2). Подскажите, пожалуйста, как распределить использование COM-порта между этими программами? Предполагаю, что надо использовать механизм блокировки ресурса, но из-за небольшого опыта программирования не знаю как это сделать.
PEHDOM
Ну такие задачи возникают регурярно, и рецепт давно известен. Под венду есть специальный драйвер, который занимает порт и создает несколько виртуальных с которыми уже и работают приложения.В линуксе тоже есть программы реализующие подобное например http://www.ant.uni-bremen.de/whomes/rinas/nullmodem/ .
Также в лине обычно из коробки есть утилита socat. Она вроде как умеет создавать псевдотерминал (PTY) в режиме мастер\слейви что по идее должно позволять двум приложениям работать с одним портом через PTY. Хотя это только в теории, на практике я это не использовал так что гугли “socat waitslave” http://www.dest-unreach.org/socat/doc/socat.html

Учитывая что у вас фигурирует crontab вангую что вам нужно под линуксом.
В лине последовательные порты доступны через файлы устройств в каталоге /dev. Вообще линукс, позволяет открыть устройство или любой файл более, чем одному процессу одновременно. К сожалению, это редко работает хорошо с tty-устройствами. Поэтому разработчики договорились о Lock файлах. Грубо говоря когда приложение хочет чтото с портом делать, оно проверяет наличие лок-файла, если его нет, то можно читать-писать в порт(файл), иначе жди пока освободиться\выводи еррор.
Но это все лирика, наверняка раз вы задаете вопрос на форуме пайтона то и используете пайтон и не читаете напрямую из/в файл, а используете модуль serial. Но опять же это не точно, а всего лишь мое предположение.
Поэтому ваш топик ставит больше вопросов чем дает ответов:
Какая ОС используется?
Программа1 и програма2 это ваши программы алгоритм которых вы можете поменять или сторонние?
Насколько часто программа1 опрашивает порт?
Программа1 держит порт постоянно или между опросами отпускает?
Программа1 и программа2 должны постоянно работать с одним и тем же портом или это единичный частный случай, конкретно в вашей ситуации?
Знают ли программы о существовании друг друга?
Если программы на пайтоне, то как они работают с портом?
В зависимости от этого и нужно принимать решение:
Или писать\искать демон который будет держать порт, и отдавать данные приложениям через pty.
Или придумать способ коммуникации между программами, чтобы программа 1 отдавала на время порт программе2 по требованию последней.
Rosa
1.Использую Linux.
2.Программы мои, могу изменять как хочу.
3. Программа №1 - раз в час (в crontab установлено на 00 минут каждого часа). Ее опрос длится максимум 2-3 минуты, а потом программа завершается.
4. Оборудование устанавливается на жилой дом, и чтобы не тянуть лишних проводов всё оборудование вешается на одну шину RS-485. На плате компьютера есть переходник из RS-485 на USB. Соответственно в обоих программах используется порт /dev/ttyUSB0.
5. На данный момент программы ничего друг о друге не знают.
6. Да, программы на пайтон, работают через модуль serial

Rosa
Сейчас пытаюсь реализовать вариант с lock файлом. Но попытаюсь и с демоном разобраться.
PEHDOM
Rosa
3. Программа №1 - раз в час (в crontab установлено на 00 минут каждого часа). Ее опрос длится максимум 2-3 минуты, а потом программа завершается.
а программа 2?
Rosa
программа 2 должна опрашивать чем чаще, тем лучше. например. раз в минуту. Сам опрос идет секунд 20-30
PEHDOM
Rosa
программа 2 должна опрашивать чем чаще, тем лучше. например. раз в минуту. Сам опрос идет секунд 20-30
Rosa
3. Программа №1 - раз в час (в crontab установлено на 00 минут каждого часа). Ее опрос длится максимум 2-3 минуты, а потом программа завершается.
как идет опрос? программа отправляет запрос а потом слуушает 2-3 минуты или по принципу запрос-ответ-запрос-ответ…..
Если первое то задача не имеет решения, во время работы программы1 программа2 не сможет получать данные,
Если второе то, имхо, вам определенно нужен отдельный демон котороый будет держать порт, и распределять запросыв по времени чтобы во время работы программы1 программа 2 могла получить свои данные.
Rosa
Обе программы работают в режиме вопрос-ответ- и т.д.
надо, чтобы во время работы программы №1, вторая программа приостанавливала свои действия до освобождения порта программой №1
PEHDOM
Rosa
надо, чтобы во время работы программы №1, вторая программа приостанавливала свои действия до освобождения порта программой №1
в таком случае не нужно городить велосипед,нужно чутка доработать алгоритм программ. Чтобы программа2 после опроса отпускала порт, а программа1 на протяжении всей своей работы порт держала, по принципу
алгоритм работы программы2:
программа2: порт свободен, работаем...
программа2: работу окончила, освобождает порт.
программа2 через минуту : порт занят, пробуем через минуту...
....
программа2 через три миннуты: порт свободен, работаем...
алгоритм работы программы1:
программа 1: порт занят ждем 30 сек...
программа 1 через 30 сек: порт занят ждем 30 сек...
программа 1 через 30 сек: порт свободен, блокируем порт, работаем....

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB