查表法计算crc 16。模型是CRC-16/MODBUS,多项式是8005。
// Crc16ReadByteFunc read byte for crc16 calculate
typedef uint8_t (*Crc16ReadByteFunc)(int offset);
// Crc16Checksum check sum.Module is CRC-16/MODBUS,polynomial is 8005
// return value is MSB
uint16_t Crc16Checksum(uint8_t* bytes, int size);
// Crc16ChecksumFromCallback check sum,read data from callback function then calculate
// This function can use calculate crc when data in flash or file
// Module is CRC-16/MODBUS,polynomial is 8005
// return value is MSB
uint16_t Crc16ChecksumFromCallback(Crc16ReadByteFunc readByte, int size);
测试框架使用的是适合于嵌入式系统的C语言单元测试框架:Scunit
#include <stdio.h>
#include "crc16.h"
#include "scunit.h"
static void testCheckSum(void);
static void testCheckSumFromCallback(void);
static uint8_t readData(int offset);
int main() {
ScunitLoad((ScunitPrintFunc)printf);
ScunitAddSuite("test crc16");
ScunitAddTest("testCheckSum", testCheckSum);
ScunitAddTest("testCheckSumFromCallback", testCheckSumFromCallback);
return 0;
}
static void testCheckSum(void) {
uint8_t arr1[] = {1, 2, 3};
uint16_t crc = Crc16Checksum(arr1, 3);
ScunitAssert(crc == 0x6161, "1");
uint8_t arr2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
crc = Crc16Checksum(arr2, 9);
ScunitAssert(crc == 0x0eb2, "2");
}
static void testCheckSumFromCallback(void) {
uint16_t crc = Crc16ChecksumFromCallback(readData, 9);
ScunitAssert(crc == 0x0eb2, "2");
}
static uint8_t readData(int offset) {
static uint8_t arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
return arr[offset];
}
输出:
Suite:test crc16
-------------------->case:testCheckSum begin
testCheckSum tag:1 SCUNIT_ASSERT pass
testCheckSum tag:2 SCUNIT_ASSERT pass
-------------------->case:testCheckSum end
-------------------->case:testCheckSumFromCallback begin
testCheckSumFromCallback tag:2 SCUNIT_ASSERT pass
-------------------->case:testCheckSumFromCallback end