目录
1.2 函数: Crc_CalculateCRC8H2F()
1.5 函数: Crc_CalculateCRC32P4()
前言
在CAPL开发的时候, 涉及checksum计算, E2E等等, 而CAPL已经有内置的函数了, 我们就不要重复开发了.
本文函数部分摘录自Vector的官方文档,做了整理与翻译
1. CAPL中与CRC有关的函数如下:
Functions | Short Description |
---|---|
Crc_CalculateCRC8 | 根据数据计算CRC8 的相应校验和(checksum) |
Crc_CalculateCRC8H2F | 根据数据计算CRC8H2F 的相应校验和(checksum) |
Crc_CalculateCRC16 | 根据数据计算CRC16 的相应校验和(checksum) |
Crc_CalculateCRC32 | 根据数据计算CRC32 的相应校验和(checksum) |
Crc_CalculateCRC32P4 | 根据数据计算CRC32P4 的相应校验和(checksum) |
Crc_CalculateCRC64 | 根据数据计算CRC64 的相应校验和(checksum) |
1.1 函数: Crc_CalculateCRC8()
这里的CRC8计算方法在SAEJ1850 中定义。
函数语法
long Crc_CalculateCRC8 (BYTE* data,
dword dataSize,
dword dataOffset,
dword crcLength,
dword crcStartValue,
dword firstCall,
dword* crcCalculated);
函数功能描述
根据数据计算CRC8的相应校验和。CRC值的计算对应于AUTOSAR Profile 1。
函数参数介绍
参数 | 含义 |
---|---|
dest | 要计算校验和的负载数据(Payload data) |
dataSize | 要计算的数据块(data block)的长度(以字节为单位) |
dataOffset | 用于计算负载数据(payload data)中的CRC的起始索引(Start index) |
crcLength | 计算CRC的数据长度 |
crcStartValue | CRC初始值取决于它是第一次调用还是后续调用。如果firstCall 为1 ,则忽略值。 |
firstCall | 第一次调用或后续调用的标志。可能的值为0(后续调用) 或1(第一次调用) |
crcCalculated | 计算后的CRC8值 |
返回值介绍
返回值 | 含义 |
---|---|
0 | Successful |
-1 | Not successful: CRC length must not be 0 |
-2 | Not successful: Offset must not be greater or equal length |
-3 | Not successful: Length outside array range |
-4 | Not successful: Summary of Length and offset are outside array range |
举例说明
关于Crc_CalculateCRC8()
函数说明的示例代码:
// first CALL, Offset '0'
on key 'a'
{
long retval;
dword crc;
byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC8(data, elcount (data), 0, elcount (data), 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
// first CALL, Offset '2', Length - 2
on key 'b'
{
long retval;
dword crc;
byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC8(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
输出结果:
Data represents the number: Little Endian is used.
1.2 函数: Crc_CalculateCRC8H2F()
这里的CRC8H2F
指的是: CRC8 0x2F polynomial
函数作用: 根据数据计算CRC8H2F的相应校验和。CRC值的计算对应于AUTOSAR Profile 2。
函数语法
long Crc_CalculateCRC8H2F (BYTE* data,
dword dataSize,
dword dataOffset,
dword crcLength,
dword crcStartValue,
dword firstCall,
dword* crcCalculated);
函数的参数与返回值基本上等同于Crc_CalculateCRC8()
的说明,这里就不在赘述了。
举例说明
关于Crc_CalculateCRC8H2F()
函数说明的示例代码:
// first CALL, Offset '0'
on key 'a'
{
long retval;
dword crc;
byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC8H2F(data, elcount (data), 0, elcount (data), 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
// first CALL, Offset '2', Length - 2
on key 'b'
{
long retval;
dword crc;
byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC8H2F(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
1.3 函数: Crc_CalculateCRC16()
函数作用: 根据数据计算CRC16的相应校验和。CRC值的计算对应于AUTOSAR PROFILE_05和PROFILE_06。
函数语法
long Crc_CalculateCRC16 (BYTE* data,
dword dataSize,
dword dataOffset,
dword crcLength,
dword crcStartValue,
dword firstCall,
dword* crcCalculated);
函数的参数与返回值基本上等同于Crc_CalculateCRC8()
的说明,这里就不在赘述了。
举例说明
关于Crc_CalculateCRC16()
函数说明的示例代码:
// first CALL, Offset '0'
on key 'a'
{
long retval;
dword crc;
byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC16(data, elcount (data), 0, elcount (data), 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
// first CALL, Offset '2', Length - 2
on key 'b'
{
long retval;
dword crc;
byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC16(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
1.4 函数: Crc_CalculateCRC32()
函数作用: 根据数据计算CRC32的相应校验和。CRC值的计算对应于IEEE-802.3 CRC32。
函数语法
long Crc_CalculateCRC32 (BYTE* data,
dword dataSize,
dword dataOffset,
dword crcLength,
dword crcStartValue,
dword firstCall,
dword* crcCalculated);
函数的参数与返回值基本上等同于Crc_CalculateCRC8()
的说明,这里就不在赘述了。
举例说明
关于Crc_CalculateCRC32()
函数说明的示例代码:
// first CALL, Offset '0'
on key 'a'
{
long retval;
dword crc;
byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC32(data, elcount (data), 0, elcount (data), 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
// first CALL, Offset '2', Length - 2
on key 'b'
{
long retval;
dword crc;
byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC32(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
1.5 函数: Crc_CalculateCRC32P4()
这里的CRC32P4
指的是: CRC32 0x1F4ACFB13 polynomial
函数作用: 根据数据计算CRC32P4的相应校验和。CRC值的计算对应于AUTOSAR Profile 4。
函数语法
long Crc_CalculateCRC32P4 (BYTE* data,
dword dataSize,
dword dataOffset,
dword crcLength,
dword crcStartValue,
dword firstCall,
dword* crcCalculated);
函数的参数与返回值基本上等同于Crc_CalculateCRC8()
的说明,这里就不在赘述了。
举例说明
关于Crc_CalculateCRC32P4()
函数说明的示例代码:
// first CALL, Offset '0'
on key 'a'
{
long retval;
dword crc;
byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC32P4(data, elcount (data), 0, elcount (data), 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
// first CALL, Offset '2', Length - 2
on key 'b'
{
long retval;
dword crc;
byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC32P4(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
1.6 函数: Crc_CalculateCRC64()
函数作用: 根据数据计算CRC64的相应校验和。CRC值的计算对应于 AUTOSAR Profile 7。
函数语法
long Crc_CalculateCRC64 (BYTE* data,
dword dataSize,
dword dataOffset,
dword crcLength,
qword crcStartValue,
dword firstCall,
qword* crcCalculated);
函数的参数与返回值基本上等同于Crc_CalculateCRC8()
的说明,这里就不在赘述了。
举例说明
关于Crc_CalculateCRC64()
函数说明的示例代码:
// first CALL, Offset '0'
on key 'a'
{
long retval;
qword crc;
byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC8(data, elcount (data), 0, elcount (data), 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
// first CALL, Offset '2', Length - 2
on key 'b'
{
long retval;
qword crc;
byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
retval = Crc_CalculateCRC8(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
write("CRC of data: 0x%X", crc);
}
总结
CAPL内置checksum还是很好用的, 省去了自己实现的麻烦。