Форум сайта python.su
0
Помогите реализовать проверку подключения к ком порту.
У меня две программы обе должны писать данные в один и тот же порт, одна часто, другая редко. Если одна подключилась к ком порту и передает данные, вторая ведь не сможет подключиться к ком порту в этот момент?
Если это так, то как мне организовать эту проверку, на подключение, если несколько раз не успешно, то вывод ошибки и все, время между попытками 1 секунда.
Офлайн
221
beivev
Тут вот какое дело. Поведение зависит от ОС. Я сейчас проверил для пары устройств, одно это ADC, второй GPS приемник.
В Винде (XP) нельзя одновременно двум клиентам подключиться к одному COM порту - кто первый, того и порт. При неудаче подключения возбуждается исключение serial.serialutil.SerialException. Вот его можно отлавливать в вашем коде.
В Линуксе можно подключиться, но например считать второму клиенту пока первые осуществляет циклическое чтение не удается. Почему то возбуждается то OSError, то SerialException. Однако операция записи проходит без ошибок. Не могу достоверно сказать работает ли оно как надо. Возможно в линуксе есть разделение по направлению потоков ввода вывода, точно сказать не могу.
Поэтому если вы пишите свой код для Windows платформ только, вам проще, делаете что то типа:
for attempt in xrange(number_of_attempts): try: ser = serial.Serial(port) except serial.serialutil.SerialException: time.sleep(1) else: raise Exception('Can not open COM port after {} attempts'.format(number_of_attempts)
Офлайн
72
А не проще сделать одну программу, работающую с com-портом, и две других, подкидывающих ей данные, хоть через сокет, хоть файликами?
Офлайн
0
Спасибо. Думал есть что-то отработанное на Линуксе. Попробую сам еще по шерудить с этими ошибками. Если ничего не выйдет, придется уйти к RabbitMQ, с его очередями. Будет самым простым вариантом.
Офлайн