ESP32. Урок 34. UART. Приём данных



Продолжаем учиться писать код для микроконтроллера ESP32 и на данном занятии мы попробуем принять данные по шине UART.

До сих пор мы только передавали данные по этой шине, причём не вдаваясь в процесс происходящего ибо всё это реализовано в комплекте IDF.

А вот с приёмом, который нам пригодится в недалёком будущем, дела обстоят несколько посложнее.

Схема наша по-прежнему будет состоять из платы с контроллером ESP32, подключенной к порту USB компьютера

 

 

Проект мы возьмём за основу из урока 4, в котором мы работали с кнопкой, с именем BUTTON01 и на его основе создадим проект с именем UART_RX.

Откроем наш проект в ESPRESSIF IDE и из файла Kconfig.projbuild удалим пункт меню по работе с ножкой, к которой была подключена кнопка (BUTTON_GPIO). Также в данном файле ножку порта по умолчанию для светодиода выберем вторую

 

default 48 if IDF_TARGET_ESP32S3 default 2

 

В функции app_main файла main.c оставим только вот эти строки

 

 

Не забываем также в конфигураторе выбрать 4 мегабайта объёма памяти FLASH

 

 

Попробуем собрать наш проект. Если всё нормально собирается, то ещё создадим заголовочный файл main.h, в который соберём все подключенные заголовочные файлы из main.c, а заодно и подключим заголовочные файлы для работы с UART

 

 

Вернёмся в main.c и удалим подключение всех заголовочных файлов, а подключим только один

 

#include "main.h"

 

Добавим функцию инициализации UART, чтобы не нагромождать код в функции точки входа

 

 

В теле функции мы объявили переменную типа структуры параметров конфигурации UART. Параметры все стандартные и объяснять тут нечего.

Объявим глобальную переменную с размером буфера для UART

 

 

В теле функции uart_init мы настроим драйвер для шины, используя для этого функцию из комплекта с параметрами номера шины, размера буфера, умноженного на 2. Остальные параметры будут нулевые.

 

 

Третий параметр, который у нас также нулевой, должен быть с размером буфера передачи. А если он нулевой, то драйвер не будет использовать буфер TX, функция TX заблокирует задачу, пока все данные не будут отправлены. Остальные параметры нам пока вообще не интересны.

 

 

Далее мы, используя, переменную структуры , применим нашу конфигурацию для интерфейса UART

 

 

Объявим макросы с ножками порта, которые будут у нас задействованы под UART. Исходя из схемы нашей платы это GPIO1 и GPIO3

 

 

Вернёмся в нашу функцию  и применим наши ножки к шине

 

 

4 и 5 параметры — это ножки для CTS и RTS. Они у нас не используются. Передаём здесь -1.

В функции app_main вызовем нашу функцию инициализации

 

 

Так как передачу мы не используем, то и задачу мы для неё не создаём, создадим функцию для задачи приёма пакетов ниже функции инициализации uart_init

 

 

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

 

 

Объявим также указатель на 8-разрядный беззнаковый целочисленный тип и сразу выделим под него память с небольшим запасом

 

 

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

 

 

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

 

 

Мы не используем логирование напрямую, тем не менее инициализация нужна.

 

 

В функции app_main создадим нашу задачу

 

 

Вот и весь код. Вроде небольшой и несложный, но свои тонкости имеет.

Соберём код, прошьём контроллер и запустим отдельную терминальную программу, так как штатный терминал ESPRESSIF_IDE конфигурируется на приём не совсем привычным образом. Настроим порт

 

 

 

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

 

 

Через некоторое время мы сможем увидеть, что наша строка вернётся в терминальную программу

 

 

Значит у нас всё нормально работает.

При желании мы можем подключить логический анализатор вот к этим ножкам

 

 

И посмотреть в программе логического анализа, как происходит приём и передача по шине UART

 

 

Наличие лишнего символа возврата каретки нас не должно волновать, это мелочи. Возможно, мы немного не там завершаем строку в коде. Также то, что эхо идёт не сразу, это также решаемый вопрос, но это нас тоже сейчас никак не волнует.

Самое главное, что мы смогли принять пакет от UART в отдельном потоке и записать его в массив, что нам очень скоро пригодится.

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

 

 

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

 

Исходный код

 

 

Недорогие отладочные платы ESP32 можно купить здесь:

На AliExpress Недорогие отладочные платы ESP32

На Яндекс.Маркет Недорогие отладочные платы ESP32

Логический анализатор 16 каналов можно приобрести (AliExpress) здесь

 

 

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

ESP32 UART. Приём данных

 

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

ESP32 UART. Приём данных

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

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

*