모든 데이터 형식을 닫으면 간단한 바이트가 저장됩니다. 차이점은 바이트가 해석되는 방식입니다.
기본적으로 버퍼에 대한 포인터 및 전송할 바이트 수 (uint16_t Size
)가 uint8_t* pData
이어야합니다. 그래서 struct 포인터를 uint8_t*
으로 캐스팅하고 sizeof()
을 사용하여 크기를 가져옵니다.
여기 시뮬레이션 결과입니다. 가난한 테스트 환경 (int
및 unsigned 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
@danstm 당신이 일을 얻을 관리나요? –
예! 고맙습니다. – danstm