воскресенье, 21 мая 2017 г.

Скорость порта 74880 бит/с в Prolific PL2303

Собираю датчик качества воздуха (температура, относительная влажность и содержание углекислоты) на базе esp8266, который будет интегрирован с системой мониторинга. Сейчас у меня esp8266 есть только в виде модуля ESP-01 (выводы модуля vcc, gnd, ch_en, reset, gpio0, gpio2, rx, tx), но уже заказал модуль в варианте ESP-12S.
ESP8266 ESP-01

ESP8266 ESP-12S
На ESP-01 выведены только два gpio, но и те доступны с ограничениями. Оба этих вывода участвуют в выборе режима запуска модуля

Bootloader Modes
Modegpio0gpio2gpio15
UART Download Mode (Programming)010
Flash Startup (Normal)110
SD-Card Boot001

Соответственно gpio0/gpio2 желательно не использовать на модуле ESP-01, но поскольку особого выбора не было, то для подключения датчика температуры и влажности DHT22 (AM2302) я использовал gpio2. Чтобы подключить датчик углекислоты mh-z19 мне нужно использовать uart (выводы rx/tx) и после этого для программирования модуля его придется извлекать. Перед подключением датчика проверяю что выдается в uart помимо отладочных сообщений прошивки.

Подключаю конвертер на базе Prolific PL2303, который я использую для связи с компьютеров и настраиваю порт /dev/ttyUSB0 на скорость 115200 бод:

$ stty -F /dev/ttyUSB0 115200 raw
$ cat /dev/ttyUSB0

После этого жму reset и вижу "мусор" перед первой строчкой, которую выдает прошивка.

ESP8266 UART 115200 bps

Скорее всего это лог встроенного загрузчика, но который передается на другой скорости (не 115200). Попробовал несколько вариантов 9600, 38400, 57600, но разборчивого текста так и не получилось.

После гугления я выяснил что лог загрузчика передается на нестандартной скорости 74880 бод и потому я вижу "мусор" в терминале. Пробую переключить порт на 74880:

$ stty -F /dev/ttyUSB0 74880
stty: invalid argument ‘74880’
Try 'stty --help' for more information.

Облом, не дает задать произвольную скорость, но при этом в linux уже давно есть возможность задавать произвольную скорость для последовательных портов. Нашел простую утилитку anybaud.c, которая позволяет выставить произвольную скорость. Компилирую ее и пробую выставить настройку:

$ wget -O anybaud.c https://gist.githubusercontent.com/peterhurley/fbace59b55d87306a5b8/raw/5017e43f9fde34e9ac37ab2c3fd35b5ca3c3e73f/anybaud.c
$ gcc -static -o anybaud anybaud.c
$ ./anybaud /dev/ttyUSB0 74880
/dev/ttyUSB0 speed changed to 74880 baud

Хотя команда и прошла без ошибок, но лучше не стало

ESP8266 UART 74880 bps
Сообщения прошивки превратились в мусор, но сообщения загрузчика текстом не стали.

Загрузил Windows 7 в VirtualBox, пробросил pl2303 в виртуальную машину и попробовал подключиться к порту через Putty

ESP8266 UART 74880 bps в Putty

Сначала подумал, что это проблемы из-за эмуляции USB в VirtualBox, но переключение скорости порта в Putty на 115200 опровергает эту теорию

ESP8266 UART 115200 bps в Putty
Гугление приносит результат - для поддержки скорости 74880 бод нужно добавить настройку в реестр:

REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Ser2pl]
"ExtBaudrate"="74880,2147485264"

После импорта в реестр перезагрузил виртуальную машину и снова попробовал подключиться к порту к Putty. На этот раз все сработало и появились сообшения загрузчика

ESP8266 UART 74880 bps в Putty после патча реестра
Забегая вперед скажу, что я уже нашел способ как пропатчить pl2303 в linux, но напишу об этом в следующий раз.

Обновлено 22/05/2017: описал способ пропатчить модуль ядра pl2303 в linux для поддержки произвольной скорости передачи данных.

Комментариев нет:

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