Comprobación de CRC16/ModBus y método de implementación del lenguaje C

Tabla de contenido

1. ¿Qué es la suma de comprobación CRC16/Modbus?

2. Pasos de cálculo de la verificación CRC16/Modbus

3. Implementación en lenguaje C de verificación CRC16/Modbus


1. ¿Qué es la suma de comprobación CRC16/Modbus?

        La comprobación de CRC16/Modbus puede verificar la integridad de la trama de datos durante la comunicación del dispositivo, evitando así datos erróneos. Es ampliamente utilizado, principalmente en el protocolo de comunicación Modbus, etc. Existen muchos métodos de verificación similares, como la verificación de suma. Este artículo describe principalmente la verificación CRC16.

2. Pasos de cálculo de la verificación CRC16/Modbus

        Los pasos de cálculo de la verificación CRC16 son los siguientes:

        - Preseleccionar un registro de 16 bits con valor 0xFFFF, al que llamamos registro CRC.
        - Saque cada bit de datos a su vez y realice la operación XOR con los 8 bits inferiores del registro CRC y asigne el resultado al registro CRC.
                - Desplazar el valor en el registro CRC un bit a la derecha.
                - Determinar el bit desplazado, si es 0 continuar con el siguiente byte.
                - Si el bit desplazado es 1, XOR el registro CRC con 0xA001 y asigna el resultado al registro CRC.
                - Repita los pasos anteriores hasta que el desplazamiento a la derecha sea 8 veces, es decir, se procese un byte.
                - Repita el paso 2 para procesar cada byte.
        - Intercambie los bytes alto y bajo del registro CRC para obtener el código de verificación final.

3. Implementación en lenguaje C de verificación CRC16/Modbus

       El método de implementación en lenguaje c de la verificación CRC16/Modbus se divide en método de tabla de búsqueda y método de cálculo . El método de cálculo se basa en el principio de fórmulas básicas, que se pueden escribir cuando sea necesario, y se recomienda primero. Este artículo también proporcionará código de algoritmo.


uint8 reply[]={0xfe,0x01,0x04,0x00,0x00,0x01,0x00,0x4e,0xf5};
void crc()
{
    int cs = 0xffff;
    for (int i = 0; i < 7; i++)
    {
        cs ^= reply[i];
        for (int j = 0; j < 8; j++)
        {
            if (cs & 1 == 1)
            {
                cs >>= 1;
                cs ^= 0xa001;
            }
            else
            {
                cs >>= 1;
            }
        }
    }
    reply[7] = cs & 0xff; // 校验码的低字节
    reply[8] = (cs & 0xff00) >> 8; // 校验码的高字节
};

Supongo que te gusta

Origin blog.csdn.net/qq_39724355/article/details/130957487
Recomendado
Clasificación