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
循环仅迭代 4
或 8
次,而不是所需的 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)
我正在尝试创建一个函数来计算数组的校验和。我应该将数组中的所有值相加并取二进制补码。 我测试了我的代码,结果是正确的。 一旦我尝试在单独的函数中实现此代码,结果就是错误的。 谁能帮我解决这个问题。
函数调用是:
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
循环仅迭代 4
或 8
次,而不是所需的 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)