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; +}