簡體   English   中英

使用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中從void *強制轉換/從強制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]);

for標題的第二部分中的sizeof是為了避免硬編碼數組長度。 當然,這有點嚇人,因為它要求源數組和目標數組的長度都相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM