STM32上的校验和函数

Checksum function on STM32

我正在尝试创建一个函数来计算数组的校验和。我应该将数组中的所有值相加并取二进制补码。 我测试了我的代码,结果是正确的。 一旦我尝试在单独的函数中实现此代码,结果就是错误的。 谁能帮我解决这个问题。

函数调用是:

  uint8_t Testframe[] = {0xAA,0x43,0x10,0x97,0x55,0xBE, 0x6A, 0xEA, 0xF3, 0xBE, 0xF4, 0x71, 0x9D, 0xB2, 0x4B, 0x0B, 0x45, 0x56, 0x55};

  uint8_t result2 = 0;
  result2 = CalculateChecksum(Testframe);

函数是:

uint8_t CalculateChecksum( uint8_t array[])
{
uint64_t result = 0;
uint8_t  output = 0;

for(int i = 0; i < sizeof(array); i++)
{
    result = result + array[i];
}
output = (uint8_t) result;
output = output ^ 0xFF;
output = output + 0x01;
return output;

}

结果应该是0x5A

根据您使用的是 32 位还是 64 位寻址,您的 for 循环仅迭代 48 次,而不是所需的 19 次。

这是因为 Arrays in C always decay into a pointer 作为函数参数传递时。
以下声明:

for(int i = 0; i < sizeof(array); i++)  

应该会导致编译器警告。我在我的系统上看到了这个:

" 23、30 警告:数组函数参数上的 sizeof 将 return 大小 'uint8_t *'(又名 'unsigned char *')而不是 'uint8_t []' "

这基本上是说 sizeof(array),一旦 array 作为函数参数传递,将产生 sizeof 一个指针,而不是 sizeof 数组本身,导致迭代次数错误。

在原型中传递另一个参数是解决此问题的一种方法。例如:

uint8_t CalculateChecksum( uint8_t array[], size_t size);

允许函数使用表示数组中元素计数的值:

for(int i = 0; i < size; i++)
{ ...

调用示例:

  size_t size = sizeof Testframe/sizeof Testframe[0];//provides number of elements in array
  result2 = CalculateChecksum(Testframe, size);  

最后,如果您还没有将编译器设置为显示警告,请将其更改为显示警告。 (例如 -Wall 如果使用 GCC)