Python-3.x и модуль serial

В какой-то момент времени я решил, что уже пора оставлять Python-2.x и потихоньку перебираться на Python-3.x. Ну, дело-то вроде бы хорошее, но не всё в третьем Питоне так гладко и безупречно, чтобы можно было вот так просто взять и перепрыгнуть на него с малыми затратами.

Не буду говорить о том, что в третьем Питоне немного по другому работают некоторые его (чисто Питоновские) вещи. Различие версий Питонов достаточно хорошо освещено в информационном поле (в интете, в книгах).

Долгое время я использовал второй Питон. Одной из причин этого была та, что для третьего Питона отсутствовал модуль для работы с последовательным портом. Но летом 2015 года, я обнаружил, что модуль serial для Python-3.x уже создан и с ним уже вроде бы даже можно работать.

Первые мои тестовые программки на Python-3.x показали, что модуль serial вполне пригоден для работы. И начал перебираться на третью версию Питона.

Но неожиданно случился сильный облом. Да такой сильный, что мне пршлось обращаться за внешней помощью:

http://su0.ru/HbRA

У меня есть один девайс — автомобильный сканер ELM327. Проблема в том, что во втором Питоне я могу с ним работать, а третий Питон ведет себя очень странно! Что бы я ни делал, модуль serial в Python-3.x в ответ от устройства выдает мне какую-то чушь. Более детально проблема описана по приведенной выше ссылке.

Судя по USB-ишным VID- и PID-идентификаторам, в устройстве используется микросхема CH340. Я не так давно работаю с этой микросхемой, во всяком случае она меньше (мною) изучена, чем FT232.

Таким образом, я не знал, где лежит проблема — глючит ли это модуль serial, или же это особенность микросхемы.

Для локализации проблемы я даже слепил мост USB-USB и соединил два компа:

IMG_0846

Тестирование показало, что Python-2.x с модулем serial не испытывают вообще никаких проблем в работе с этой микросхемой. И Python-3.x со своим модулем тоже способен передавать через мостик потоки данных на любой скорости.

Странно 😦

Значит, причина всё-таки в девайсе?

Помощи от общества я так и не получил, поэтому пришлось курочить сам девайс:

IMG_0848

Корпус оказался склеенным, а не скрученным с помощью шурупов.

Чтобы разобрать такой девайс нужно его как можно крепче остудить, чтобы пластмасса корпуса стала хрупкой. Когда пластмасса хрупкая, её можно расколоть относительно сильным, но обязательно резким ударом молотка.

— Буду бить аккуратно, но сильно. Ха-га-га-га-га! (с)

На улице было лето, единственный холод имелся только в холодильнике. Поэтому я осуществил заморозку корпуса  с помощью морозильника, и потом расхреначил молотком корпус по шву. Получилось относительно аккуратно.

Внутри была вот такая плата:

IMG_0849

— Вид в фас… у профиль. (с)

IMG_0850

На последней фотке микросхема CH340I (20 ног) — это интерфейсная микросхема UART-USB.

Она немного отличается от CH340G, но работает точно так же.

Судя по работе с ней третьего Питона я думал, что проблема всё-таки в ней. Для того чтобы убедиться в этом, я припаялся к UART-овским сигналам RX и TX и стал смотреть осциллограммы.

И что я увидел — микросхема работает!

Но, собака, почему-то только на одной частоте. (Сейчас я уже не помню на какой именно, вроде только на 9600.) И никакие ухищрения в Питоновской программе не позволяют изменить эту скорость. С другой стороны, когда я устанавливаю скорость командой stty, всё работает.

Что за хрень-то такая?

А надо сказать, что в моей программе скорость работы устанавливается при вызове конструктора последовательного порта:

port = serial.Serial("/dev/ttyUSB0", 38400, timeout=0.2)

И вот, в какой-то момент времени, я решил идти последовательно.

А что если я сначала открою порт и уж только потом буду менять у него параметры?

port = serial.Serial("/dev/ttyUSB0")
port.baudrate = 38400
port.timeout = 0.2

И вот тут «Наш пилот Джон Смит внезапно поднял наш самолёт в воздух» (с). Всё срослось и нормально заработало! Ура!

Проблему решить «в лоб» не удалось. Но зато удалось нащупать «обходной путь». Рецепт прост — в Питоне-3 не следует производить одновременно инициализацию порта и установку скорости.

В общем, как я понимаю, этот косяк находится где-то в конструкторе класса Serial.

4 responses to “Python-3.x и модуль serial

  1. Замечательно!

    • Стараюсь, как могу. Не всегда получается хорошо, но всегда искренне пытаюсь делать мир лучше.

      • Igorello

        А можешь скинуть ссылку на модуль, пж!

      • Вообще конкретно в Debian-8 модуль serial находится в репозитории и устанавливается командой:

        # apt-get install python3-serial

        Если у Вас операционная система Ubuntu или производная от Ubuntu или от Debian (например, Mint), то попробуйте прописать в файле /etc/apt/source.list путь к дебиановскому репозиторию (или к одному из его зеркал).

        Про другие дистрибутивы ничего сказать не могу, так как с ними не работаю.

        Если вообще ничего не получается, то могу разве-что ещё могу порекомендовать зайти в репозиторий разработчика пакета:

        https://github.com/pyserial/pyserial

        и клонировать проект. Потом Вам нужно будет самостоятельно его откомпилировать и установить.

Оставьте комментарий