Autor Tema: Calculo CRC  (Leído 4354 veces)

Waldillo

  • Moderador
  • PIC16F
  • ******
  • Mensajes: 851
  • Casado con PIC infiel con ARM
    • El Rincon del Debug
Calculo CRC
« en: Noviembre 09, 2012, 05:51:47 am »
Buenas chicos,

Estoy tratando de calcular el CRC de un mensaje. Se a que se refiere y la practicidad de dicha cuestión la entiendo, pero la implementación no la entiendo. Alguien me la podría explicar?

Waldillo

  • Moderador
  • PIC16F
  • ******
  • Mensajes: 851
  • Casado con PIC infiel con ARM
    • El Rincon del Debug
Re: Calculo CRC
« Respuesta #1 en: Noviembre 09, 2012, 06:37:33 am »
El mensaje sería de 128bits. Podria partirlo en paquetes mas pequeños si fuese necesario.

el_vpi

  • Moderador
  • PIC18F
  • ******
  • Mensajes: 1348
Re: Calculo CRC
« Respuesta #2 en: Noviembre 09, 2012, 08:07:42 am »
Hola Waldillo, no me queda claro que no entendes de la implementacion.
Tenes varios metodos (CRC es un que tiene varias ramas en base a lo mismo) pero la implementacion es simple. Obtenes un byte o word en base a una funcion matematica aplicada y eso lo envias junto con el mensaje.
Despues sino te cierra la verificacion, dependiendo de la funcion podes corregir/verificar algunos datos.

saludos, Daniel.

Waldillo

  • Moderador
  • PIC16F
  • ******
  • Mensajes: 851
  • Casado con PIC infiel con ARM
    • El Rincon del Debug
Re: Calculo CRC
« Respuesta #3 en: Noviembre 09, 2012, 08:19:39 am »
Hola el_vpi, la razon de ser del CRC la comprendo, lo que no tengo claro es el fundamento teorico del calculo CRC. Se que se sostiene en calculo polinomial, pero no lo termino de ver claro. Lo que estoy buscando es una guia del calculo de un CRC para un mensaje de 128 bits.

Necesitaria verlo en un ejemplo de un mensaje de 8 bits para que me quedara claro y luego poder extrapolarlo a 128bits. No necesito codigo si no la explicacion teorica.

jukinch

  • Amigo de uControl
  • PIC12F
  • ******
  • Mensajes: 110
Re: Calculo CRC
« Respuesta #4 en: Noviembre 09, 2012, 09:39:49 am »
Hola el_vpi y Waldillo:
                      BrunoF escribió un tutorial muy bueno  :bang: sobre el tema en un foro amigo:
                      http://www.todopic.com.ar/foros/index.php?topic=25627.20
                            Saludos.
                                    Jukinch


Suky

  • **----- ^^ ------**
  • Moderador
  • dsPIC
  • ******
  • Mensajes: 5442
  • Con Qt...
    • micros-designs
Re: Calculo CRC
« Respuesta #5 en: Noviembre 09, 2012, 11:59:07 am »
Hola el_vpi y Waldillo:
                      BrunoF escribió un tutorial muy bueno  :bang: sobre el tema en un foro amigo:
                      http://www.todopic.com.ar/foros/index.php?topic=25627.20
                            Saludos.
                                    Jukinch



+1... Con eso tienes que solucionar tus problemas, además tenes librería en C y ASM  :bang:

Waldillo

  • Moderador
  • PIC16F
  • ******
  • Mensajes: 851
  • Casado con PIC infiel con ARM
    • El Rincon del Debug
Re: Calculo CRC
« Respuesta #6 en: Noviembre 12, 2012, 05:09:20 am »
Gracias chicos es siempre un placer contar con vuestra inestimable ayuda. A continuación os copio la función C que he conseguido. Funciona correctamente por que he utilizado la siguiente página web para comprobarlo.

http://www.lammertbies.nl/comm/info/crc-calculation.html

Codigo CRC16:

/*  \breif  CRC table  Polin= 0x8005  */
const uint16_t crc_16_table[16] =
{
  0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
  0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
};

/******************************************************************************
 * FUNCTION NAME:   CUInt16 CRC16_CalcByTable( CUInt8 *ptucData, CUInt16 usLength)
 *****************************************************************************/
/**\brief   Calculates CRC-16 using table.    Polin= 0x8005,  Init val= 0,  
 * \param    ptucData    [input] pointer to data
 * \param   usLength    [input]  Data length in bytes
 * \param    u16InitCRC [input]  Inital value  
 * \return   The CRC result   
  *****************************************************************************/
uint16_t CRCCalcByTableCRC16(uint8_t *p, uint32_t n, uint16_t u16InitCRC) {

   uint16_t crc = u16InitCRC;
   uint16_t r;

   /* while there is more data to process */
   while (n-- > 0)
   {
      /* compute checksum of lower four bits of *p */
      r = crc_16_table[crc & 0xF];
      crc = (crc >> 4) & 0x0FFF;
      crc = crc ^ r ^ crc_16_table[*p & 0xF];
      
      /* now compute checksum of upper four bits of *p */
      r = crc_16_table[crc & 0xF];
      crc = (crc >> 4) & 0x0FFF;
      crc = crc ^ r ^ crc_16_table[(*p >> 4) & 0xF];
      
      /* next... */
      p++;
   }

   return crc;
   
}
« Última modificación: Noviembre 12, 2012, 05:11:50 am por Waldillo »

 

anything