1、简介
CRC(循环冗余校验)是一种常用的数据校验方式,用于检测数据在传输或存储过程中是否发生了错误。它通过特定的算法对原始数据进行计算,生成一个短的校验值(称为CRC码),发送方在传输数据时附带这个校验值,接收方收到数据后也进行相同的计算,并将结果与接收到的CRC码进行比较,从而判断数据是否完整可靠。CRC算法运算速度快、实现简单,在通信、存储、网络等领域广泛应用。
2、CRC实现方式
CRC可以有软件实现,也可以是使用专门硬件CRC单元完成crc运算,以下使用STM32主控内置的crc外设进行实验
2.1 cubemx使能crc
2.2、crc初始化及运行
crc计算示例数据
const uint32_t crc_array[4] = { 0x00001021, 0x20423063, 0x408450a5, 0x60c670e7 }; uint32_t crc_result; uint32_t crc_result_correct = 0xa4499587;
执行crc计算
/* USER CODE BEGIN 2 */ crc_result = HAL_CRC_Accumulate(&hcrc, (uint32_t *)crc_array, BUFFER_SIZE); if (crc_result != crc_result_correct) { printf("CRC Error!\n"); printf("32-bit CRC Value:0x%x\n",crc_result); } else { printf("CRC Correct!\n"); printf("32-bit CRC Value:0x%x\n",crc_result); } /* USER CODE END 2 */
3、运行结果
将crc_array元素任意变动一个,可以看到crc计算结果发生变动
const uint32_t crc_array[4] = { 0x00001021, 0x20423063, 0x408450a5, 0x60c670e7+1 };
可以得出结论,当数据通信中出现了数据丢失、数据异常变动,接收端计算的crc就会与数据本身的crc固定端不匹配,此时接收端认为本次接收数据不可靠