Отправка структур по Serial

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Доброго времени суток. Озадачился таким вопросом как отправить струкутуру по Serial порту, нашел в интеренете пару статей, но только вот они не работают так функция write() ругается на то что я ей структуру передаю "no matching function for call to...". Есть ли у вас мысли по этому поводу?

sadman41
Offline
Зарегистрирован: 19.10.2016

Есть мысли, естественно. И способы.

write() у нас что ожидает на входе?

b707
Offline
Зарегистрирован: 26.05.2017

MsFedkin пишет:

нашел в интеренете пару статей, но только вот они не работают так функция write() ругается на то что я ей структуру передаю

а в статьях что написано? неужели они структуры оператором write() передают?

inspiritus
Offline
Зарегистрирован: 17.12.2012

Хммм

а если я знаю длину переменной типа структ, например там три штуки по байту

и говорю, что

Union

Byte array[3]

Mystruct

Где 

Mystruct struct 

byte1

byte2

byte3

А потом этот самый array вытряхиваю через write как буфер?

Прошу не пинать за синтаксис:) прошу комментировать чисса принцип. Сработает ли в принципе такая конструкция?

b707
Offline
Зарегистрирован: 26.05.2017

inspiritus пишет:

Прошу не пинать за синтаксис:) прошу комментировать чисса принцип. Сработает ли в принципе такая конструкция?

сработает конечно, почему нет? Побайтно можно и "Войну и мир" пекреслать - только медленно и лишних движений много.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Угу, все никак не соберусь попробовать. Прикупил тут fram по совету с хабра. Там есть готовые классы для записи/чтения, но они побайтные, а мне надо большую и разношерстную структуру часто сохранять. А переписывать некогда и лень.

все планирую упереться попробовать через юнион, как например сделал для записи в еепром еэспишки. Но там был юнион например четырех байтов и флоата, а тут юнион 85 байтов и структа.

и кстати, а чем медленно то? Вытряхнуть массив фором?

b707
Offline
Зарегистрирован: 26.05.2017

inspiritus пишет:

и кстати, а чем медленно то? Вытряхнуть массив фором?

ну может и не медленнее... пробовать надо

sadman41
Offline
Зарегистрирован: 19.10.2016

Не медленнее. И достаточно одного приведения типа вместо юниона.

inspiritus
Offline
Зарегистрирован: 17.12.2012

А ето какЭто?

mixail844
Offline
Зарегистрирован: 30.04.2012

при имплементации  протоколов на Си,очень удобно union'ами пользоваться как при наполнении массива данными,при парсинге принятого массива, так и при нормальном дебаггинге( с возможносью пошагово пускать код - но это не про родную "среду разработки" ардуино).и обязательно надо помнить про Endianess.

еще можно вместо структуры обьявить класс(не знаю насколько это ущербно или выгодно в вашем случае) в котором имплементировать фунцию char*  <имя_класса>::Serialize() или char* <имя_класса>:: toString() , в котором и будет производиться сериализация полей(так правильно по русски?) класса в массив типа char*. а вывод данной функции "скармливать" функции Serial.write()

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Короче:

#pragma pack(push,1)
typedef struct
{
	uint8_t b1;
	uint8_t b2;
	uint16_t b16;
	uint32_t b32;
} MyStruct;
#pragm pack(pop)

MyStruct toSend;
uint8_t* p = (uint8_t*) &toSend;
for(size_t i=0;i<sizeof(MyStruct);i++)
	Serial.write(*p++);

пересылка структуры побайтово.

sadman41
Offline
Зарегистрирован: 19.10.2016

А если ещё учесть, что write() само умеет передавать sizeof() байт...

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Да передауют структуру функцией write 

void send (const structTable* table)
{
Serial.write((const char*)table, sizeof(structTable));  // 2 bytes.
}

И вот как передают

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

MsFedkin пишет:

И вот как передают

 

Это вопрос или утверждение?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:

А если ещё учесть, что write() само умеет передавать sizeof() байт...

Ну да, унутре тоже циклом проходит. Тут главное - чтобы человек принцип увидел, пмсм. Остальное, конечно - есть в доке.

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Утверждение 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вот кстати статья про FRAM 

Попробовал просто в пример передать имя структуры переменной (структуры) нифига не вышло.

sadman41
Offline
Зарегистрирован: 19.10.2016

Потому что надо было указатель на структуру передавать, а не имя.

inspiritus
Offline
Зарегистрирован: 17.12.2012

У массива имя вроде как и яаляется указателем , я предположил, что у структуры так же.

отсюда и попытка сделать юнион с массивом и передать имя массива, как в примере.

так получилось, что в далеком прошлом веке объектное программирование и применение указателей прошло мимо меня, я писал аппаратные приложения на паскале для испытательного оборудования и на ассемблере для бортового. 

Во никак и не освою до сих пор :(

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

- Указатели и обьектно ориентированное программирование совершенно разные аещи.

- В Паскале указатели тоже есть.