2016-10-22 9 views
2

に構造体を保存します。STM32F0 I2C HALは、私は構造体を保存する必要がI2CのEEPROM

struct { 
    uint16_t value; 
    uint16_t flag; 
} status; 

外部のI2C EEPROMに

HAL_StatusTypeDef HAL_I2C_Mem_Write (I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t * pData, uint16_t Size, uint32_t Timeout) 

機能に

を使用して、あなたは私に正しい方法を提案することができますこれをする?

答えて

2

すべてのデータ型が単純なバイトを格納していると見れば、違いはバイトの解釈方法です。

基本的には、バッファへのポインタと転送されるバイト数(uint16_t Size)が必要です。そのため、構造体ポインタをuint8_t*にキャストし、サイズをsizeof()で取得します。

ここではシミュレーションを行っていますが、貧弱なテスト環境(intunsigned char)を許してください。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    int value; 
    int flag; 
} status; 

int main(void) { 

    status stat; 
    stat.value = 15; 
    stat.flag = 1; 

    int size = sizeof(status);       // number of bytes to be sent 
    unsigned char* pData;         // (uint8_t*) unsigned char* pointer to data 

    unsigned char eeprom[size];       // simulated EEPROM 
    unsigned char pDataReceived[size];     // for read back from EEPROM test 
    status* read_back;         // for read back from EEPROM test 

    printf("%d %d\n", stat.value, stat.flag);    // verify data in original format 

    pData = (unsigned char*)(&stat);      // cast data pointer to (uint8_t*) unsigned char* 
    printf("%d %d\n", ((status*)pData)->value, ((status*)pData)->flag); // verify data after cast 

    memcpy(eeprom, pData, size);       // I2C write bytes simulation 
    printf("%d %d\n", ((status*)eeprom)->value, ((status*)eeprom)->flag); // verify data in simulated EEPROM 

    memcpy(pDataReceived, eeprom, size);     // I2C read bytes simulation 
    read_back = (status*)(pDataReceived);     // cast back to struct type 
    printf("%d %d\n", read_back->value, read_back->flag); // verify received data in original format 

    return 0; 
} 

書き込み例:

struct status stat; 
// operations on the struct 
uint8_t* addressOfStruct= (uint8_t*)(&stat); 
uint16_t sizeOfStruct = sizeof(status); 

HAL_StatusTypeDef HAL_I2C_Mem_Write (&hi2c, DevAddress, MemAddress, MemAddSize, addressOfStruct, sizeOfStruct, 100); 

読む例:

struct status* read; 
uint16_t sizeOfBuffer = sizeof(status); 
uint8_t receiveBuffer[sizeOfBuffer]; 

HAL_StatusTypeDef HAL_I2C_Mem_Read (&hi2c, DevAddress, MemAddress, MemAddSize, receiveBuffer, sizeOfBuffer, 100); 

read = (status*)(receiveBuffer); // or copy or move the data 
+0

@danstmは、あなたはそれが仕事を得るために管理していましたか? –

+0

はい!どうもありがとうございました。 – danstm

関連する問題