elchupanibrei (elchupanibrei) wrote,
elchupanibrei
elchupanibrei

Category:

Зачем пользоваться костылем SoftSerial, когда у ESP8266 два аппаратных UART?

Стала бесить копипаста SoftSerial перекочевавшая с Arduino AVR на Arduino ESP8266. К AVR вопросов нет, там почти всегда один аппаратный UART и он занят USB-COM мостом и bootloder-ом, поэтому без SoftSerial никак. Но зачем тащить кривой ногодрыг в проекты на ESP8266 с двумя аппаратными UART? Рассказываю как надо...

1. После старта ESP8266 Serial висит на UART0/Serial подключенный к COM-USB мосту, пины GPIO01(TX)/GPIO03(RX)
2. Переключаем на сенсор (например MH-Z19) командой Serial.swap() висящий на втором UART2/Serial1, пины GPIO15(TX)/GPIO13(RX)
3. На всякий случай чистим Serial буфер от мусора оставшегося от UART0 обмена, командой Serial.flush()
4. Передаем сообщения сенсору
5. Принимаем сообщение от сенсора ВО ВРЕМЕННУЮ ПЕРЕМЕННУЮ
6. Переключаем Serial назад на UART0 и чистим буфер от мусора оставшегося после обмена по UART2
7. Посылаем данные из временной переменной в COM-USB мост и на пины GPIO01(TX)/GPIO03(RX)
8. Переключаемся назад на сенсор и повторяем с п.3


WeMos D1 Mini pinout


На Arduino языке выглядит так:

Serial.begin(9600, SERIAL_8N1); //GPIO1 (TX) and GPIO3 (RX), 9600kbps, 8-bit data, no parity, 1-bit stop

//your brilliant code here

Serial.swap(); //GPIO15 (TX) and GPIO13 (RX)
Serial.flush(); //clear serial buffer

//your brilliant code here

Serial.swap(); //swap back to GPIO1 (TX) and GPIO3 (RX)
Serial.flush(); //clear serial buffer

//your brilliant code here


UDP: У платы WeMos D1 Mini UART2 висит на D8/TX и D7/RX

UDP2: Народ немножко не вкурил. Поэтому дополню. У ESP8266 два полных аппаратных UART. Первый UART0/Serial занят USB-COM мостом (для прошивки и обмена с компьютером). Второй UART2/Serial1 - абсолютно свободен. Команда Serial.swap() нужна для переключения между UART0/Serial и UART2/Serial1. Команда Serial.flush() необходима для очистки буфера - он один на оба UART и после переключения там может оставаться непрочитанная информация от предыдущего обмена. Если нет необходимости в обмене между ESP8266 и компьютером по COM порту, то "все эти переключения туда-обратно" не нужны. Достаточно после загрузки ESP8266 один раз вызвать Serial.swap() и весь Serial.print() из скетча, будет валится в UART2/Serial1. Если не хотите чтоб в UART2/Serial1 валилась информация от debug встроенного в Arduino ESP8266 core, перед заливкой скетча выбираем Disable или Serial:


Arduino IDE на немецком

UDP3: Пример использования UART2 с плеером DFPlayer Mini тут.
Tags: #arduino, #esp8266, arduino, esp8266
Subscribe

Recent Posts from This Journal

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments