CRC-16/MODBUS 校验位计算

实验指令: 前23位表示 信息头 + 信息内容。24,25位是待计算的校验位。26位是结束码

7E 01 00 00 01 10 02 00 27 00 0C 00 02 00 00 00 00 00 50 00 3C 00 03 90 0B 0D

在线计算

这里写图片描述

代码实现

#include <stdio.h>
#include <Windows.h>

UINT8 data[23] = { 0x7E, 0x01, 0x00, 0x00, 0x01, 0x10, 0x02, 0x00, 
                    0x27, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 
                    0x00, 0x00, 0x50, 0x00, 0x3C, 0x00, 0x03 };

/*
* 函数名 :CRC16
* 描述 : 计算CRC16
* 输入 : ptr---数据,len---长度
* 输出 : 校验值
*/
UINT16 CRC16(UINT8 *ptr, UINT16 len)
{
    unsigned char i;
    unsigned short crc = 0xFFFF;
    if (len == 0) {
        len = 1;
    }
    while (len--) {
        crc ^= *ptr;
        for (i = 0; i<8; i++)
        {
            if (crc & 1) {
                crc >>= 1;
                crc ^= 0xA001;
            } else {
                crc >>= 1;
            }
        }
        ptr++;
    }
    return(crc);
}

int main()
{
    printf("%04x\n", CRC16(data, 23));
    getchar();
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/wanyongtai/article/details/79472882