CRC-16 moudbus 校验 C++实现
demo
点击查看代码
/*
* @Author: Dapenson
* @Date: 2022-03-11 10:33:22
* @LastEditors: Dapenson
* @LastEditTime: 2022-03-11 10:53:04
* @FilePath: \C-WK\crc-16-moudbus.cpp
* @Description:
*
* Copyright (c) 2022 by Dapenson, All Rights Reserved.
*/
/*
CRC-16 / MODBUS :
1)CRC寄存器初始值为 FFFF;即16个字节全为1;
2)CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) ‘H’表示16进制数,‘B’表示二进制数
计算步骤为:
(1).预置 16 位寄存器为十六进制 FFFF(即全为 1) ,称此寄存器为 CRC 寄存器;
(2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄存器;
(3).检测相异或后的CRC寄存器的最低位,若最低位为1:CRC寄存器先右移1位,再与多项式A001H进行异或;若为0,则CRC寄存器右移1位,无需与多项式进行异或。
(4).重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全部进行了处理;
(5).重复步骤 2 到步骤4,进行下一个 8 位数据的处理;
(6).最后得到的 CRC 寄存器即为 CRC 码。
*/
#include <stdio.h>
unsigned short CRC16_MODBUS(unsigned char *Data, unsigned int DataLen)
{
unsigned short CRCin = 0xffff;
unsigned short CRCret = 0;
for (int i = 0; i < DataLen; i++)
{
CRCin = *Data ^ CRCin;
for (int j = 0; j < 8; j++)
{
if (CRCin & 0x01)
{
CRCin = CRCin >> 1;
CRCin = CRCin ^ 0xa001; // 0xa001是由0x8005高低位转换所得
}
else
{
CRCin = CRCin >> 1;
}
}
Data++;
}
CRCret = CRCin >> 8;
CRCret = CRCret | (CRCin << 8);
return CRCret;
}
int main(void)
{
// 01 06 00 01 03 e8 d8 b4
unsigned char buff[6] = {0x01, 0x06, 0x00, 0x01, 0x03, 0xe8};
unsigned short ret = 0;
ret = CRC16_MODBUS(buff, sizeof(buff));
printf("%x\n", ret);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)