我试图从EEPROM读取数据,我有三个结构。
typedef struct
{
fract32 MechCoilPhiBase; // Mech Angle Table
fract32 MechCoilPhi3rd; // Mech Angle Table
fract32 PhiSaltwater; // Saltwater Table
UINT16 d;
UINT16 crc;
} ChannelData_T;
typedef struct
{
UINT32 reHarmonic;
UINT32 reFundamental;
UINT32 imgHarmonic;
UINT32 imgFundamental;
UINT16 crc;
} CoilBoard_T;
// mechanic angles and salt water angles of coil stored in coil-eeprom
typedef struct
{
ChannelData_T channel[NUM_CHANNELS];
CoilBoard_T coilboard;
// UINT32 gCoilSerialNumber;
// UINT32 gInversSerialNumber;
} Coil_Eeprom_Data_T;
我试图读取数据,但是大小不是2的幂,我试图填充数据,但结构没有正确填充。
我使用以下代码从缓冲区中读取数据,并用结构填充它。 例如,crc变量为0,并且无法从缓冲区中正确读取。
这是我如何将数据复制到缓冲区
memcpy( (void*) &CoilEepromData, (const void*) &EepromCoil.aRxData[0], sizeof(Coil_Eeprom_Data_T) );
extern volatile Coil_Eeprom_Data_T CoilEepromData;
extern volatile Eeprom_Coil_T EepromCoil; // control struct for the coil-eeprom
typedef struct
{
UINT8 crcValueOut;
UINT8 crcValueIn;
UINT8 pageAddress;
UINT8 dataLength;
UINT8 bytesToTransmit;
UINT8 bytesWritten;
UINT8 bytesToReceive;
UINT8 bytesRead;
UINT8 errorCount;
bool bWriteSucceed:1;
bool bStartup:1;
bool bReadingStarted:1;
UINT8 aTxData[COIL_SPI_BUFFER_SIZE];
UINT8 aRxData[COIL_SPI_BUFFER_SIZE];
} Eeprom_Coil_T;
答案 0 :(得分:2)
不知道你对两种权力的评论是什么,如果这是一个要求你必须让它更清楚。
此外,大多数来自C中void *
的演员都不是必需的,你不应该“只是为了安全”。从你发布的代码中很难理解为什么需要演员表。
最后,请记住结构也是值,您可以使用普通的旧任务:
CoilEepromData.channel[0] = EepromCoil.aRxData[0];
CoilEepromData.channel[1] = EepromCoil.aRxData[1];
CoilEepromData.channel[2] = EepromCoil.aRxData[2];
编译器可能会将其优化为单个memcpy()
调用,但这要好得多,因为它更易读,更容易实现。您可能希望将其置于循环中以降低拼写错误索引的风险。
如果确实想要使用memcpy()
,请按以下步骤操作:
memcpy(&CoilEepromData.channel[0], &EepromCoil.aRxData[0], sizeof CoilEepromData.channel[0]);
这在目标变量上使用sizeof
,而不在类型上使用for(size_t i = 0; i < sizeof CoilEepromData.channel / sizeof CoilEepromData.channel[0]; ++i)
memcpy(&CoilEepromData.channel[i], &EepromCoil.aRxData[i], sizeof CoilEepromData.channel[i]);
。这有点安全。再次,这将在循环中表现良好:
sizeof
for
标头的第二部分中的input0.txt, input1.txt,......., input7.txt
是为了避免对数组长度进行硬编码。这有点可怕,因为它要求源和目标数组的长度当然是相同的。