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.
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.
- 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
| 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 |
┌────────┬────────┬─────────┬──────────────┬──────────┐
│ 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
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
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.
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.
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.
# Abra firmware/main.ino no Arduino IDE
# Selecione: Tools > Board > Arduino Uno
# Upload (Ctrl+U)# Instale as dependências
pip install pyserial pytest
# Execute todos os testes (substitua COM3 pela sua porta)
pytest host/test_firmware.py --port COM3 -vtest_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
- 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
- pyserial Documentation
- pytest Documentation
- CRC8 — conceito e implementação
- Modbus RTU — exemplo de protocolo industrial serial
Estudante de ADS | Sistemas Embarcados & OT Security | Guarulhos, SP