Manual

do

Maker

.

com

Três maneiras de configurar a segunda serial do ESP32

Três maneiras de configurar a segunda serial do ESP32

Esse não é um artigo que se diga: "nossa, como isso é importante!" - mas é legal saber mais de uma maneira de fazer algo, ainda mais 3 maneiras de configurar a segunda serial do ESP32.

Poderia ser a primeira serial, sem problemas. Eu citei a segunda porque é um extra. Vamos aos códigos.

Configurar a segunda serial do ESP32 pela API do Arduino

Esse é o mais comum:

void setup(){
    Serial.begin(115200);
    Serial1.begin(115200);
}

Esse é o jeito tradicional para quem programa pela IDE do Arduino. Não tem segredo e nem o que falar a respeito.

Configurar a segunda serial do ESP32 utilizando hardwareSerial

O segundo é através do hardwareSerial:

#include <HardwareSerial.h>

HardwareSerial Serial1(2);

void setup(){
    Serial1.begin(9600,SERIAL_8N1,S1RX,S1TX);
}

Também não tem segredo, só alguns caracteres a mais. Inclue-se a biblioteca harwareSerial.h e cria-se o objeto da serial com o nome que quiser. Em setup() inicia-se  a serial passando além da velocidade, os bits de paridade (nunca usei outra coisa que não fosse 8N1) e os pinos de IO selecionados para TX e RX.

Configurar a segunda serial do ESP32 ESP-IDF

Agora vamos ao terceiro modo, o modo "ESP-IDF":

#include "driver/uart.h"

#define BUF_SIZE (1024)

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
};

uart_param_config(UART_NUM_0, &uart_config);

uart_set_pin(UART_NUM_0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL, 0);

Assusta um pouco no começo, mas é simples também. Primeiro, inclui-se o driver da UART e defini-se um buffer. Depois, temos a estrutura da configuração da UART. Não precisamos decorar, é só ter guardado e copiar quando precisar.

Para atribuir as configurações e definiar a uart, utilizamos a função uart_param_config, onde passamos a UART a configurar e passamos como segundo parâmetro a estrutura da configuração para a porta.

A função uart_set_pin nos permite configurar 4 parâmetros, sendo que os dois mais importantes para nós são os pinos TX e RX. O primeiro parâmetro é a referência à serial que está sendo configurada. Se quiser, pode utilizar todos os parâmetros padrão, como está no exemplo acima, para configurar a UART0.

Após configurado, basta fazer a instalação do driver, como exemplificado na linha uart_driver_install. Os parâmetros do driver são:

  • Tamanho do buffer de envio
  • Tamanho do buffer de recepção
  • Manipulador da fila de eventos e tamanho
  • Flags para alocar uma interrupção

Ler dados da serial

Utilizando o modo ESP-IDF, tem um pouco mais de conceitos. A função de leitura lê o tamanho do buffer e retorna o tamanho do array de dados alocados. Basicamente, utiliza-se:

int len = uart_read_bytes(UART_NUM_0, data, BUF_SIZE, 20 / portTICK_RATE_MS);

Depois é só ler do buffer.

Escrever dados na serial

Para escrever também é necessário um pouco de trabalho. Não precisamos de um retorno, portanto os parâmetros são a UART, os dados e o tamanho do buffer:

uart_write_bytes(UART_NUM_0, (const char *) data, len);

No sketch do Arduino esse código fica assim:

#include "driver/uart.h"

#define BUF_SIZE (1024)

uint8_t *data = (uint8_t *) malloc(BUF_SIZE);


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
};

void setup() {
  uart_param_config(UART_NUM_0, &uart_config);
  uart_set_pin(UART_NUM_0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
  uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL, 0);
}

void loop() {
  int len = uart_read_bytes(UART_NUM_0, data, BUF_SIZE, 20 / portTICK_RATE_MS);
  if (data[0] == 'd') {
    bzero(data,1024);
    uart_write_bytes(UART_NUM_0, (const char *) "www.DobitAoByte.com.br\n", 23);
  }
  else if (len >3){
    uart_write_bytes(UART_NUM_0, (const char *) data, len);
  }
}

Esse exemplo lê 1 byte vindo da serial e, sendo 'd', devolve a URL do site. De outro modo, ignora.

uart_esp32-test.webp

Um artigo com mais referências sobre as configurações da serial com as funções do FreeRTOS podem ser vistos nesse link.

Se quiser tratar interrupções na serial do ESP32, escrevi esse outro artigo.

Pra finalizar com um bônus, ainda podemos utilizar softwareSerial, como exemplificado nesse artigo com Digispark.

Até o próximo artigo e, não deixe de curtir nossa página no facebook pela janelinha ali na coluna da direita!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.