В какой-то момент времени я решил, что уже пора оставлять Python-2.x и потихоньку перебираться на Python-3.x. Ну, дело-то вроде бы хорошее, но не всё в третьем Питоне так гладко и безупречно, чтобы можно было вот так просто взять и перепрыгнуть на него с малыми затратами.
Не буду говорить о том, что в третьем Питоне немного по другому работают некоторые его (чисто Питоновские) вещи. Различие версий Питонов достаточно хорошо освещено в информационном поле (в интете, в книгах).
Долгое время я использовал второй Питон. Одной из причин этого была та, что для третьего Питона отсутствовал модуль для работы с последовательным портом. Но летом 2015 года, я обнаружил, что модуль serial для Python-3.x уже создан и с ним уже вроде бы даже можно работать.
Первые мои тестовые программки на Python-3.x показали, что модуль serial вполне пригоден для работы. И начал перебираться на третью версию Питона.
Но неожиданно случился сильный облом. Да такой сильный, что мне пршлось обращаться за внешней помощью:
У меня есть один девайс — автомобильный сканер ELM327. Проблема в том, что во втором Питоне я могу с ним работать, а третий Питон ведет себя очень странно! Что бы я ни делал, модуль serial в Python-3.x в ответ от устройства выдает мне какую-то чушь. Более детально проблема описана по приведенной выше ссылке.
Судя по USB-ишным VID- и PID-идентификаторам, в устройстве используется микросхема CH340. Я не так давно работаю с этой микросхемой, во всяком случае она меньше (мною) изучена, чем FT232.
Таким образом, я не знал, где лежит проблема — глючит ли это модуль serial, или же это особенность микросхемы.
Для локализации проблемы я даже слепил мост USB-USB и соединил два компа:
Тестирование показало, что Python-2.x с модулем serial не испытывают вообще никаких проблем в работе с этой микросхемой. И Python-3.x со своим модулем тоже способен передавать через мостик потоки данных на любой скорости.
Странно 😦
Значит, причина всё-таки в девайсе?
Помощи от общества я так и не получил, поэтому пришлось курочить сам девайс:
Корпус оказался склеенным, а не скрученным с помощью шурупов.
Чтобы разобрать такой девайс нужно его как можно крепче остудить, чтобы пластмасса корпуса стала хрупкой. Когда пластмасса хрупкая, её можно расколоть относительно сильным, но обязательно резким ударом молотка.
— Буду бить аккуратно, но сильно. Ха-га-га-га-га! (с)
На улице было лето, единственный холод имелся только в холодильнике. Поэтому я осуществил заморозку корпуса с помощью морозильника, и потом расхреначил молотком корпус по шву. Получилось относительно аккуратно.
Внутри была вот такая плата:
— Вид в фас… у профиль. (с)
На последней фотке микросхема 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.
Замечательно!
Стараюсь, как могу. Не всегда получается хорошо, но всегда искренне пытаюсь делать мир лучше.
А можешь скинуть ссылку на модуль, пж!
Вообще конкретно в Debian-8 модуль serial находится в репозитории и устанавливается командой:
# apt-get install python3-serial
Если у Вас операционная система Ubuntu или производная от Ubuntu или от Debian (например, Mint), то попробуйте прописать в файле /etc/apt/source.list путь к дебиановскому репозиторию (или к одному из его зеркал).
Про другие дистрибутивы ничего сказать не могу, так как с ними не работаю.
Если вообще ничего не получается, то могу разве-что ещё могу порекомендовать зайти в репозиторий разработчика пакета:
https://github.com/pyserial/pyserial
и клонировать проект. Потом Вам нужно будет самостоятельно его откомпилировать и установить.