我想在普通C 中使用 strucs来管理微控制器上的数据。我阅读了很多的在线教程,但找不到我的问题的解决方案。 μC始终进入HardFault 。
这是头文件中的结构定义:
typedef struct{
uint8_t laenge;
uint8_t rfu;
uint16_t nsi;
uint8_t epc_data[24];
uint16_t crc16;
}epc_memory;
这是函数原型:
epc_memory decodeACK(uint32_t rxBuffer[]);
功能:
epc_memory decodeACK(uint32_t rxBuffer[])
{
counter=0;
epc_memory mem;
//Anfang finden
while(rxBuffer[counter] > ERROR_) counter++;
makeString(rxBuffer,counter);
startEnding();
counter = decoder();
if(counter > 100){
for (counter=0; counter<4; counter++)
{
mem.laenge = (mem.laenge << 1) | decoded[counter];
}
for (counter=4;counter<6; counter++)
{
mem.rfu = (mem.rfu << 1) | decoded[counter];
}
for (counter=6;counter<15; counter++)
{
mem.nsi = (mem.nsi << 1) | decoded[counter];
}
for(counter=15;counter<(15+mem.laenge);counter++)
{
mem.epc_data[(counter-15)/4] = (mem.epc_data[(counter-15/4)] << 1) | decoded[counter];
}
for(counter=(15+mem.laenge);counter<(31+mem.laenge);counter++)
{
mem.crc16 = (mem.crc16 << 1) | decoded[counter];
}
}
return mem;
}
这就是主要的方式:
epc_memory tmp = decodeACK(&rxBuffer);
你能发现任何错误吗?
由于
修改 仅供参考...... 这个功能很好用:
uint16_t decodeRN16(uint32_t rxBuffer[])
{
counter=0;
uint16_t rn16 = 0;
//Anfang finden
while(rxBuffer[counter] > ERROR_) counter++;
makeString(rxBuffer,counter);
startEnding();
counter = decoder();
if(counter > 16){
for (counter=0; counter<16; counter++)
{
rn16 = (rn16 << 1) | decoded[counter];
}
}
return rn16;
}
答案 0 :(得分:2)
所显示的代码在阅读其成员之前未能初始化mem
&#39;值。这可能会导致未定义的行为。然后,一个结果可能是&#34;硬故障&#34;。
要修复此替换
epc_memory mem;
通过
epc_memory mem = {0};
后一种陈述将所有mem
成员推荐给0
。
由于Jean-François Fabre已删除his answer,我还想指出
epc_memory decodeACK(uint32_t rxBuffer[])
如果被召唤
decodeACK(&rxBuffer);
被错误地调用。
假设阵列的定义是
uint32_t rxBuffer[1024];
调用函数
decodeACK(rxBuffer);
<强>背景强>
epc_memory decodeACK(uint32_t rxBuffer[])
与
相同 epc_memory decodeACK(uint32_t * rxBuffer)
并将数组传递给函数使其衰减到其第一个元素的地址。这将是uint32_t*
。
传递&rxBuffer
将评估传递指向1024 uint32_t
数组的指针,该数组为uint32_t(3)[1024]
,显然不是decodeACK()
所期望的。
它有时似乎仍然有效的原因是,数组的地址实际上是与它的第一个元素的地址相同的地址。
仍在传递数组的地址是传递错误的类型,调用臭名昭着的Undefined Behavior,是不可靠的代码,是错误的代码,编译器明确应该通过发出相关的警告指向你。 / p>