Autor Tema: Cálculo del CRC  (Leído 4175 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Cálculo del CRC
« en: 10 de Abril de 2016, 07:59:22 »
Estoy implementando un CRC para mi programa. Hice los siguientes cálculos en papel y me dan resultados correctos, pero al hacerlo en el PC me da un resultado erroneo.
Cálculos a mano:
- Patrón = 110101 => "K"
- Mensaje = 1010001101 =>"D"

1º paso: D * 2^5 = 101000110100000 => Le llamo "F"
2º paso: F / K => Resto = 01110 => "G"
3º paso: F + G = 101000110101110 => "H"
4º paso: H / K => Resto = 0 => CRC correcto

Cálculos en C:
 
Código: C
  1. unsigned int K,D,F,G,H,J;
  2.     K=0b110101; //Patrón
  3.     D=0b1010001101; //Mensaje
  4.     F=D*32;
  5.     G=F%K;
  6.     H=F+G;
  7.     J=H%K;

Aquí está el problema:
Al calcular el resto de G, tengo el mismo valor a mano que en el PC => 01110
En cambio, al calcular el resto de J, que tendría que ser 0, en el PC me da 11100.

¿Alguien sabe el motivo del error? Llevo toda la manaña intentando averiguarlo y no consigo nada.
Gracias de antemano!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cálculo del CRC
« Respuesta #1 en: 10 de Abril de 2016, 09:28:08 »
Calculado a mano:

Mensaje = 653d
Patron = 53d

F = Mensaje * 2⁵ =653 * 32 = 20896
G = F % Patron = 14
H = F + G = 20910
J = 28 = 0b11100

Asi que es correcto lo que da la PC. Nunca vi un CRC realizado con modulo y divisiones.

Hay Checksum muy simples que directamente sumas limitas tu valor a 8 bits por ejemplo y eso con el checksum (resta o suma) termina siendo 0.
CRC es un poco mas complejo, ya que hay muchos tipos de CRC, y el proceso nada que ver con lo que estas haciendo realmente.

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Cálculo del CRC
« Respuesta #2 en: 10 de Abril de 2016, 10:24:52 »
Calculado a mano:

Mensaje = 653d
Patron = 53d

F = Mensaje * 2⁵ =653 * 32 = 20896
G = F % Patron = 14
H = F + G = 20910
J = 28 = 0b11100

Asi que es correcto lo que da la PC. Nunca vi un CRC realizado con modulo y divisiones.

Hay Checksum muy simples que directamente sumas limitas tu valor a 8 bits por ejemplo y eso con el checksum (resta o suma) termina siendo 0.
CRC es un poco mas complejo, ya que hay muchos tipos de CRC, y el proceso nada que ver con lo que estas haciendo realmente.

Este CRC lo saqué del libro "Comunicaciones y Redes de Computadores" de Stallings.
¿Checksum es más fácil? Necesito que sea de 8 bits, y estuve leyendo pero no encuentro nada que me funcione...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cálculo del CRC
« Respuesta #3 en: 10 de Abril de 2016, 11:54:51 »
Primero que si vas a aplicar un checksum o un CRC es por que lo vas a hacer en un stream de datos, es decir varios datos. Si vas a hacerlo unicamente por 1 dato no vale la pena computacionalmente. Y tal ves conviene mas una deteccion de paridad para detectar errores o de ultima algun codigo detector/corrector de errores ( Hamming )

Lo mas facil como te decia es un checksum ( suma de comprobacion ). Si lo que envias esta dividido en datos de 8 bits que seria lo mas comun, por ejemplo cada 5 datos podrias enviar lo que es el checksum.

Este es muy facil de realizar.

Supongamos que tenes 5 datos: 0x12 , 0x59 , 0xA5, 0x8B , 0xFF y tenes que generar el checksum para enviarlo. Lo que haces es sumar todo y luego recortarlo a 8 bits. O directamente sumar en variables de 8 bits, total solo se va a recortar

0x12 + 0x59 + 0xA5 + 0x8B + 0xFF = 0x29A

Recortado de 8 bits es 0x9A, entonces envias ese Checksum cada 5 bytes.  Sumas los 5 y comparas con el checksum, si hay algun error significa que no son iguales. En este caso implica comparacion.

Otro metodo que podes encontrar es enviar el complemento a 2 de la suma que te dio de los 5 bytes y enviar eso, es decir 0xFF - 0x9A + 1 = 0x66

De esa forma al sumar todo, los 5 bytes + ese ultimo checksum 0x29A + 0x66 = 0x300 , recortado a 8 bits es 0x00.

Es decir que en este ultimo caso que se envia el complemento para que no posea errores la suma de los 6 bytes ( 5 de informacion + 1 suma de comprobacion) te debe dar 0

---------------------------------------------

Tal ves estamos confundiendo division. Ya que la mayoria de los codigos CRC que vi estan realizados con XOR

Código: C
  1. VP_CRCTableValue = (VP_CRCTableValue << 8) ^ F_CRC_ObtenValorDeTabla(((uint8_t)((VP_CRCTableValue >> (WIDTH - 8)) & 0xFF)) ^ AF_Datos[VP_bytes]);

Tal ves esto te sirva:

http://ww1.microchip.com/downloads/en/AppNotes/01148a.pdf
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00068118.pdf
« Última modificación: 10 de Abril de 2016, 13:41:11 por KILLERJC »


 

anything