c - 从 EEPROM 读取,并知道它不是在启动时写入的

标签 c embedded

我在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;

我通过写入该结构的软件设置该数据。

问题是在第一次读取该结构而不写入它时,我读取了错误数据。

我需要检测那个点。我怎么知道读取的数据是假的,或者我怎么知道我在没有软件的情况下读取了数据。

最佳答案

您可以添加 checksumCRC在结构的末尾,它是根据结构的所有成员计算的。

当您将数据写入 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/

相关文章:

c - C语言创建树的问题

c - Cortex-M0+ 的预定义 cpu 目标宏

c - arm-none-eabi-ld : cannot find -lc

c - 运行时值怎么可能是 const?

c - C Ruby (MRI) 中的 rb_yield_splat 和 rb_yield_values2 有什么作用?

c++ - Arduino c语言清空一个字符串的方法

c++ - 嵌入式应用程序写入寄存器时出现段错误

linux - 如何将数据发送到(基于Linux的)嵌入式系统

c - arm cortex m4上的总线错误调试

编译错误 "name in formal parameter list illegal"