使用 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第二部分的sizeofheader是为了避免hard-coding数组长度。这有点可怕,因为它要求源数组和目标数组的长度当然相同。