Как обьединить переменные uint16_t с элементами массива

Olm
Offline
Зарегистрирован: 09.10.2014

Люди подскажите как обьединить несколько переменных uint16 с массивом uint8[], чтоб переменные были элементами этого массива. Хочу так обьединить чтоб отправлять эти переменные по uart как элементы массива побайтно.



uint16_t temperature_1; //0 1

uint16_t temperature_2; //2 3

uint16_t temperature_3; //4 5

uint16_t temperature_4; //6 7

uint16_t temperature_5; //8 9

uint16_t temperature_6; //10 11

uint16_t oil_pressure; //12 13

uint16_t power_load; //14 15

uint16_t rpm_speed; //16 17 



эти переменные должны быть элементами массива uint8_t massive[18];

Я так понимаю что нужно использовать union, но не могу найти примера как это должно выглядеть

Datak
Offline
Зарегистрирован: 09.10.2014

Как-нибудь так, например:

struct
{  
   uint16_t temperature_1; //0 1

   uint16_t temperature_2; //2 3

   uint16_t temperature_3; //4 5

   uint16_t temperature_4; //6 7

} temperature;

.....

Serial.write( ( byte* )( &temperature ), sizeof( temperature ) );

Не обещаю что всё до буквы правильно, но общий смысл думаю понятен.

Olm
Offline
Зарегистрирован: 09.10.2014
Вот так у меня получается:
union {
struct {
uint16_t temperature_1;  //0 1
uint16_t temperature_2;  //2 3
uint16_t temperature_3;  //4 5
uint16_t temperature_4;  //6 7
uint16_t temperature_5;  //8 9
uint16_t temperature_6;  //10 11
uint16_t oil_pressure;     //12 13
uint16_t power_load;      // 14 15
uint16_t rpm_speed;//       16 17
}temper;
 uint8_t  sendmassive[18];
}  bufer;
Serial.write( bufer.sendmassive[0]);//

------------------------------------------------------------------------------------

 
Если устанавливаем элемент массива:                           bufer.sendmasive[0]=xxx;
Если устанавливаем переменную temperature_1 :         bufer.temper.temperature_1=xxx;
 
Насколько так делать правильно? вроде работает, но не знаю во что по факту такая конструкция компилируется
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В гугле примеров море

Datak
Offline
Зарегистрирован: 09.10.2014

Olm пишет:

Насколько так делать правильно? вроде работает, но не знаю во что по факту такая конструкция компилируется

union, да, кажется описан правильно.

А вот это - 

Serial.write( bufer.sendmassive[0]);//

 - оно что, действительно отправляет то что нужно?

Не  на чем сейчас проверить, но так, на вид - написано же, что отправляется sendmassive[0], то есть только один байт. Надо посмотреть, какие ещё параметры допустимы при вызове Serial.write( ...... ). Думаю, должна быть функция принимающая указатель на буфер и его длину.

Так, скорей всего:

Serial.write( bufer.sendmassive, sizeof( bufer.sendmassive ) );