Guia Completo de UART/USART: Princípios, Configuração e Aplicações Práticas

UART e USART são protocolos de comunicação serial fundamentais e amplamente utilizados no desenvolvimento embarcado e na comunicação de hardware. Eles são essenciais para microcontroladores, sensores, módulos Bluetooth, módulos WiFi e interfaces de depuração. Este guia aborda detalhadamente os princípios subjacentes, a estrutura de dados, a configuração de parâmetros, as diferenças cruciais entre UART e USART, a fiação de hardware, exemplos de código prático e a solução de problemas, capacitando você a dominar completamente a comunicação serial.

Conceitos Fundamentais de UART/USART: O Que é Comunicação Serial?

1.1 UART (Transmissor-Receptor Universal Assíncrono)

O UART (Universal Asynchronous Receiver/Transmitter) é um protocolo de **comunicação serial assíncrona**. Sua função principal é converter dados paralelos em dados seriais e vice-versa. Ele não requer uma linha de clock separada para sincronização, utilizando apenas as linhas TX (transmissão), RX (recepção) e GND (terra) para comunicação full-duplex.

  • Características Principais: Completamente assíncrono, sem linha de clock, comunicação ponto a ponto, full-duplex.
  • Lógica de Comunicação: Transmissor e receptor concordam previamente sobre a taxa de baud, bits de dados, bit de paridade e bits de parada. A sincronização do quadro de dados é alcançada pelos bits de início e parada.
  • Hardware Simplificado: Requer apenas a conexão cruzada TX/RX e um terra comum. Sem sinais de clock ou seleção de chip adicionais, resultando em baixo custo.

1.2 USART (Transmissor-Receptor Universal Síncrono/Assíncrono)

O USART (Universal Synchronous/Asynchronous Receiver/Transmitter) é um superconjunto do UART, sendo totalmente compatível com o modo assíncrono do UART e adicionando um modo de comunicação síncrona. É um periférico serial padrão na maioria dos microcontroladores modernos (como STM32, ESP32, GD32).

  • Características Principais: Suporta modos assíncrono e síncrono, requer uma linha de clock (CK/SCLK) no modo síncrono, suporta controle de fluxo por hardware, comunicação rápida e estável.
  • Modo Assíncrono: Idêntico ao UART, usado na maioria das aplicações seriais (99% dos casos).
  • Modo Síncrono: O dispositivo mestre gera um sinal de clock, e o dispositivo escravo amostra os dados em cada flanco do clock. Isso permite taxas de transferência mais altas e maior imunidade a ruídos, sendo adequado para comunicação industrial de alta velocidade.

1.3 Diferenças Fundamentais entre UART e USART (Visão Geral)

A tabela abaixo resume as principais diferenças:

Critério de Comparação UART USART
Modos de Comunicação Apenas assíncrono Modos assíncrono e síncrono
Necessidade de Clock Sem linha de clock, sincronizado por taxa de baud Assíncrono sem clock; Síncrono requer linha de clock CK
Complexidade de Hardware Estrutura simples, baixo uso de recursos Integra lógica síncrona, mais funcionalidades
Faixa de Velocidade Comum de 9600 a 115200 bps Modo síncrono pode atingir 4.5 Mbps+
Suporte a Controle de Fluxo Sem controle de fluxo por hardware Suporta controle de fluxo por hardware (RTS/CTS)
Cenários de Aplicação Depuração, sensores, módulos de baixa velocidade Controle industrial, comunicação de alta velocidade, barramento LIN
Chips Comuns Microcontroladores 51, módulos simples STM32, ESP32, todos os MCUs de 32 bits

Resumo Chave: O USART engloba todas as funcionalidades do UART. Em microcontroladores, o periférico rotulado como "UART" geralmente é um USART operando em modo assíncrono.

Estrutura do Quadro de Dados UART/USART: A Regra Essencial da Comunicação

A comunicação UART/USART ocorre em unidades chamadas quadros de dados. Cada quadro é composto por uma combinação de "bit de início + bits de dados + bit de paridade (opcional) + bits de parada", servindo como o único meio de sincronização entre transmissor e reecptor.

2.1 Estrutura Padrão do Quadro (8N1 é o mais comum)

Considerando a configuração mais comum, 8N1 (8 bits de dados, sem paridade, 1 bit de parada):

  1. Estado Ocioso: A linha TX permanece em nível alto (lógico 1) por padrão, indicando ausência de transmissão.
  2. Bit de Início: O transmissor leva a linha TX para nível baixo (lógico 0), sinalizando ao receptor o início da transmissão de dados e acionando a amostragem.
  3. Bits de Dados: Transmitem os dados efetivos. A transmissão é feita em ordem do bit menos significativo (LSB First). Geralmente são 8 bits, mas 9 bits podem ser usados para endereçamento em comunicação multi-mestre.
  4. Bit de Paridade (Opcional): Um mecanismo opcional para verificação de erros. Pode ser paridade ímpar, paridade par ou sem paridade.
    • Paridade Ímpar: O número total de '1's nos bits de dados é ímpar. O bit de paridade é definido como '0' ou '1' para completar a condição.
    • Paridade Par: O número total de '1's nos bits de dados é par. O bit de paridade é definido como '0' ou '1' para completar a condição.
  5. Bits de Parada: Marcados por um nível alto (lógico 1), indicam o fim do quadro e dão tempo ao receptor para processar os dados. Geralmente 1 bit é utilizado.

2.2 Combinações Comuns de Configuração de Quadro

  • 8N1: 8 bits de dados, sem pariadde, 1 bit de parada (padrão para embarcados, depuração, módulos Bluetooth/WiFi).
  • 8E1: 8 bits de dados, paridade par, 1 bit de parada (sensores industriais, cenários com alta interferência).
  • 8O1: 8 bits de dados, paridade ímpar, 1 bit de parada (equipamentos antigos, comunicação de instrumentos).
  • 7N1: 7 bits de dados, sem paridade, 1 bit de parada (transmissão de caracteres ASCII).

Parâmetros Essenciais de Comunicação: Configuração Incorreta Leva à Falha

3.1 Taxa de Baud (Baud Rate)

Representa o número de símbolos (ou bits) transmitidos por segundo. É a "base de sincronização" na comunicação assíncrona. Transmissor e receptor devem ter a mesma taxa de baud, com uma tolerância de erro de no máximo 10% para uma comunicação normal.

  • Taxas de Baud Comuns: 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 bps.
  • Princípio de Seleção: Para curtas distâncias (< 1 metro) e altas velocidades, use 115200 bps ou superior. Para longas distâncias e ambientes industriais, use 9600 a 38400 bps.

3.2 Bits de Dados (Data Bits)

Determina o comprimento dos dados úteis por quadro. As opções são 5/6/7/8/9 bits. 8 bits são os mais comuns (adequados para dados em bytes), enquanto 9 bits são usados para diferenciar endereços na comunicação multi-mestre.

3.3 Bit de Paridade (Parity Bit)

Um mecanismo simples de detecção de erros. As opções são sem paridade (None), paridade ímpar (Odd) e paridade par (Even). Deve ser habilitado em cenários industriais; pode ser desativado para depuração comum.

3.4 Bits de Parada (Stop Bits)

Sinaliza o fim de um quadro. As opções são 1 bit, 1.5 bits ou 2 bits. 1 bit é adequado para altas velocidades, enquanto 2 bits são mais robustos para baixas velocidades, longas distâncias e cenários com alta interferência.

Fiação de Hardware: Especificações de Conexão Física de UART/USART

4.1 Conexão Básica (3 Fios, Full-Duplex)

  • Conexão Cruzada TX-RX: TX do Dispositivo A para RX do Dispositivo B; RX do Dispositivo A para TX do Dispositivo B.
  • Terra Comum (GND): As linhas de terra de todos os dispositivos devem estar conectadas para fornecer uma referência de nível de tensão comum. Sem isso, a comunicação pode resultar em dados corrompidos ou ausência de sinal.
  • Sem necessidade de linhas de clock ou seleção de chip, o que torna este o esquema de comunicação de hardware mais simples.

4.2 Padrões de Nível de Tensão (Chave da Camada Física)

UART/USART são protocolos lógicos que dependem de padrões de nível de tensão física para a comunicação. Níveis de tensão incompatíveis não podem ser conectados diretamente e requerem conversores:

  1. Nível TTL (3.3V/5V): Padrão para comunicação dentro de placas, microcontroladores, sensores e módulos (3.3V é o mais prevalente).
  2. Nível RS-232 (±12V): Usado em portas COM de computadores e equipamentos industriais antigos. Requer um chip conversor como o MAX3232 para interconverter entre TTL e RS-232.
  3. Nível RS-485 (Sinal Diferencial): Adequado para longas distâncias (1000m+), comunicação multi-ponto e ambientes industriais hostis devido à sua forte imunidade a ruídos. Requer um transceptor como o SP485.

4.3 Controle de Fluxo por Hardware (RTS/CTS, Opcional)

Utilizado para prevenir perda de dados em cenários de alta velocidade e grande volume de dados. Adiciona duas linhas de sinalização:

  • RTS (Request To Send): Do dispositivo transmissor para o receptor, indicando "Estou pronto para enviar dados, por favor, receba".
  • CTS (Clear To Send): Do dispositivo receptor para o transmissor, indicando "Estou pronto para receber, pode enviar".

Modo Síncrono USART: Comunicação Avançada de Alta Velocidade

O modo síncrono USART opera em uma arquitetura mestre-escravo, onde o mestre fornece um sinal de clock (SCLK/CK). Os dados são transmitidos e amostrados de forma síncrona com este clock, eliminando problemas de dessincronização de taxa de baud.

  1. Conexão: TX, RX, SCLK, GND (4 fios).
  2. Flanco do Clock: Os dados são amostrados em um flanco específico (subida ou descida) do sinal de clock, o qual pode ser configurado.
  3. Vantagens: Velocidades de transmissão significativamente mais altas (na faixa de Mbps), sincronização precisa, maior estabilidade em longas distâncias.
  4. Cenários de Uso: Substituição de SPI, comunicação com ADCs/DACs de alta velocidade, barramentos industriais de alta velocidade, comunicação com cartões inteligentes.

Exemplo de Código Prático: Implementação de Recepção/Transmissão UART em STM32 (Biblioteca HAL)

Este exemplo utiliza o microcontrolador STM32F103 com o periférico USART1 em modo assíncrono (8N1, 115200 bps), demonstrando recepção via polling e interrupção, além de transmissão.

6.1 Inicialização do Periférico Serial (Gerado pelo STM32CubeMX)

A configuração do USART1 (PA9-TX, PA10-RX) para 115200 bps, 8N1 é tipicamente gerada automaticamente por ferramentas como o STM32CubeMX.


// Inicialização do USART1: PA9-TX, PA10-RX, 115200 8N1
void inicializar_USART1(void) {
 huart1.Instance = USART1;
 huart1.Init.BaudRate = 115200;
 huart1.Init.WordLength = UART_WORDLENGTH_8B;
 huart1.Init.StopBits = UART_STOPBITS_1;
 huart1.Init.Parity = UART_PARITY_NONE;
 huart1.Init.Mode = UART_MODE_TX_RX;
 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 huart1.Init.OverSampling = UART_OVERSAMPLING_16; // Amostragem padrão
 if (HAL_UART_Init(&huart1) != HAL_OK) {
   // Tratamento de erro na inicialização
   gestor_de_erros();
 }
}
 

6.2 Transmissão e Recepção via Polling (Cenários Simples)

Ideal para quando a latência não é crítica e o fluxo de dados é baixo.


// Função para transmitir uma string
uint8_t buffer_envio[] = "Ola UART!\r\n";
HAL_UART_Transmit(&huart1, buffer_envio, sizeof(buffer_envio) - 1, 100); // Timeout de 100ms

// Função para receber 1 byte via polling
uint8_t byte_recebido;
if(HAL_UART_Receive(&huart1, &byte_recebido, 1, 500) == HAL_OK) {
 // Dados recebidos com sucesso, processar 'byte_recebido'
}
 

6.3 Recepção via Interrupção (Cenários com Alto Volume de Dados ou Tempo Real)

Permite que o microcontrolador execute outras tarefas enquanto aguarda dados. A interrupção é acionada a cada byte recebido.


// Habilitar a recepção por interrupção (chamar após a inicialização)
uint8_t dado_uart;
HAL_UART_Receive_IT(&huart1, &dado_uart, 1);

// Callback de interrupção de recepção
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
 if(huart->Instance == USART1) {
   // Processar o byte recebido em 'dado_uart'
   // ...

   // Reativar a interrupção para o próximo byte
   HAL_UART_Receive_IT(&huart1, &dado_uart, 1);
 }
}
 

Solução de Problemas Comuns

7.1 Dados Corrompidos (Ruído)

  • Causas Possíveis: Taxa de baud incompatível, dessincronização de clock, níveis de tensão incorretos, formato de quadro inválido.
  • Passos de Verificação: Confirme a taxa de baud, bits de dados, paridade e bits de parada em ambos os dispositivos. Verifique a conexão de terra comum (GND). Certifique-se de que os conversores de nível de tensão estejam funcionando corretamente.

7.2 Ausência de Comunicação

  • Causas Possíveis: Conexão TX/RX invertida, configuração incorreta de GPIO (modo de função alternativa), periférico serial não inicializado, falha de hardware.
  • Passos de Verificação: Inverta as conexões TX e RX. Verifique a configuração de multiplexação dos pinos GPIO. Confirme se o periférico serial foi inicializado corretamente. Meça a atividade na linha TX para verificar se há mudança de nível de tensão.

7.3 Perda de Pacotes ou Dados Incompletos

  • Causas Possíveis: Taxa de baud muito alta para o processamento, ausência de controle de fluxo, processamento de dados lento, alta interferência eletromagnética.
  • Passos de Verificação: Reduza a taxa de baud. Implemente controle de fluxo por hardware (RTS/CTS) se suportado. Utilize interrupções ou DMA para processamento mais rápido. Considere o uso de cabos blindados ou melhor aterramento.

7.4 Problemas no Modo Síncrono

  • Causas Possíveis: Linha de clock (SCLK) não conectada, configuração incorreta do flanco do clock, modo mestre/escravo invertido.
  • Passos de Verificação: Verifique a conexão da linha SCLK. Confirme se ambos os dispositivos estão configurados para o mesmo flanco de clock (subida ou descida). Certifique-se de que o dispositivo mestre e escravo foram designados corretamente.

Cenários de Aplicação: Onde Encontramos UART/USART

  • Depuração e Logs: Saída de mensagens de log de microcontroladores e depuração de código (uso mais comum).
  • Comunicação com Módulos: Módulos Bluetooth (HC-05), WiFi (ESP-01), GPS, LoRa, 4G.
  • Sensores: Sensores de temperatura e umidade (DHT11), sensores de pressão, giroscópios, instrumentos industriais.
  • Interconexão de Dispositivos: Comunicação entre microcontroladores, entre microcontroladores e PCs, e redes de microcontroladores via serial.
  • Barramentos Industriais: Protocolos como Modbus sobre RS-485, barramento LIN (eletrônicos automotivos).

Tags: UART USART Comunicação Serial protocolos embarcados STM32

Publicado em 6-20 04:48