среда, 8 июня 2011 г.

pyserial vs gsm-modem

В одном из проектов появилась необходимость настройки gsm-модема (mc52i) через последовательный порт: AT-команды, настройка параметров модема, запись и чтение смс, настройка профиля GPRS и т.п.

Само собой, будем использовать наш любимый Python, а работы с COM-портом существует отличная библиотека PySerial.

Завелось, как говорится, сполпинка, но при увеличении размера скрипта, когда обмен шел интенсивно, практически каждый раз при работе вылетало исключение writeTimeoutError.

В документации на pyserial про serial.write() написано следующее: Raises SerialTimeoutException: In case a write timeout is configured for the port and the time is exceeded.

Однако увеличение параметра writeTimeout на происходящее никак не повлияло. Кроме того, библиотека не предоставляет возможности настройки размера буфера порта. Возможно, причина исключения и не в буфере, но в чем, пока что мне непонятно.

Ок. Подсмотрел в примерах для pyserial, что используется запись и чтение в порт из отдельных потоков. Отлично. Создаем отдельный класс ThSerial.


class ThSerial:
    """ Serial port daemon class.
        """
    def __init__(self, port, baudrate, timeout = 1):
        try:
            self.serial = serial.Serial(port, baudrate)
        except serial.SerialException, e:
            sys.exit(1)
            
        self.in_data=[]
        self.out_data=[]
        self.timeout = timeout
        self.open()

    def open(self):
        self.alive = True
        self.receiver_thread = threading.Thread(target=self.reader)
        self.receiver_thread.setDaemon(1)
        self.receiver_thread.start()
        self.transmitter_thread = threading.Thread(target=self.writer)
        self.transmitter_thread.setDaemon(1)
        self.transmitter_thread.start()
где в методе open() создаем два потока для записи и чтения.

Приятная для таких новичков как я (хотя может быть и ограничивающая) особенность потоков в python - то, что все объекты автоматически безопасны, т.е. предусматривать средств распределения ресурсов для разных потоков в нашем случае не требуется.

Далее реализуем собственно демоны:


    def reader(self):
        while self.alive:
            data = self.serial.read(1)
            for character in data:
                self.in_data.append(character)
                
    def writer(self):
        while self.alive:
            if len(self.out_data) > 0:
                character = self.out_data.pop(0)
                self.serial.write(character)

И определяем для нашего классы методы write(), read() и readline(), как в классе serial, чтобы не переписывать уже имеющиеся скрипты.

Запуск. Всё отлично работает.

Странно, что подобный класс сразу не включили в библиотеку pyserial, хотя, может, это часть идеологии python :)

Исходный код можно взять здесь.

Конкретной причины, по которой происходит ошибка таймаут на запись, я так и не понял, далее искать стало лень :(

Update.

На самом деле, как оказалось, причина вылета по таймауту банальна - тормознутость компа. Выделение отдельного процесса позволяет переложить распределение процессорного времени на операционную систему.

4 комментария:

  1. Спасибо, помогло ))

    ОтветитьУдалить
  2. VarangaOfficial - варанга стоимость - все, что нужно знать об этом препарате. Воспользовавшись услугами нашего ресурса, вы получите возможность узнать исчерпывающую информацию касательно данного лекарственного средства. Увидеть данные о клиническом тестировании геля, прочитать реальные отзывы пациентов и врачей. Изучить инструкцию по использованию, прочесть особенности и методы работы мази, осмыслить, почему крем Варанга настолько эффективен, где можно заказать оригинальный сертифицированный препарат и, как избежать покупки подделки. Мы очень тщательно проверяем размещаемые данные. Предоставляем нашим пользователям сведения, взятые исключительно из авторитетных источников. Если вы нашли признаки появления грибка или же долго и безрезультатно стараетесь излечиться от этого коварного, неприятного недуга, на нашем сайте вы отыщете быстрый и легкий способ решения проблемы. Присоединяетесь и живите здоровой полноценной жизнью. Все, что вы хотели знать, теперь можно найти на одном ресурсе.

    ОтветитьУдалить
  3. Срочно оформить микрокредит без проблем на банковскую карту по московскому времени с процентной ставкой в пределах 0% доступно микрофинансовой организации. Сравните пару вариантов и отправьте запрос через 7-24 через официальный портал выбранной организации. Такой способ кредитования доступен каждому частному гражданину, имеющему российское гражданство и ежемесячную прибыль в виде 15 тысяч рублей. Чтобы оформить договор с мфо, заполните форму на ресурсе микрофинансовой организации и дождитесь завершения запроса. В специальной форме укажите: - Конфиденциальная информация и переписка. - Размер постоянной заработной платы и географический пункт работы. - Реквизиты банковской карты для перевода заемных денег. - Заместители надежно выдаются круглосуточно. Мфо осуществляют переводы на персональные кредитные карты (ценный параметр - баланс счета будет положительным) и действительны не менее месяца. Плюс ко всему, кредит без проблем выдается на банковскую карту онлайн, есть возможность добиться довольно быстрого! По условиям договора на оказание финансовой помощи вы можете получить от одной до полной тысячи рублей. Рабочее время такого соглашения составляет более пяти дней в течение года. Для тех, кто подает заявку на кредит онлайн на карту в 1-й раз, существуют ограничения по лимиту. Начинающие пользователи могут в обязательном порядке получить микрокредит на хороший срок до одного месяца. При первом обращении часто предлагаются специальные условия, поэтому плата за просмотр денег равна минимуму, если кредит погашается быстро. Зрелые граждане, студенты, а кроме того безработные могут пополнить ряды заемщиков и попросить микрокредит без обмана без каких-либо проблем. Срочно Рейтинг МФО В мегаполисе люди, купившие российский паспорт, могут найти его без промедления. Перечень основных условий для претендентов на получение мини-кредитов включает: - Наличие постоянной регистрации. - Возраст совершеннолетия (краткосрочные кредиты выдаются гражданам от восемнадцати до семидесяти лет). 100% кредит онлайн безупречно Нет необходимости закладывать имущество, чтобы ознакомиться с кредитными средствами. Микрокредит до 30 тысяч рублей можно взять только после предъявления паспорта. Вероятность авторизации приложения составляет 100 %. Для регистрации вам нужно всего лишь предоставить справку о паспорте, номер телефона и ссылку на почтовый ящик.

    ОтветитьУдалить
  4. Casino | Dr. Md.
    casino 정읍 출장샵 resort 김천 출장샵 hotel & casino resort hotel offers the finest gaming, dining, shopping and more! Play your 동해 출장샵 favorite Blackjack, Roulette and more! 777 파주 출장마사지 Casino Center Dr, Suite 경상남도 출장샵 2206.

    ОтветитьУдалить