Стала бесить копипаста
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
тут.