使用 memcpy 将数据复制到数据结构
copying data to data structure using memcpy
我正在尝试从 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;
不知道你对二的幂的评论是什么意思,如果这是一个要求,你必须把它说得更清楚。
此外,大多数 C 语言中的转换 to/from void *
都是不必要的,您不应该这样做 "just to be safe"。从您发布的代码很难理解为什么需要强制转换。
最后,请记住结构也是值,您可以使用普通的旧赋值:
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]);
for
第二部分的sizeof
header是为了避免hard-coding数组长度。这有点可怕,因为它要求源数组和目标数组的长度当然相同。
我正在尝试从 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;
不知道你对二的幂的评论是什么意思,如果这是一个要求,你必须把它说得更清楚。
此外,大多数 C 语言中的转换 to/from void *
都是不必要的,您不应该这样做 "just to be safe"。从您发布的代码很难理解为什么需要强制转换。
最后,请记住结构也是值,您可以使用普通的旧赋值:
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]);
for
第二部分的sizeof
header是为了避免hard-coding数组长度。这有点可怕,因为它要求源数组和目标数组的长度当然相同。