[ ARTIGO / ENGENHARIA REVERSA PARCIAL / RS485 / BMS ]

ENTRE O GREENWAY
E O BMS

Uma solicitação de garantia levou a um conversor USB-RS485 comum, a um sniffer passivo e ao mapeamento experimental de frames, checksum e comandos de uma bateria de motocicleta elétrica.

REGISTRO29 / 09 / 2026
CAMADA FÍSICARS485 / 9600 BAUD
ESTADOMAPEAMENTO PARCIAL
Visão editorial da investigação: comunicação RS485 entre software e BMS, leitura de frames, correlação de parâmetros e validação por checksum.

Era preciso coletar dados para uma solicitação de garantia.

Recebi uma bateria de motocicleta elétrica com a tarefa de extrair informações que pudessem acompanhar uma análise de garantia. O procedimento do fabricante previa uma ferramenta de comunicação específica, mas nós tínhamos apenas o software de diagnóstico Greenway.

O manual e a interface da bateria indicavam RS485. A pergunta inicial era simples: o adaptador oficial fazia apenas a conversão elétrica ou também traduzia mensagens, executava algum handshake ou encapsulava um protocolo intermediário?

[ TESTE INICIAL ]

Um conversor USB-RS485 comum foi conectado ao barramento. No equipamento analisado, o software Greenway comunicou diretamente com o BMS e exibiu seus parâmetros.

Com isso, o problema prático estava resolvido: tensão, corrente, SOC, SOH, capacidades, células, temperaturas e histórico de falhas puderam ser consultados e encaminhados ao fabricante. O que veio depois já era curiosidade técnica.

Um segundo transceptor entrou apenas para observar.

Com o Greenway operando pelo primeiro conversor, um segundo transceptor RS485 foi colocado em paralelo ao barramento e ligado a outra porta USB. Ele não participava da conversa: servia como ponto de observação dos bytes trocados entre computador e BMS.

GREENWAYconsulta e apresenta os dados
↔
USB-RS485interface ativa
↔
BMSresponde às consultas
└── RS485 EM PARALELO ──→
SNIFFERsomente observação
CAPTURA→GUI→ENDIANESS→CÁLCULO→CORRELAÇÃO
Captura crua usada durante o mapeamento. Entre os frames observados existe uma resposta de identificação em hexadecimal; o payload não é transcrito nem disponibilizado como dump.

A análise não partiu de uma documentação oficial do protocolo. Ela cruzou frames, valores simultâneos da interface, conversões numéricas e repetição de testes. Inteligência artificial foi usada como apoio para procurar padrões, não como substituta da validação experimental.

Dois marcadores, comandos de 16 bits e um SUM8.

As solicitações observadas começavam em 46 16; as respostas, em 47 16. Depois vinham o comando de 16 bits, o comprimento, o payload quando existente e um checksum de um byte.

REQUEST46 16 [CMD_H] [CMD_L] [LEN] [DATA…] [SUM8]
RESPONSE47 16 [CMD_H] [CMD_L] [LEN] [DATA…] [SUM8]

O checksum

O valor final corresponde à soma de todos os bytes anteriores, reduzida aos oito bits menos significativos:

checksum = sum(bytes) & 0xFF

46 + 16 + 01 + 09 + 04 = 6A
46 16 01 09 04 6A
[ CONFIRMADO POR CORRELAÇÃO ]

O mesmo cálculo validou frames de comandos diferentes. Mais tarde, ele também revelou que uma ferramenta de captura estava omitindo um byte.

RS485 descrevia a camada física, não o protocolo.

O uso de RS485 não transforma automaticamente uma comunicação em Modbus RTU. O protocolo observado não usava o enquadramento, funções e endereçamento de registradores característicos do Modbus.

PROTOCOLO OBSERVADO
  • Marcadores 46 16 e 47 16
  • Comandos proprietários de 16 bits
  • Comprimento explícito
  • Checksum SUM8 de um byte
MODBUS RTU
  • Endereço do slave
  • Código de função
  • Registradores e quantidade
  • CRC-16

O resultado foi uma comunicação binária proprietária transportada por RS485 a 9600 baud.

Os bytes começaram a coincidir com a tela.

O comando 0x0109 retornava quatro bytes interpretados como inteiro sem sinal little-endian. O payload 12 30 01 00 se torna 0x00013012, ou 77842 mV. O mesmo método aplicado a 0x010A interpretou EC FF FF FF como inteiro sinalizado de −20 mA.

12 30 01 00→0x00013012→77842 mV
A comparação entre interpretações mostrou que UINT32 little-endian reproduzia a tensão exibida pelo Greenway.

A ferramenta visual usada nessa conferência foi o Online Hex Converter da SCADACore ↗. Ela auxiliou a leitura, mas a confirmação veio da coincidência repetida entre payload e GUI.

O checksum encontrou um erro na própria captura.

Um frame aparecia repetidamente como 46 16 01 04 6E. Pela estrutura já conhecida, faltava o segundo byte do comando. A soma indicava exatamente qual:

COMO APARECIA46 16 01 __ 04 6E
BYTE INFERIDO46 + 16 + 01 + 0D + 04 = 6E
FRAME RECONSTRUÍDO46 16 01 0D 04 6E

A resposta reconstruída era 47 16 01 0D 04 4E 00 00 00 BD. O payload little-endian resultava em 78, exatamente o SOC mostrado na interface.

Para testar a hipótese, foi transmitida uma sequência controlada contendo todos os valores de 0x00 a 0xFF entre dois transceptores. O 0x0D desapareceu no caminho de visualização. Como esse byte corresponde a Carriage Return, o defeito estava na cadeia de captura, não no protocolo Greenway.

Teste controlado entre dois transceptores: a sequência de 0x00 a 0xFF confirmou que o byte 0x0D desaparecia na cadeia de visualização utilizada.
[ INVESTIGAÇÃO DENTRO DA INVESTIGAÇÃO ]

O checksum deixou de ser apenas um teste de integridade dos frames e se tornou uma ferramenta para diagnosticar o próprio instrumento de observação.

Nem todo comando retornava um único número.

Células

0x0124 e 0x0125 retornavam arrays de 16 palavras little-endian, correspondentes às posições 1–16 e 17–32. A bateria observada usava 20 células em série; as posições posteriores apareciam zeradas.

Limites elétricos e térmicos

O payload de 14 bytes de 0x0126 pôde ser dividido em duas correntes INT32, duas tensões de célula UINT16 e duas temperaturas INT8. Os valores coincidiram com os limites mostrados na GUI.

Contadores de falha

0x0127 entregava 32 posições UINT16. A ordem foi comparada com a lista da interface e permitiu correlacionar vários índices, incluindo sobretensão de carga, dois níveis de sobredescarga, falha de soft start e falha do circuito de proteção de descarga. Valores 0xFFFF eram exibidos como zero ou campo não utilizado.

[ LIMITE DA CORRELAÇÃO ]

A correspondência de vários índices foi confirmada no caso observado. Isso não substitui documentação oficial nem garante que todas as versões de BMS usem exatamente a mesma tabela.

Alguns campos apareceram; a estrutura completa, não.

O bloco de 128 bytes de 0x0115 parecia consolidar estatísticas de vida útil. Capacidade, throughput, capacidade restante, ciclos e extremos de corrente, tensão e temperatura reapareciam em posições compatíveis, mas vários trechos continuavam sem interpretação.

Os comandos 0x0077 e 0x0178 também mostraram uma relação recorrente: o primeiro antecedia o segundo e o comprimento indicado parecia reaparecer na leitura seguinte.

46 16 00 77 05 02 A1 68 05 1E 06
47 16 00 77 00 D4

46 16 01 78 1E F3
47 16 01 78 1E [30 bytes] ...
[ FORTE HIPÓTESE ]

0x0077 pode selecionar ou configurar um objeto, endereço ou operação; 0x0178 parece ler o resultado. As capturas não demonstram que o primeiro comando faça escrita permanente no BMS.

O que foi confirmado — e o que continua aberto.

CommandLengthTypeUnitDescriptionConfidence
0x01004——Função ainda não determinadaUnknown
0x010832INT8 array°CSensores de temperatura; atribuição individual ainda parcialPartial
0x01094UINT32 LEmVTensão do packConfirmed
0x010A4INT32 LEmACorrente do packConfirmed
0x010D4UINT32 LE%SOCConfirmed
0x010E4UINT32 LE%SOHConfirmed
0x010F4UINT32 LEmAhCapacidade restanteConfirmed
0x01104UINT32 LEmAhCapacidade completaConfirmed
0x011442 × UINT16 LEmA / ?Corrente USB confirmada; segundo campo desconhecidoPartial
0x0115128mixed structmixedEstatísticas e acumuladores de vida útilPartial
0x011616——Função ainda não determinadaUnknown
0x01174UINT32 LEciclosContador de ciclosConfirmed
0x01184UINT32 LEmAhCapacidade de projetoConfirmed
0x01194UINT32 LEmVTensão de projetoConfirmed
0x011A8mixed / ASCII—Versões de software/hardware e IDXPartial
0x011B4date fields—Data de fabricação: YY MM DD xxConfirmed
0x011D6UINT8 array—RTC: YY MM DD hh mm ssConfirmed
0x011E4——Função ainda não determinadaUnknown
0x012016ASCII—FabricanteConfirmed
0x012132ASCII—Nome da bateriaConfirmed
0x012216ASCII—Nome/modelo da célulaConfirmed
0x012332ASCII—Número de série — payload não publicadoConfirmed
0x012432UINT16 LE arraymVTensões das células 1–16Confirmed
0x012532UINT16 LE arraymVTensões das células 17–32Confirmed
0x012614mixed structmixedLimites de corrente, tensão de célula e temperaturaConfirmed
0x012764UINT16 LE arraycontagens32 contadores de falhaPartial
0x01A3———Função ainda não determinadaUnknown
0x0077variável——Possível seleção/configuração de objeto ou operaçãoPartial
0x0178variávelbytes—Possível leitura associada ao comando 0x0077Partial

LE = little-endian. “Confirmed” significa correlação repetida com a interface; “Partial”, estrutura ou função reconhecida apenas em parte; “Unknown”, comando observado sem significado atribuído.

Capturar o barramento também capturou dados do equipamento.

  • O número de série real não é reproduzido neste artigo.
  • O dump bruto e a planilha de trabalho permanecem privados.
  • Capturas que continham o serial diretamente ou no payload ASCII foram excluídas.
  • Os significados apresentados são interpretações experimentais do equipamento observado.
  • Não houve tentativa de apresentar este mapa como documentação oficial da Greenway.

Os testes posteriores também não mostraram comunicação digital entre a bateria e o carregador analisado. Isso separa dois caminhos: Greenway ↔ BMS usava RS485; carregador ↔ bateria não apresentou comunicação digital observável naquele conjunto.

A motocicleta ainda é a parte que falta.

A comunicação entre bateria e motocicleta permanece para uma investigação futura. Ela pode revelar outro protocolo, sinais discretos ou apenas uma lógica de habilitação ainda não observada. Neste ponto, qualquer afirmação seria antecipada.

GREENWAY ↔ BMSCONFIRMADO / RS485CARREGADOR ↔ BATERIASEM COMUNICAÇÃO DIGITAL OBSERVADAMOTOCICLETA ↔ BATERIAPRÓXIMA INVESTIGAÇÃO
[ CHECKPOINT / MAPEAMENTO PARCIAL ]

O protocolo não foi “quebrado”. Ele começou a ser entendido.

O trabalho avançou porque cada interpretação permaneceu ligada a uma evidência: um frame, um cálculo, um valor simultâneo na GUI ou um teste controlado. A parte mais valiosa não foi produzir uma tabela pronta, mas registrar o caminho entre hipótese, captura, correlação e validação.