设备运行参数,需要保存到 EEPROM 中。运行参数数据类型不确定,有可能正负,也有可能不同长度。而 EEPROM 只能字节寻址。 不同编译器,数据类型的表示方法各异,且字节位置也会有区别。做字节转换会不通用。可以使用定义联合体的办法解决。 将需要存储的数据定义一个结构体,如下。参数可以任意数据类型,最后增加一个校验合字节,用于检查数据正确性。 typedef struct{ int16_t Kx; // 参数 1 int16_t Ky; // 参数 2 int16_t X0; // 参数 3 int16_t Y0; // 参数 4 uint8_t cs; // 校验合 }stTPParaTypeDef; #define PARALEN 9 // 上述结构体包含的字节数,可以用 sizeof(stTPParaTypeDef) 但有可能会出错。 定义一个联合体,联合体成员为参数结构及一个与参数结构等长的字节数组。 typedef union{ stTPParaTypeDef tp; uint8_t tpbyte ; }unTPParaTypeDef; 联合体中的结构和字节数组共用存储空间。 参数 0 参数 1 参数 2 参数 3 校验和 字节 0 字节 1 字节 2 字节 3 字节 4 字节 5 字节 6 字节 7 字节 8 unTPParaTypeDef unTPPara; // 定义一个全局参数联合体 需要保存参数时,先计算联合体内的字节数组校验合,然后把整个字节数组写到 EEPROM uint8_t SaveTPSetting(void){ uint8_t i,cs=0; cs = 0; for(i = 0;i<(PARALEN-1);i++){ cs += unTPPara.tpbyte ; } unTPPara.tp.cs = 0xFA - cs; AT24C64_WriteBytes(TPPARAADDR,unTPPara.tpbyte,PARALEN); return 1; } 需要获取数据时,按字节从 EEPROM 中读出相应长度的字节,放入联合体的字节数组中。并计算校验合,判别数据是否有效。 uint8_t GetTPSetting(void){ uint8_t i,cs = 0; AT24C64_ReadBytes(TPPARAADDR,unTPPara.tpbyte,PARALEN); for(i = 0;i