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):
- Estado Ocioso: A linha TX permanece em nível alto (lógico 1) por padrão, indicando ausência de transmissão.
- 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.
- 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.
- 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.
- 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:
- Nível TTL (3.3V/5V): Padrão para comunicação dentro de placas, microcontroladores, sensores e módulos (3.3V é o mais prevalente).
- 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.
- 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.
- Conexão: TX, RX, SCLK, GND (4 fios).
- 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.
- Vantagens: Velocidades de transmissão significativamente mais altas (na faixa de Mbps), sincronização precisa, maior estabilidade em longas distâncias.
- 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).