2016-09-26 54 views
0

数据结构,我想从EEPROM中读取数据,我有三个结构。拷贝数据使用的memcpy

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; 
+2

你并不需要转换,并从'无效*'(C语言)。 – Kninnug

+0

感谢,但这并没有解决我的问题 – Andre

+3

@Andre这就是为什么它是一个评论,而不是答案。 :) – unwind

回答

2

不知道你对两种手段的权力评论,如果这是你必须做出更清晰的要求。

此外,大多数类型转换/从void *在C是没有必要的,你不应该做他们“为了安全起见”。从发布的代码中很难理解为什么需要强制转换。

最后,请记住,结构值也可以使用普通的老任务:

CoilEepromData.channel[0] = EepromCoil.aRxData[0]; 
CoilEepromData.channel[1] = EepromCoil.aRxData[1]; 
CoilEepromData.channel[2] = EepromCoil.aRxData[2]; 

编译器很可能优化该成一个单一的memcpy()调用,但这是更好,因为它更具可读性和项目EATCHIP得到正确的。您可能希望将其放在一个循环中以减少索引拼写错误的风险。

如果你真的使用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是避免硬编码所述阵列的长度。这有点吓人,因为它要求源和目标数组的长度当然是相同的。

+0

在一个循环?所以我应该迭代缓冲区并执行memcpy? – Andre

+0

我得到错误行407:cc0167:error:参数 类型“volatile ChannelData_T *”与参数 不兼容类型“void *” memcpy(&CoilEepromData.channel [0],&EepromCoil.aRxData [0],sizeof CoilEepromData.channel [0]); – Andre

+0

我该怎么做循环?我没有明白你的观点。以及如何迭代数据?我不知道它们的大小 – Andre