Una forma de convertir un flujo de bytes en un flujo de paquetes en C89 en un dispositivo integrado [cerrado]

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy trabajando con un dispositivo integrado que está conectado a la PC mediante rs232 (rs232 a través de USB).

Estoy pensando en desarrollar mi propio protocolo:

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

pero no quiero reinventar la rueda.

Por favor nota eso:Estoy pensando en un dispositivo bastante restringido:4kb de RAM, sin kernel ni C lib estándar.

¿Puedes pensar en una forma estándar de hacer esto (tal vez una biblioteca de código abierto)?

Si codifica su propia solución, ¿tiene alguna práctica recomendada?

  • ¿Utiliza bytes MÁGICOS también al final de los paquetes?
  • ¿Quizás sea mejor utilizar intervalos de tiempo en lugar de delimitadores?
  • ¿Cómo se encuentra el comienzo de los paquetes en una secuencia de datos binarios?
  • ¿Quizás sea mejor utilizar protocolos de texto?

ACTUALIZAR:Por favor vuelva a leer la pregunta.No debería pedir biblioteca sino buenas prácticas.

¿Fue útil?

Solución

Ver esta respuesta la di a una pregunta muy similar sobre los detalles de un protocolo simple.

Para responder a sus puntos específicos:

  1. Los bytes "mágicos" al final de los paquetes no causan ningún daño, pero son redundantes si ya sabes cuánto tiempo debe durar el paquete y tienes un CRC.
  2. Puede ser sensato especificar tiempos de espera, de modo que si hay una brecha demasiado grande entre los bytes dentro de un paquete, se marca un error.habiendo usado Modbus, No estoy convencido del valor de utilizar delimitadores basados ​​en el tiempo en otros lugares.
  3. ¿Quiere decir "¿cómo se encuentra el comienzo de los paquetes en un flujo de datos binarios"?Si es así, tal vez especifique un espacio mínimo entre paquetes y/o solicite al destinatario que reconozca después de cada paquete.
  4. Facilita la depuración y no requiere ningún software especial en la PC, pero no es muy eficiente.Por supuesto, si la usabilidad es más importante que la eficiencia, un sistema basado en texto es totalmente apropiado.

Otros consejos

Para algo como esto en el momento en que obtenga una solución existente para trabajar en su dispositivo, hubiera sido más fácil reinventar la rueda.

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);
    }
}

O tal vez estoy subestimando tu problema. Si está buscando cómo generar los bits RS232, busque en la hoja de datos de sus microcontroladores.

Casi lo único más allá de sus primitivas de E / S será el cálculo de CRC. Hay un artículo ingenioso, con código, aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top