UART в ESP32

ESP32 Wroom

В данной статье рассмотрим как использовать UART в ESP32 на примере платы ESP32 WROOM. разберем минимальный проект по передаче данных с компьютера на ESP32.

ESP32 uart0

Обратившись к описанию платы мы видим, что ESP32 имеет два порта UART: UART0 и UART1.

Модуль UART0 выведен на ножки 1 и 3, а модуль UART1 выведен на ножки 16 и 17. Данная информация нам понадобиться для разработки программы.

В нашем примере мы будем использовать UART0.

Подключение uart в ESP32

Подключение к модулю производится так же как и с другими микроконтроллерами. Ножку Tx необходимо соединить с ножкой Rx устройства. Ножку Rx с ножкой Tx устройства. Подробнее подключение расписано на ниже приведенной схеме.

Схема подключения UART в ESP32

Пример минимальной программы ESP32

#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include <inttypes.h>

#include "driver/uart.h"
#include "string.h"
#include "driver/gpio.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_log.h"
#include "nvs_flash.h"

#include "main.h"

#include "time.h"
#include "sys/time.h"
#include "uartWork.h"

#define TXD_PIN (GPIO_NUM_1)
#define RXD_PIN (GPIO_NUM_3)

static const int RX_BUF_SIZE = 128;
esp_uart_t usartWorks;

//Очищаем буферы от данных
void FreeBuf(uint8_t* buff, uint32_t sizeb)
{
    for(int i = 0; i < sizeb; i++)
    {
        buff[i] = 0;
    }
}

void init_UART(void) {
    const uart_config_t uart_config = {
        .baud_rate = 115200,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };
    uart_driver_install(UART_NUM_0, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
    uart_param_config(UART_NUM_0, &uart_config);
    uart_set_pin(UART_NUM_0, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}


int sendData(const char* data)
{
    int txBytes = 0;
    const int len = strlen(data);
    txBytes = uart_write_bytes(UART_NUM_0, data, len);
    return txBytes;
}

static void rx_task(void *arg)
{
    uint8_t* data = (uint8_t*) malloc(RX_BUFER_SIZE+1);
     while (1) {
        const int rxBytes = uart_read_bytes(UART_NUM_0, data, RX_BUFER_SIZE, 1000 / portTICK_PERIOD_MS);
        if (rxBytes > 0) 
        {
            data[rxBytes] = 0;
            for (int i=0;i<rxBytes;i++)
            {
                usartWorks.dataRX[i] = data[i];
            }
            usartWorks.dataRxByte = rxBytes; 
            //printf("Get date: %s\n", usartWorks.dataRX);
            strcat((char *)usartWorks.dataTX, (char*) "Send date: \0");
            strcat((char *)usartWorks.dataTX, (char*) usartWorks.dataRX);
            strcat((char *)usartWorks.dataTX, END_MESSEGE);
            sendData((char*)usartWorks.dataTX);
            FreeBuf(usartWorks.dataTX,TX_BUFER_SIZE);
            FreeBuf(usartWorks.dataRX,RX_BUFER_SIZE);
        }       
    }
    free(data);
    vTaskDelay(10 / portTICK_PERIOD_MS);
}

void app_main(void)
{
    esp_err_t ret;
 
    /* Initialize NVS. */
    ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    
    init_UART();
    xTaskCreate(rx_task, "uart_rx_task", 1024*2, NULL, tskIDLE_PRIORITY, NULL);
}
#include "driver/uart.h"
#include "esp_types.h"
#include "esp_event.h"
#include "esp_err.h"
#include "driver/uart.h"

#define RX_BUFER_SIZE  256
#define TX_BUFER_SIZE  128
#define END_MESSEGE  "\r\n"

typedef struct 
{
    uint8_t dataRX[RX_BUFER_SIZE];
    uint8_t dataTX[TX_BUFER_SIZE];
    uint8_t dataRxByte;
} esp_uart_t;

Для удобства работы была создана структура esp_uart_t, содержащая 2 буфера. В них мы будем записывать и считывать данные.

Перед использованием UART, его необходимо настроить. Для этого используем функцию initUART. В ней мы настраиваем скорость передачи, бит четности и т.д.
После настройки мы можем использовать прием и передачу через UART.

В примере мы используем операционную систему freeRTOS, по этому прием данных мы будем осуществлять в созданной задаче rx_task. Созданная задача реализует следующую задачу.

с Пк по uart приходят данные, мы их принимаем, затем отправляем обратно, добавив к сообщению Send date.

Что бы запустить задачу, необходимо вызвать функцию xTaskCreate и передать ей одним из аргументов название задачи.

Где купить

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии