使用memcpy将数据复制到数据结构

时间:2016-09-26 09:33:50

标签: c 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;

1 个答案:

答案 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 是为了避免对数组长度进行硬编码。这有点可怕,因为它要求源和目标数组的长度当然是相同的。