Transformando bits no barramento em bytes no seu buffer
Quando você coloca um analisador lógico numa linha UART, SPI, I²C ou CAN, a captura vem medida em bits. O firmware, porém, trabalha em bytes: um buffer de recepção de 64 posições, um mapa de 12 registradores, um campo de dados limitado a 8 bytes. Toda vez que você troca de visão está dividindo por oito, e fazer essa conta de cabeça às três da manhã, com um quadro falhando na soma de verificação, é assim que erro de contagem por uma unidade acaba entrando em produção.
bytes = bits ÷ 8 (o mesmo que bits × 0,125). Um quadro CAN 2.0A de 108 bits dá 108 ÷ 8 = 13,5 bytes de tempo bruto de linha — e apenas 8 deles são a sua carga útil.A divisão é trivial. O que confunde é saber quais bits você acabou de contar. Um byte de dados da aplicação quase nunca ocupa exatamente oito tempos de bit num enlace físico, porque enquadramento, sincronismo e detecção de erro tomam espaço no mesmo fio.
Bits de linha e bits de carga útil
Larguras de registrador
Orçamento de tempo
Convertendo uma captura passo a passo
Conte os bits que você realmente quer
Decida antes se está contando os bits de carga útil ou todos os bits que o analisador viu. Para um byte UART em 8N1 são 8 e 10, respectivamente — duas respostas diferentes para a mesma pergunta.
Digite a contagem de bits
Coloque o número no campo de bits. O valor em bytes acompanha a digitação, então dá para percorrer o detalhamento de um quadro inteiro sem apertar nada. Exportações longas de decodificador costumam vir com espaços ou vírgula decimal — os dois são aceitos e os espaços são ignorados.
Copie o número direto para o código
O botão de copiar de cada campo devolve o número puro, sem unidade e sem separadores, que é justamente o que você quer quando o valor vai para um #define, um tamanho de buffer ou uma verificação de teste.
Inverta o sentido quando voltar para a bancada
Use o botão de inverter unidades para partir de bytes e chegar a bits — útil quando você sabe que a carga útil tem 32 bytes e precisa dos tempos de bit que ela vai ocupar. Os dois menus de unidade têm busca, então também dá para pular para kilobits ou bytes por segundo sem sair da página.
Sobrecarga do enquadramento UART: da taxa em baud aos bytes úteis por segundo
A configuração clássica 8N1 embrulha cada byte de dados em um bit de início e um de parada, então dez tempos de bit carregam oito bits de carga útil — um imposto fixo de 25 %. É por isso que a estimativa ingênua de "dividir a taxa em baud por oito" sempre exagera o que o enlace consegue entregar.
| Taxa em baud (bit/s) | Conta ingênua: bits ÷ 8 | Carga útil real (8N1, 10 bits/byte) | Tempo de um byte |
|---|---|---|---|
| 9.600 | 1.200 B/s | 960 B/s | 1.042 µs |
| 19.200 | 2.400 B/s | 1.920 B/s | 521 µs |
| 38.400 | 4.800 B/s | 3.840 B/s | 260 µs |
| 57.600 | 7.200 B/s | 5.760 B/s | 174 µs |
| 115.200 | 14.400 B/s | 11.520 B/s | 86,8 µs |
| 921.600 | 115.200 B/s | 92.160 B/s | 10,9 µs |
Acrescente um bit de paridade e o quadro passa a onze tempos de bit, derrubando 9.600 baud para algo próximo de 873 bytes úteis por segundo. Dois bits de parada custam mais uma posição. Nada disso muda a aritmética do ÷8 — muda quantos bits você deve jogar nela.
Os dois campos acompanham a comparação entre quadros
Digite em qualquer uma das caixas e a outra responde na hora, então você segura o número da carga útil de um lado e o do tempo de linha do outro sem redigitar nada.
Saída legível para rajadas longas
Os milhares saem separados por espaço e capturas muito grandes passam para notação científica, o que mantém um traço de milhões de bits legível em vez de virar um paredão de dígitos.
Todas as unidades do barramento em um menu
Os menus de unidade com busca cobrem bits, kilobits, bytes e unidades de taxa por segundo, então um número de CAN, SPI ou UART pode ser reexpresso sem procurar outra página.
Nada sai da bancada
Toda a aritmética roda no navegador depois que a página carrega, então números tirados da captura de um cliente nunca são transmitidos para lugar nenhum.
Dúvidas sobre protocolos seriais
Por que um enlace de 9.600 baud move 960 bytes por segundo, e não 1.200?
Porque o baud conta símbolos no fio, não bits de carga útil. Numa UART binária comum um símbolo é um bit, então 9.600 baud são 9.600 tempos de bit por segundo — mas dez desses tempos são consumidos por byte de dados no enquadramento 8N1. Dividir por 8 dá os teóricos 1.200 B/s que você veria se a linha carregasse só dados; dividir por 10 dá os 960 B/s que a sua aplicação de fato recebe.
O que os bits de início, de parada e de paridade acrescentam à contagem?
O bit de início é uma borda de descida que manda o receptor começar a amostrar; o bit de parada mantém a linha em repouso o suficiente para que a próxima borda de início não seja ambígua. Nenhum dos dois carrega informação. A paridade, quando ativada, acrescenta um nono bit junto aos dados apenas para detectar erro de um bit. Assim, um quadro 8E1 tem 11 tempos de bit — 1,375 equivalentes de byte de tempo de linha para um byte de carga útil.
A ordem MSB primeiro ou LSB primeiro muda quantos bytes eu obtenho?
Não — a contagem é idêntica dos dois jeitos, só o valor montado muda. A UART desloca LSB primeiro, enquanto SPI e I²C convencionalmente deslocam MSB primeiro. Trocar um pelo outro produz bytes com os bits invertidos que ocupam exatamente o mesmo número de tempos de bit, e é justamente por isso que o sintoma parece dado corrompido, e não diferença de comprimento.
Como os bits de preenchimento do CAN mudam a relação entre bits e bytes?
O CAN insere um bit complementar depois de cinco bits iguais seguidos para que os receptores mantenham o sincronismo de relógio. Um quadro padrão com identificador de 11 bits e carga útil completa de 8 bytes tem 108 bits antes do preenchimento e pode chegar a cerca de 135 bits no pior caso. Esses bits extras são puro tempo de linha: a sua carga útil continua com 8 bytes por mais bits de preenchimento que o transceptor tenha injetado.
Meu decodificador exporta o tamanho da rajada em bits — como comparo isso com o buffer de recepção?
Divida o número exportado pelo tamanho do quadro, não por oito, e compare essa contagem de bytes com a profundidade do buffer. Uma rajada de 12.000 bits em 8N1 são 1.200 quadros, ou seja, precisa de 1.200 bytes de espaço; o valor bruto 12.000 ÷ 8 = 1.500 descreve a ocupação da linha. Jogar o número errado num cálculo de dimensionamento de FIFO é causa comum de falsos avisos de estouro.
Ainda não há comentários. Seja o primeiro a comentar!