c语言 - STM32 上的校验和函数



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

函数调用为:

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次。

这是因为 C 中的数组在作为函数参数传递时总是衰减为指针。
以下语句:

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

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

" 23, 30 警告:数组函数参数上的 sizeOf 将返回大小 'uint8_t *'(又名 '无符号字符 *'),而不是 '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);  

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

相关内容

  • 没有找到相关文章

最新更新