Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 

Repository files navigation

🔌 Testador Automático de Protocolo UART

Firmware Arduino com protocolo serial customizado (frame com header, payload e checksum CRC8) e suite de testes automatizados em Python — simula uma ferramenta de validação de hardware embarcado.

Status Linguagem Plataforma Testes


📌 O que é este projeto

Implementação de um protocolo de comunicação serial customizado entre Arduino (firmware em C) e um computador (script Python). O Arduino responde a comandos enviados pelo PC com dados estruturados em frames validados por checksum. Um script de testes automatizados valida o comportamento do firmware para diferentes cenários — incluindo casos de falha.

Por que isso importa em sistemas embarcados industriais? Ferramentas de teste automatizado são parte essencial do desenvolvimento de hardware em ambientes como defesa e aeroespacial. Validar o protocolo de comunicação de um dispositivo embarcado antes de integrá-lo ao sistema maior reduz custo e tempo de depuração. Este projeto simula exatamente esse fluxo de trabalho.


🎯 Objetivos de aprendizado

  • Projetar um protocolo serial com estrutura de frame robusta (header + payload + CRC8)
  • Implementar CRC8 em C puro para validação de integridade de dados
  • Desenvolver script Python com pyserial para comunicação serial automatizada
  • Criar suite de testes com pytest cobrindo casos normais e de falha
  • Adicionar geração de relatório de testes em JSON

🛠️ Hardware e ferramentas

Componente / Ferramenta Descrição
Arduino Uno Firmware do dispositivo sob teste
Python 3.x + pyserial Script de comunicação e controle
pytest Suite de testes automatizados
Cable USB Comunicação serial via porta COM/ttyUSB

📦 Estrutura do frame

┌────────┬────────┬─────────┬──────────────┬──────────┐
│ HEADER │  CMD   │   LEN   │   PAYLOAD    │  CRC8    │
│ 0xAA   │ 1 byte │ 1 byte  │  0–16 bytes  │  1 byte  │
└────────┴────────┴─────────┴──────────────┴──────────┘

HEADER  : byte de sincronismo fixo (0xAA)
CMD     : código do comando (ex: 0x01 = leitura de sensor)
LEN     : tamanho do payload em bytes
PAYLOAD : dados do comando
CRC8    : checksum calculado sobre CMD + LEN + PAYLOAD

📁 Estrutura do projeto

uart-protocol-tester/
├── firmware/
│   ├── main.ino        # Loop principal — recebe e responde frames
│   ├── protocol.h      # Definição do protocolo e constantes
│   ├── protocol.c      # Parser de frames e montagem de resposta
│   └── crc8.c          # Implementação CRC8 em C puro
├── host/
│   ├── serial_comm.py  # Classe de comunicação serial com pyserial
│   ├── protocol.py     # Encoder/decoder do protocolo em Python
│   └── test_firmware.py # Suite de testes com pytest
├── docs/
│   └── protocol_spec.md # Especificação completa do protocolo
└── README.md

🔬 Conceitos técnicos implementados

Checksum CRC8

O CRC8 (Cyclic Redundancy Check de 8 bits) detecta erros de transmissão serial. Cada byte do frame é processado por um polinômio gerador — qualquer alteração em qualquer bit resulta em um CRC diferente. Implementado em C sem lookup table para manter o código didático e auditável.

Protocolo com estado no firmware

O parser do firmware implementa uma máquina de estados finitos (FSM): IDLE → HEADER → CMD → LEN → PAYLOAD → CRC → PROCESS. Isso garante que frames incompletos ou corrompidos não travam o sistema — o firmware descarta e volta para IDLE em caso de erro.

Testes de regressão automatizados

A suite pytest valida o firmware em múltiplos cenários: resposta correta, timeout de resposta, frame com CRC inválido, payload fora do tamanho esperado e sequência de múltiplos comandos. Cada teste envia um frame real pela porta serial e verifica a resposta byte a byte.


▶️ Como rodar

Firmware

# Abra firmware/main.ino no Arduino IDE
# Selecione: Tools > Board > Arduino Uno
# Upload (Ctrl+U)

Suite de testes Python

# Instale as dependências
pip install pyserial pytest

# Execute todos os testes (substitua COM3 pela sua porta)
pytest host/test_firmware.py --port COM3 -v

Saída esperada dos testes

test_firmware.py::test_leitura_normal         PASSED
test_firmware.py::test_crc_invalido           PASSED
test_firmware.py::test_timeout_resposta       PASSED
test_firmware.py::test_payload_overflow       PASSED
test_firmware.py::test_sequencia_comandos     PASSED

5 passed in 3.21s

📖 O que aprendi

  • Projetar um protocolo de comunicação do zero exige pensar em todos os casos de falha — um frame corrompido não pode travar o firmware, só ser descartado
  • A FSM de parser é o mesmo padrão usado em protocolos industriais como Modbus RTU e DNP3, que aparecem em ambientes OT
  • Testar firmware com Python pela porta serial é uma técnica real usada em fábricas para validação de placas recém-produzidas (ICT — In-Circuit Test)
  • Separar o código de comunicação (serial_comm.py) dos testes (test_firmware.py) torna a suite reutilizável para outros projetos

🔗 Referências


👤 Autor

Bruno Silva Marsola LinkedIn GitHub

Estudante de ADS | Sistemas Embarcados & OT Security | Guarulhos, SP

About

Custom UART protocol with CRC8 checksum + automated test suite in Python/pytest

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors