Как преобразовать массив смешанного типа в массив char и обратно? - PullRequest
1 голос
/ 18 мая 2019

Я должен передать массив смешанного типа (объединение) из одного uController (источник) в другой uController (цель) через SPI, поэтому я должен перенести весь блок передачи в массив uint8_t перед передачей, а затем восстановить его вtarget uC обратно в массив объединения смешанного типа.

Я пробовал следующий подход, но он не работает.(Упрощенно)

int i;
int len=4;

union dummy{
    float f32;
    uint32_t u32;
    uint8_t u8[4];
};

union dummy inst1[len]; //First instance on source uC
union dummy inst2[len]; //Second instance on target uC


inst1[0].u8[0]=73;
inst1[1].f32=17.5;
//... and so on

printf("Source: %d, %f\n",inst1[0].u8[0],inst1[1].f32);

//Prepare SPI uint8_t array
uint8_t spi_arr[4*len];

*spi_arr=*inst1; //Wrong. What to do here?

//SPI uint8_t array arrived on target. Convert it back to union type

*inst2=*spi_arr; //Wrong. What to do here?

printf("Target: %d, %f\n",inst2[0].u8[0],inst2[1].f32);

Это дает мне ошибку:

error: incompatible types when assigning to type 'uint8_t {aka unsigned char}' from type 'union dummy'

Все, что я хочу, это просто копировать содержимое массивов вперед и назад, как они есть.Как это сделать?

Ответы [ 3 ]

1 голос
/ 18 мая 2019

Это пример программы, показывающей, как скопировать ваши данные в массив char и обратно, используя memcpy:

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

const int len = 4;

union dummy{
    float f32;
    uint32_t u32;
    uint8_t u8[4];
};

int main(void) {
    union dummy inst1[len]; //First instance on source uC
    union dummy inst2[len]; //Second instance on target uC
    uint8_t spi_arr[sizeof(inst1)];

    for (int index = 0; index < len; index++) {
        for (int inner_index = 0; inner_index < 4; inner_index++) {
            inst1[index].u8[inner_index] = '1' + inner_index;
        }
    }

    memcpy(spi_arr, inst1, sizeof(inst1));
    memcpy(inst2, spi_arr, sizeof(spi_arr));

    for (int index = 0; index < len; index++) {
        for (int inner_index = 0; inner_index < 4; inner_index++) {
            printf("%c", inst2[index].u8[inner_index]);
        }
        printf("\n");
    }

    return 0;
}

Вывод

1234
1234
1234
1234
1 голос
/ 19 мая 2019

Это пример программы, которая показывает, как использовать указатели для доступа к вашим данным в виде двух разных типов:

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

const int len = 4;

union dummy{
    float f32;
    uint32_t u32;
    uint8_t u8[4];
};

int main(void) {
    union dummy inst1[len]; //First instance on source uC
    union dummy *inst2; //Second instance on target uC
    uint8_t *spi_arr;

    for (int index = 0; index < len; index++) {
        for (int inner_index = 0; inner_index < 4; inner_index++) {
            inst1[index].u8[inner_index] = '1' + inner_index;
        }
    }

    spi_arr = (uint8_t *) inst1;

    for (int index = 0; index < sizeof(inst1); index++) {
        printf("%c", spi_arr[index]);
    }
    printf("\n\n");

    inst2 = (union dummy *) spi_arr;

    for (int index = 0; index < len; index++) {
        for (int inner_index = 0; inner_index < 4; inner_index++) {
            printf("%c", inst2[0].u8[inner_index]);
        }
        printf("\n");
    }

    return 0;
}

выход

1234123412341234

1234
1234
1234
1234
0 голосов
/ 18 мая 2019

Если вы измените строку:

*spi_arr=*inst1; //Wrong. What to do here?

следующим образом:

*spi_arr=inst1[0].u8[0];

Компилируется.Я не уверен, что ты этого хочешь.Типы данных должны совпадать, чтобы назначить указатель, о чем говорит сообщение об ошибке.В этом примере *spi_arr и inst1[0].u8[0] относятся к типу unit8_t .

...