From 1bb9ad8936837ddc8c4b0f9d86f3247e9aa95e57 Mon Sep 17 00:00:00 2001 From: zcn1123 <2363211205@qq.com> Date: Wed, 2 Sep 2020 19:22:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90CRC-16=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modbus_RTU_Salve/common.cpp | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Modbus_communication/Modbus_RTU_Salve/common.cpp b/Modbus_communication/Modbus_RTU_Salve/common.cpp index 190b463..bca07f6 100644 --- a/Modbus_communication/Modbus_RTU_Salve/common.cpp +++ b/Modbus_communication/Modbus_RTU_Salve/common.cpp @@ -324,5 +324,37 @@ unsigned int Count_Read_date_number(int Function_code, unsigned int Operations_N } - +/********************************************************************************************* +* 功能     :  计算CRC校验 +* 描述    : 获取Modbus—CRC-16的校验数据 +* 输入 : *Data 计算校验数据 CRC_Len 数据长度 +* 返回值 : Ret_CRC_date CRC校验结果 +**********************************************************************************************/ +UINT16 CRC_16(UINT8 *Data, unsigned int CRC_Len) +{ + UINT16 CRC_date = 0XFFFF;//16位crc寄存器预置 + UINT16 temp; + unsigned int i = 0, j = 0; + for (i = 0; i < CRC_Len; i++) + { + temp = *Data & 0X00FF;//将八位数据与CRC寄存器亦或 + Data++; + CRC_date ^= temp; + for (j = 0; j < 8; j++) + { + if (CRC_date & 0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。 + { + CRC_date >>= 1; + CRC_date ^= 0XA001; + } + else + { + CRC_date >>= 1; + } + } + } + UINT16 Ret_CRC_date = CRC_date >> 8; + Ret_CRC_date = Ret_CRC_date | CRC_date << 8; + return Ret_CRC_date; +}