Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 2, 2011 12:22:07

Bakemono
От:
Зарегистрирован: 2011-09-02
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Параллельный опрос устройства

Доброго времени суток !
Уже несколько дней бьюсь над задачей:
Скрипт постоянно вертится в памяти и слушает последовательный порт.
Хочу реализовать периодическую проверку доступности устройства по этому порту

#!/usr/bin/python
#coding=UTF-8
import serial, os #нужные компоненты

#Слушает порт:
ser = serial.Serial('/dev/ttyUSB0', 9600) #открываем порт
while 1:
answer = ser.readline().strip()
print answer
#проверяет доступность порта
DevCheck = os.path.exists("/dev/ttyUSB0")
#print DevCheck
if (DevCheck == 'False'):
print 'not found device '
миллион вариантов, которые я попробовал выкладывать не буду, но пришел к выводу, что нужно распараллелить на потоки. Примерно как-то так
def MyFunc(string,sleeptime,*args): #функция в 2 потока: 1-ищем устрйоство, 2-слушаем порт
if string == 'waitdata':
ser = serial.Serial('/dev/ttyUSB0', 9600) #открываем порт
while 1:
answer = ser.readline().strip()
print answer
time.sleep(1)
if string == 'checkDev':
DevCheck = os.path.exists("/dev/ttyUSB0")
print DevCheck
if (DevCheck == 'False'):
print 'not found device '
time.sleep(5)
while 1:
thread.start_new_thread(MyFunc,("checkDev",1))
thread.start_new_thread(MyFunc,("waitdata",5))
по задумке он должен в первую секунду открыть первый поток и в нем остаться (из-за while 1) а второй пото должен открываться каждые 5 секунд… но нифига не работает)
Буду благодарен.
Данный скрипт пишется в рамках проекта самодельная сигнализация на arduino
Буду благодарен за советы как еще можно реализовать подобный функционал



Офлайн

#2 Сен. 6, 2011 17:30:36

minotavr_x86
От:
Зарегистрирован: 2010-05-21
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Параллельный опрос устройства

def MyFunc(string,sleeptime,*args): #функция в 2 потока: 1-ищем устрйоство, 2-слушаем порт
while 1:
if string == 'waitdata':
ser = serial.Serial('/dev/ttyUSB0', 9600) #открываем порт
answer = ser.readline().strip()
print answer
time.sleep(5)
if string == 'checkDev':
DevCheck = os.path.exists("/dev/ttyUSB0")
print DevCheck
if (DevCheck == 'False'):
print 'not found device '
time.sleep(5)

thread.start_new_thread(MyFunc,("checkDev",1))
thread.start_new_thread(MyFunc,("waitdata",5))



Отредактировано (Сен. 6, 2011 17:33:28)

Офлайн

#3 Сен. 19, 2011 08:04:14

Bakemono
От:
Зарегистрирован: 2011-09-02
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Параллельный опрос устройства

minotavr_x86 спасибо за быстрый ответ!

мысли в слух
Первый поток. запускается как закончится предыдущий первый с следующим параметром devicedb.
Второй поток. Запускается каждые 20 секунд и проверяет доступность текущего устройства из devicedb. В случае недоступности тормозит первый поток, меняет devicedb и запускает первый поток.


накидал даже блок-схему примерную



Отредактировано (Сен. 30, 2011 12:41:17)

Офлайн

#4 Сен. 21, 2011 19:02:14

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Параллельный опрос устройства

1. Что значит доступность?
2. Почему бы не использовать select для работы с несколькими портами за раз? Так же смотрим что такое timeout, что такое nonblocking. Конкретно serial не использовал, но принцип как и с socket должно быть.
3. Потоки придумали слабаки :-).
4. try..except… к чёрту, ну уж если приспичило, то try…except SomeExpectedError…

..bw



Офлайн

#5 Сен. 22, 2011 07:44:35

Bakemono
От:
Зарегистрирован: 2011-09-02
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Параллельный опрос устройства

1. Под доступностью устрйоства я понимаю то, что если подключить arduino к компьютеру, он определится как /dev/ttyUSB0. Иногда ( при замыкании каком-нибудь случайном или других случаях) он отваливается как /dev/ttyUSB0 и становится /dev/ttyUSB1
Поэтому мне нужно как-то это определять.
2. Касаемо остальных замечаний скажу, что питон я начал учить специально для написания этого скрипта и пытался с минимальными знаниями, хоть и с костылями реализовать требуемый функционал.



Офлайн

#6 Сен. 30, 2011 12:40:39

Bakemono
От:
Зарегистрирован: 2011-09-02
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Параллельный опрос устройства

Вообщем задумка у меня такая:
Питоновый скрипт открывает порт с МК (тут и далее микроконтроллер) (по умолчанию /dev/ttyUSB0) и слушает, что МК пишет в порт. Затем обрабатывает то, что получил в порт. Но проблема в том, что если отключить МК (пока скрипт слушает порт), то скрипт все равно продолжит пытаться слушать порт. И если в то время, когда компьютер слушает /dev/ttyUSB0 переподключить МК, он подцепится как /dev/ttyUSB1. Поэтому, чтобы правильно сориентироваться, надо проверять доступность устройства по адресам /dev/ttyUSB0 /dev/ttyUSB1 и определять на каком подключен МК. Собственно у меня по отдельности есть и поиск устройства по адресам и слушание порта. Но вся проблема в том, что я не могу сделать так, чтобы Скрипт запускался, искал МК, выбирал порт и слушал его, параллельно проверяя доступность. А в случае недоступности искал по другому адресу. Блок-схему я нарисовал выше.
devdb = ‘/dev/ttyUSB0’, ‘/dev/ttyUSB1’
Сейчас это выглядит так (кусок)

for device in devdb: #подцепляемся по очереди списка devdb
try:
DevCheck = os.path.exists(device) #(проверяем наличие устройства)
if DevCheck == True:
print 'work with ', device
ser = serial.Serial(device, 9600) #открываем порт
while 1:
#тут слушаем и работаем
except:
pass
Пока пока нашелся мега-костыль - каждые 10 минут перезапускать этот скрипт. Но костыли-костылёчки не труЪ
Буду очень благодарен за помощь



Офлайн

#7 Сен. 30, 2011 16:32:20

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Параллельный опрос устройства

Следи за USB силами pyudev, тут ты будешь знать о появлении новых устройств и об отключении старых. Другой вариант (более простой, но не красивый), это регулярно просматривать /dev, например: glob.glob('/dev/ttyUSB?'). А вообще любопытно, разве не должна происходить ошибка при отключении устройства, т.е. fd.read() должен кидать исключение?
Поэкспериментирую сегодня с флешками, задача простая, но интересная.
А вариант конфигурирования udev для запуска своего скрипта не рассматривался?

p.s. Тебе обязательно пользоваться serial? Я не представляю как и куда его приткнуть. Наверное serial работает иначе как стандартные файловые устройства и не кидает исключение/ошибку, тогда нужно попробовать использовать timeout'ы, т.е. переустанавливать соединение с некоторым интервалом (уж это-то точно не получится, если устройства нет). Потоки тут вообще не нужны, кстати.

..bw



Отредактировано (Сен. 30, 2011 16:38:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version