Найти - Пользователи
Полная версия: Параллельный опрос устройства
Начало » Центр помощи » Параллельный опрос устройства
1
Bakemono
Доброго времени суток !
Уже несколько дней бьюсь над задачей:
Скрипт постоянно вертится в памяти и слушает последовательный порт.
Хочу реализовать периодическую проверку доступности устройства по этому порту
#!/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
Буду благодарен за советы как еще можно реализовать подобный функционал
minotavr_x86
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))
Bakemono
minotavr_x86 спасибо за быстрый ответ!

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


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

..bw
Bakemono
1. Под доступностью устрйоства я понимаю то, что если подключить arduino к компьютеру, он определится как /dev/ttyUSB0. Иногда ( при замыкании каком-нибудь случайном или других случаях) он отваливается как /dev/ttyUSB0 и становится /dev/ttyUSB1
Поэтому мне нужно как-то это определять.
2. Касаемо остальных замечаний скажу, что питон я начал учить специально для написания этого скрипта и пытался с минимальными знаниями, хоть и с костылями реализовать требуемый функционал.
Bakemono
Вообщем задумка у меня такая:
Питоновый скрипт открывает порт с МК (тут и далее микроконтроллер) (по умолчанию /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 минут перезапускать этот скрипт. Но костыли-костылёчки не труЪ
Буду очень благодарен за помощь
bw
Следи за USB силами pyudev, тут ты будешь знать о появлении новых устройств и об отключении старых. Другой вариант (более простой, но не красивый), это регулярно просматривать /dev, например: glob.glob('/dev/ttyUSB?'). А вообще любопытно, разве не должна происходить ошибка при отключении устройства, т.е. fd.read() должен кидать исключение?
Поэкспериментирую сегодня с флешками, задача простая, но интересная.
А вариант конфигурирования udev для запуска своего скрипта не рассматривался?

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

..bw
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