ESP8266 Урок 11. UART. Приём данных



Продолжаем учиться писать код для микроконтроллера ESP8266.

На данном занятии мы попробуем принять данные по шине UART.

Мы уже по данной шине передавали данные в уроке 7, а теперь нам предстоит их принять.

Казалось, бы какая разница и что тут сложного. Но не так-то всё просто. Чтобы нам не висеть постоянно где-то в бесконечном цикле и не ждать, а не пришли ли нам данные, мы будем использовать обработку события по их приходу в наш буфер. Вот в этом и будет некоторая сложность. Также пришедшие данные мы попробуем отобразить как-то на символьном дисплее, с которым мы работали на прошлом занятии.

Схема также будет у нас такая же как и в прошлом уроке

 

 

Проект с исходным кодом также был сделан из проекта прошлого урока с именем I2C_LCD2004 и назван был, соответственно, UART_RX.

Откроем наш проект в Eclipse и первым делом добавим библиотеку для работы с интерфейсом UART в файле main.c

 

 

В функции user_init() сконфигурируем наш UART

 

 

Строчный массив нам не потребуется.

 

char str01[6];

 

После небольшой задержки перейдём на новую строку в терминальной программе

 

 

Вывод строк на дисплей, 2-секундную паузу и очистку нижней строки также удалим

 

LCD_String(«String 1»);

LCD_SetPos(3,1);

LCD_String(«String 2»);

LCD_SetPos(6,2);

LCD_String(«String 3»);

LCD_SetPos(9,3);

LCD_String(«String 4»);

ets_delay_us(1000000);

system_soft_wdt_feed();

ets_delay_us(1000000);

system_soft_wdt_feed();

LCD_SetPos(9,3);

LCD_String(» «);

 

Из тела бесконечного цикла также всё удалим.

 

 

Добавим пока пустотелую функцию для обработки прерываний от UART

 

 

Объявим глобальный буфер для данных, которые будут приходить по UART

 

 

Также объявим прототипы функций для того, чтобы были видны макросы для прерываний

 

 

В функции user_init организуем обработку прерываний от UART, аналогично как мы делали это для GPIO

 

 

В функции-обработчике прерываний отреагируем на различные события, исследуя флаги

 

 

Также добавим глобальную переменную для хранения длины принятых данных и пользовательский флаг

 

 

 

В функции-обработчике uart0_rx_intr_handler измерим длину данных. Если она окажется большей нуля, то установим наш флаг

 

 

В функции user_init в бесконечном цикле добавим ещё один цикл, в котором мы будем время от времени сбрасывать сторожевой таймер, а если вдруг наш пользовательский флаг окажется установленными, то мы из этого цикла выйдем и сбросим этот флаг

 

 

Отправим в ответ в терминальную программу длину принятого пакета и освободим место для принятых символов на дисплее

 

 

Так как отправлять на дисплей мы данные будем посимвольно, а не целой строкой, то в файле lcd.c добавим для этого функцию после функции отправки байта в дисплей sendbyte

 

 

Добавим прототип для данной функции в заголовочном файле и вернёмся в функцию user_init файла main.c, в которой добавим ещё 2 локальные переменные

 

 

В бесконечном цикле пробежимся по буферу и, не выводя перевод строки и возврат каретки, выведем наши принятые символы на дисплей

 

 

Затем очистим необходимые флаги UART и включим прерывания

 

 

Соберём код, прошьём контроллер и запустим терминальную программу, в которой кроме настройки порта и скорости передачи включим также режим ввода данных Line Mode

 

 

Соединимся с портом и попробуем что-нибудь отправить в дисплей

 

 

В ответ мы сразу в приёмной части получим количество байтов

 

 

Также мы видим, что данные все принялись в ESP8266, судя по надписи на дисплее

 

 

Итак, на данном уроке мы научились принимать данные по шине UART, при этом используя механизм прерываний.

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК ESP8266 Следующий урок

 

Исходный код

 

 

Модуль ESP NodeMCU можно купить здесь: Модуль ESP NodeMCU

Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266

Дисплей LCD 20×4 можно приобрести здесь Дисплей LCD 20×4

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

ESP8266 Name

6 комментариев на “ESP8266 Урок 11. UART. Приём данных
  1. Валерий:

    Исходный код не загружается, ссылка выдает ошибку! За пример СПАСИБО!

  2. Дмитрий:

    Зачем буфер объявляли, если мы его не используем и выводим посимвольно из регистра? Спасибо.

  3. Спасибо за урок! Функция обработки прерываний немного похожа на китайскую грамоту. Работает и хорошо.

  4. Александр:

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

  5. Марк:

    Заметил, что используется (PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD)/ Конфигурация пина GPIO1) вместо (PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD)/ Конфигурация пина GPIO3 (func U0RXD = 0), которой нет в описании eagl_soc.h, но по даташиту должна быть. Поэтому просто подставил FUNC_U0TXD, т.к. тоже =0.
    Вообще в хедерах много пропусков, как например с объявлением прототипов(ets_isr_mask), а если посмотреть SDK 3.0.5 , то все на месте.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*