我在EEPRM中写了一个结构如下
typedef struct
{
fract32 AmpF; // amplitude fundamental
fract32 AmpH; // amplitude harmonic
UINT32 b;
UINT16 d;
UINT16 crc;
}CoilBoardAmp_T;
// mechanic angles and salt water angles of coil stored in coil-eeprom
typedef struct
{
ChannelData_T channel[NUM_CHANNELS];
CoilBoard_T coilboard;
CoilBoardAmp_T coil_h;
CoilBoardAmp_T coil_d;
// UINT32 gCoilSerialNumber;
// UINT32 gInversSerialNumber;
} Coil_Eeprom_Data_T;
我通过写入该结构的软件设置该数据。
问题是在第一次读取该结构而不写入它时,我读取了错误数据。
我需要检测那个点。我怎么知道读取的数据是假的,或者我怎么知道我在没有软件的情况下读取了数据。
最佳答案
您可以添加 checksum或 CRC在结构的末尾,它是根据结构的所有成员计算的。
当您将数据写入 EEPROM 时,您计算校验和的值并将其写入。当您从 EEPROM 读取数据时,您会计算该数据的校验和并将其与您刚刚读取的数据的校验和进行比较,如果匹配则意味着(很有可能)您的数据是正确的。
基本上,如果我们在内存中表示您的结构:
byte |0 1 2 3|4 5 6 7|8 9 10 11|12 13|14 15|
AmpF AmpH b d CRC
然后 2 字节的 CRC 可以这样计算:
CRC = (AmpF<<2) + (AmpF & 0x00FF)
+ (AmpH<<2) + (AmpH & 0x00FF)
+ (h<<2) + (h & 0x00FF)
+ d;
这显然可以通过 for
循环进行优化。我很确定网上有例子,但一个想法是从你的结构地址到这个地址 + sizeof(struct) - sizeof(CRC) ,步长为 2 个字节。
互联网上充满了校验和和 CRC 的实现,从极其简单到非常复杂,具体取决于您想要实现的目标和您的系统功能,但基本上简单的校验和只是将数据结构中的所有字节相加.
像我举的例子那样的简单校验和只会检测数据中的错误位,您不会检测两个值是否被交换,例如AmpF 和 AmPH。
请注意,虽然校验和和 CRC 是不同的东西,但这两个术语通常用来指代另一个。
关于c - 从 EEPROM 读取,并知道它不是在启动时写入的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39893778/