es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aclaración acerca del cálculo de CRC16.

Estoy tratando de calcular CRC por primera vez. He leído algunas páginas que explican qué es el CRC y cómo calcularlo. Principalmente esto: https://www.fatalerrors.org/a/implementation-of-crc-checksum-c-crc16-as-an-example.html

Tengo un código que calcula CRC16

uint16_t CalCrc(uint16_t crc_initial, uint8_t* buf, uint16_t len, uint16_t POLY)
{
    unsigned int byte;
    unsigned char k;
    unsigned short ACC, TOPBIT;
    unsigned short remainder = crc_initial;
    TOPBIT = 0x8000;
    for (byte = 0; byte < len; ++byte)
    {
        ACC = buf[byte];
        remainder ^= ACC;
        printf("new remainder = %u \n", remainder);
        for (k = 8; k > 0; --k)
        {
            if (remainder & TOPBIT)
            {
                remainder = remainder << 1;
                remainder = remainder ^ POLY;
            }
            else
            {
                remainder = (remainder << 1);
            }
        }
    }
    remainder = remainder ^ 0x0000;
    printf("result remainder = %02X \n", remainder);
    return remainder;
}

y lo llamo en mi main.c:

    uint8_t crc_buf[5] = {0x05, 0x03, 0x04, 0x08, 0x04};
    CalCrc(0xffff, crc_buf, 5, 0x1021);

El resultado es:

result remainder = BDD5

Como puedes ver en mi llamada a la función, paso 0xffff como valor inicial del CRC y 0x1021 como polinomio.

Estoy tratando de confirmar si mi cálculo es correcto con algunos calculadores de CRC en línea como:

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
https://crccalc.com/

Según los valores iniciales y polinomiales que utilizo, el resultado debería ser:

Imagen

¿Alguien podría ayudarme a entender qué está mal aquí? Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que la salida de la función CalCrc no coincide con el valor CRC esperado, basado en los datos de entrada y el polinomio. Puede haber varias razones para esto, tales como:

    • Hay un error en la implementación de la función CalCrc. Algunas áreas posibles para revisar incluyen la inicialización de TOPBIT, las condiciones del bucle y las operaciones bit a bit utilizadas para calcular el CRC.
    • Hay un error en los datos de entrada o en los valores del polinomio utilizados por la función CalCrc. Asegúrese de que la matriz de bytes crc_buf contenga los bytes correctos en el orden correcto, y que el valor del polinomio sea el mismo que el utilizado por las calculadoras de CRC en línea.
    • Puede haber una diferencia en la interpretación del resultado CRC entre la función CalCrc y las calculadoras en línea. Algunas calculadoras pueden mostrar el resultado CRC en un formato diferente o con un endianness diferente que la función, así que asegúrese de comparar manzanas con manzanas.

    Para solucionar este problema más a fondo, podría intentar modificar los datos de entrada o los valores del polinomio y ver si el resultado del CRC cambia como se espera. También podría intentar utilizar una implementación o calculadora de CRC diferente y comparar los resultados para ver si están de acuerdo. ¡Buena suerte!

Comments are closed.