Должен быть несложный способ копирования элементов структуры в массив и наоборот. - PullRequest
0 голосов
/ 04 августа 2020
  1. При запуске я хочу сохранить значения массива uint8_t в структуру с элементами uint16_t с функцией memcpy внутри функции Counter_Read(void) . Хотя функция memcpy работает, но дает мне значения с прямым порядком байтов. поэтому я создаю массив uint16_t из массива uint8_t, а затем использую функцию memcpy, работает нормально, но есть ли лучший способ сделать это?

  2. При выключении я хочу для сохранения 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...