Uma maneira de converter fluxo de bytes de fluxo de pacotes em C89 em um dispositivo incorporado [fechado]

StackOverflow https://stackoverflow.com/questions/815029

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu estou trabalhando com um dispositivo embutido que está conectado ao PC usando RS232 (RS232 sobre USB).

Estou pensando em desenvolver o meu próprio protocolo:

<MAGIC><LENGTH><BINARY DATA><CRC>

mas eu não quero reinventar a roda.

Por favor, Nota que: Estou pensando dispositivo sobre bastante restrito:. 4KB de RAM, nenhum kernel, nem lib C padrão

Você pode pensar em uma maneira padrão de fazer isso (biblioteca talvez open source)?

Se você codificar sua própria solução não tem nenhum melhores práticas?

  • Você usa MAGIC bytes também no final de pacotes?
  • Talvez seja melhor usar intervalos de tempo em vez de delimitadores?
  • Como você encontrar o início de pacotes em um fluxo de dados binários?
  • Talvez seja melhor para protocolos de uso de texto?

UPDATE: Por favor, re ler a pergunta. Eu não deveria pedir biblioteca, mas para boas práticas.

Foi útil?

Solução

Consulte esta resposta que dei a uma pergunta muito semelhante sobre detalhes de um protocolo simples.

Para responder à sua pontos específicos:

  1. "Magic" bytes no final de pacotes não fazer nenhum mal, mas eles são redundantes se você já sabe quanto tempo o pacote é suposto ser, e ter um CRC.
  2. Pode ser sensato vezes tempo limite especificar, por isso, se há diferença de uma muito grande entre os bytes dentro de um pacote, então um erro é sinalizado. Tendo usado Modbus , não estou convencido do valor do uso de delimitadores baseados no tempo em outro lugar.
  3. Você quer dizer, "como é que você encontrar o início de pacotes em um fluxo de dados binários"? Se assim for, talvez especificar uma distância mínima entre os pacotes, e / ou exigir que o destinatário acknolwedge depois de cada pacote.
  4. torna mais fácil para depuração, e não exige nenhum software especial no PC, mas não muito eficiente. Claro, se a usabilidade é mais importante do que a eficiência, do que um sistema baseado em texto é inteiramente apropriado.

Outras dicas

Para algo assim pelo tempo que você obter uma solução existente para o trabalho no seu dispositivo, teria sido mais fácil apenas para reinventar a roda.

void buffer_packet(unsigned char rx_byte)
{
    static unsigned char byte_count = 0;
    static unsigned char packet[8];

    packet[byte_count++] = rx_byte;
    if (byte_count == 8)
    {
        unsigned char crc = calculate_crc(packet, 8);

        write_uart(0x55);
        write_uart(8);
        while (byte_count--)
        {
            write_uart(packet[7 - byte_count]);
        }
        write_uart(crc);
    }
}

Ou talvez eu estou subestimando o seu problema. Se você está procurando como gerar o RS232 pedaços olhar em seu microcontroladores folha de dados.

Sobre a única coisa que existe para além do seu I / primitivas S vai ser o cálculo CRC. Há um artigo bacana, com código, aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top