Имена переменных с двумя точками...
несколько ... однако это Си...
Спойлер
Код: Выделить всё
union {
long my_long;
struct
{
unsigned int my_int1;
unsigned int my_int2;
} tests1;
struct
{
unsigned char my_char1;
unsigned char my_char2;
unsigned char my_char3;
unsigned char my_char4;
} tests2;
} my_sptp;
/*
union {
long my_long;
struct
{
unsigned int my_int1;
unsigned int my_int2;
};
struct
{
unsigned char my_char1;
unsigned char my_char2;
unsigned char my_char3;
unsigned char my_char4;
};
} my_sptp;
*/
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
/* my_sptp.my_char1 = 1;
my_sptp.my_char2 = 2;
my_sptp.my_char3 = 3;
my_sptp.my_char4 = 4;
*/
}
void loop() {
// put your main code here, to run repeatedly:
for (long test_cnt=0; test_cnt<=300000; test_cnt++)
{
my_sptp.my_long=test_cnt;
Serial.println(my_sptp.my_long, HEX);
Serial.print(my_sptp.tests1.my_int2, HEX);Serial.print(F(" : "));
Serial.println(my_sptp.tests1.my_int1, HEX);
Serial.print(my_sptp.tests2.my_char4, HEX);Serial.print(F(" : "));
Serial.print(my_sptp.tests2.my_char3, HEX);Serial.print(F(" : "));
Serial.print(my_sptp.tests2.my_char2, HEX);Serial.print(F(" : "));
Serial.println(my_sptp.tests2.my_char1, HEX);
delay(500);
}
while (1)
{ }
}
при том, что конструкция типа
Спойлер
Код: Выделить всё
union my_sptp {
long my_long;
struct
{
unsigned int my_int1;
unsigned int my_int2;
}tests1;
struct
{
unsigned char my_char1;
unsigned char my_char2;
unsigned char my_char3;
unsigned char my_char4;
}tests2;
}; // my_sptp;
для компилятора недопустима - собственно участок с union проскочит, а вот при вызове переменных идут матюки.
т.е. вызвавший интерес пример должен бы по идее смотреться вот так:
Спойлер
Код: Выделить всё
#pragma pack(push, 1)
// union char_to_long {
union {
struct {
char c1;
char c2;
char c3;
char c4;
} chars;
long int value;
} char_to_long;
#pragma pack(pop)
....
Дополнительное замечание по тесту на ардуинке - нано (old bootloader)...
При повторной загрузке во время работы тест-прожки иногда портит бутлоадер - приходится ставить на "внешний" SiProg+avrdudeshell давать общее стирание, затем грузить бутлоадер из-под ардуиноIDE+arduinoISP...
Вероятная причина - сбой протокола в адуринке в случае когда старая программа использует UART на передачу данных при одновременном встречном потоке данных для бутлоадера. Замечено уже второй раз именно для old bootloader.
ПОПАЛСЯ БАГ!
В принципе ситуация следующая.
Программка в адуринке работает с отсылкой данных по UART.
Куда - не столь важно, главное что используется тот же СОМ порт, что и при прошивке бутлоадера.
А мы вознамерились эту платку перепрошить чем-то новеньким...
Так вот, чтоб не возникало "заскоков" последовательность действий (по крайней мере на моей текущей 1.8.9 +ХР):
1. подключаем платку адуринки
2. запускаем IDE
3. независимо от необходимости В ОБЯЗАТЕЛЬНОМ ПОРЯДКЕ открываем монитор порта
4. запускаем компиляцию с последующей прошивкой.
В этом случае IDE корректно остановит программу в платке перед последующим запуском прошивки.
Если монитор порта не запускать - вот тогда и "заскоки" последуют.
В связи с интересом прокрутил пяток вариантов написания для UNION для адуринки...
все проверены и компилятором и макетом и одинаково работоспособны
а вот написание... иногда мозг таки мутит с непривычки...
Спойлер
Код: Выделить всё
//-------------------------------------------------
// вариант 5
struct two_int
{
unsigned int my_int1;
unsigned int my_int2;
};
struct four_char
{
unsigned char my_char1;
unsigned char my_char2;
unsigned char my_char3;
unsigned char my_char4;
};
union my_union{
long my_long;
two_int tests1;
four_char tests2;
} my_sptp;
/*
//-------------------------------------------------
// вариант 4
union my_union{
long my_long;
struct
{
unsigned int my_int1;
unsigned int my_int2;
}tests1;
struct
{
unsigned char my_char1;
unsigned char my_char2;
unsigned char my_char3;
unsigned char my_char4;
}tests2;
} my_sptp;
//-------------------------------------------------
// вариант 3
union {
long my_long;
struct
{
unsigned int my_int1;
unsigned int my_int2;
}tests1;
struct
{
unsigned char my_char1;
unsigned char my_char2;
unsigned char my_char3;
unsigned char my_char4;
}tests2;
}; // my_sptp;
my_union my_sptp;
//-------------------------------------------------
// вариант 2
union {
long my_long;
struct
{
unsigned int my_int1;
unsigned int my_int2;
}tests1;
struct
{
unsigned char my_char1;
unsigned char my_char2;
unsigned char my_char3;
unsigned char my_char4;
}tests2;
} my_sptp;
//-------------------------------------------------
// вариант 1
union {
long my_long;
struct
{
unsigned int my_int1;
unsigned int my_int2;
};
struct
{
unsigned char my_char1;
unsigned char my_char2;
unsigned char my_char3;
unsigned char my_char4;
};
} my_sptp;
//-------------------------------------------------
*/
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
/* my_sptp.my_char1 = 1;
my_sptp.my_char2 = 2;
my_sptp.my_char3 = 3;
my_sptp.my_char4 = 4;
*/
}
void loop() {
// put your main code here, to run repeatedly:
// for (long test_cnt=0; test_cnt<=300000; test_cnt++)
for (my_sptp.my_long=0; my_sptp.my_long<=(500); my_sptp.my_long++)
{
// my_sptp.my_long=test_cnt;
Serial.print(my_sptp.my_long, HEX);Serial.print(F(" :: "));
Serial.println(my_sptp.my_long, DEC);
Serial.print(my_sptp.tests1.my_int2, HEX);Serial.print(F(" : "));
Serial.println(my_sptp.tests1.my_int1, HEX);
Serial.print(my_sptp.tests2.my_char4, HEX);Serial.print(F(" : "));
Serial.print(my_sptp.tests2.my_char3, HEX);Serial.print(F(" : "));
Serial.print(my_sptp.tests2.my_char2, HEX);Serial.print(F(" : "));
Serial.println(my_sptp.tests2.my_char1, HEX);
// delay(500);
}
while (1)
{
}
}
