2009-05-02 5 views
11

Estoy trabajando con un dispositivo integrado que está conectado a la PC usando rs232 (rs232 sobre USB).Una forma de convertir la secuencia de bytes a la transmisión de paquetes en C89 en un dispositivo incrustado

estoy pensando en el desarrollo de mi propio protocolo:

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

pero no quiero reinventar la rueda.

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

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

Si codifica su propia solución, ¿tiene alguna de las mejores prácticas?

  • ¿Utiliza también los bytes MAGIC al final de los paquetes?
  • ¿Tal vez es mejor utilizar intervalos de tiempo en lugar de delimitadores?
  • ¿Cómo se encuentra el comienzo de los paquetes en una secuencia de datos binarios?
  • ¿Tal vez sea mejor utilizar los protocolos de texto?

ACTUALIZACIÓN: Por favor, vuelva a leer la pregunta. No debería pedir una biblioteca sino buenas prácticas.

+0

Similar a: http://stackoverflow.com/questions/815758/ –

+0

En caso de que el tercer punto sea: "¿cómo se encuentra el comienzo de los paquetes en una secuencia de datos binarios"? –

+0

Gracias Steve :) –

Respuesta

3

Consulte this answer I gave to a very similar question con respecto a los detalles de un protocolo simple.

para responder a sus puntos específicos:

  1. bytes "Magic" al final de los paquetes no hacer ningún daño, pero son redundantes si ya sabe cuánto tiempo se supone que el paquete sea y tener un CRC
  2. Puede ser útil especificar los tiempos de espera, por lo que si hay una brecha demasiado grande entre los bytes dentro de un paquete, se marca un error. Después de haber usado Modbus, no estoy convencido del valor de usar delimitadores basados ​​en tiempo en otro lugar.
  3. ¿Quiere decir, "cómo se encuentra el comienzo de los paquetes en una secuencia de datos binarios"? Si es así, quizás especifique un espacio mínimo entre paquetes, y/o solicite al destinatario que acknolwedge 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, entonces un sistema basado en texto es completamente apropiado.
+0

El enlace que proporcionó responde mi pregunta sobre el comienzo de los paquetes. La lectura del encuadre asincrónico de HDLC fue muy útil. –

+0

No mencioné un punto: incluso si el byte anterior tiene un error de encuadre debido a ruido de línea, el byte sigue un valor de byte de $ 00, $ 80, $ C0, $ F0, $ F8, $ FC, $ FE, o $ FF siempre se recibirán correctamente. Si los paquetes se enviarán hacia atrás sin acuse de recibo (para permitir el rendimiento máximo, con suerte el ack del primer paquete llegará mientras se está transmitiendo el segundo paquete), puede ser útil finalizar cada paquete con uno de esos valores de byte, de modo que un encuadre el error en un paquete no dañará el siguiente. – supercat

0

Acerca de lo único que hay más allá de sus primitivas de E/S va a ser el cálculo de CRC. Hay un artículo ingenioso, con código, here.

+0

El artículo se ve bien :). Gracias. Pero el CRC no es el problema ya que ya lo hemos implementado para la transmisión de RF. –

3

Para algo como esto, cuando 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 su problema. Si está buscando cómo generar los bits RS232, busque en la hoja de datos de sus microcontroladores.

+0

No formulé mi pregunta con la suficiente claridad. La tarea parece fácil, pero soy bastante nuevo en la programación integrada, así que estoy interesado en las mejores prácticas. –

Cuestiones relacionadas