При запуске я хочу сохранить значения массива uint8_t
в структуру с элементами uint16_t
с функцией memcpy
внутри функции Counter_Read(void)
. Хотя функция memcpy
работает, но дает мне значения с прямым порядком байтов. поэтому я создаю массив uint16_t
из массива uint8_t
, а затем использую функцию memcpy
, работает нормально, но есть ли лучший способ сделать это?
При выключении я хочу для сохранения uint16_t
элементов структуры в массив uint8_t
. Я пытаюсь использовать здесь указатель, но он не увеличивает адрес элемента! .. обычно мы меняем местами элементы массива или есть лучший способ сделать это?
вот мой код:
#include <stdint.h>
#include <string.h>
typedef struct
{
uint16_t EssEvRPM;
uint16_t Essev_TrqLd;
uint16_t Essev_Reku;
uint16_t Essev_NormProp;
} S_Counter_t;
S_Counter_t Counter =
{
.EssEvRPM = 0x0000U,
.Essev_TrqLd = 0x0000U,
.Essev_Reku = 0x0000U,
.Essev_NormProp = 0x0000U,
};
const S_Counter_t* GetCounterConstPtr(void)
{
return &Counter;
}
void Counter_Read(void)
{
S_Counter_t* pCounter = GetCounterConstPtr();
// We get uint8_t from MEMnv area
uint8_t SigData[sizeof(S_Counter_t)]={0x1F,0x2F,0x3F,0x4F,0x5F,0x6F,0x7F,0x8F};
uint16_t aCounter[sizeof(S_Counter_t)/2];
// read at startup,
// read uint8_t array and save to uint16_t array
int j=0;
for(int i = 0; i < sizeof(aCounter); i++) {
aCounter[i] = (uint16_t)(SigData[j] << 8)| SigData[++j];
j++;
}
// assign array values to struct: S_Counter_t
memcpy(pCounter, aCounter, sizeof(aCounter));
// printf("\n-> %x %x %x %x",pCounter->EssEvRPM,pCounter->Essev_TrqLd,pCounter->Essev_Reku,pCounter->Essev_NormProp);// -> 1f2f 3f4f 5f6f 7f8f
}
void Counter_Write(void)
{
S_Counter_t* pCounter = GetCounterConstPtr();
uint8_t aCounterBuffer[sizeof(S_Counter_t)];
// returns us "2f 1f 4f 3f 6f 5f 8f 7f" but we want 1f 2f 3f 4f 5f
memcpy(aCounterBuffer, pCounter, sizeof(aCounterBuffer)); //
for(int i=0;i<sizeof(aCounterBuffer);i++)
{
aCounterBuffer[i] = *((uint8_t*)&(*pCounter)+1); //high byte
aCounterBuffer[i+1] = *((uint8_t*)&(*pCounter)+0); //low byte
*pCounter++; // doesn't work
}
// we save uint8_t aCounterBuffer to MEMnv area
}
int main()
{
Counter_Read();
Counter_Write();
}