короче делаешь вот такую структуру Код (C++): struct StrSend { char testStr[32]; uint16_t test; uint8_t crc; }; StrSend dataTx = {"",0,0}; дальше когда надо суешь туда строку и переменные вот так Код (C++): strcpy(dataTx.testStr,"djigurda"); dataTx.test=0xFAFB; dataTx.crc=0xFC; и она начинает нормально отправляться этой приблудной функцией. размер массива (32) подбирается исходя из самой возможной длинной строки которая туда может быть положена. при положении желательно следить чтоб не переполнить
потому как компилятор не обязан располагать поля структуры также последовательно, как он это делает с массивом.
а до этого как планировалось собирать? по идее в приемнике делаешь такую же структуру, и в нее побайтово копируешь пришедшее. в результате эта строка там сама окажется в собранном виде.
Так вопрос то и был - как на приемнике собрать все обратно. На приемнике создал структуру. Принимаю байты. А как эти байты преобразовать в структуру? Данные же принимаются как набор байт.
Чтобы это понять, нужно вывести в монитор порта: Код (C++): Serial.println(sizeof(dataTx)); На Нано и на ESP А потом побайтово вывести значения ячеек памяти, занимаемых структурой, на нано и на ЕСП.
сказали же - принимай данные в массив. А из массива заполняй поля структуры. Только не через указатель - наступишь на те же грабли.
Так я и на том же есп считаю. Сначала посчитал контрольную сумму без бита контрольной суммы, потом дописал ее в структуру, пересчитал и вместо нуля получаю значение, что означает ошибку передаваемых данных. В коде же все написал, как делал.
memcpy(&dataTx,buf,sizeof(dataTx)); но опять же, если там структуры будут разные из-за компиляторов, то ничего не получится ящитаю, проще всего все передавать текстовым протоколом
парсинг - это разбор строки. Здесь нет никаких строк. Если такие сложности с такими простыми вещами - отказывайся от структуры.
А как называется разбор массива по элементам структуры? Это не парсинг массива? Это вопрос термина или содержания действия? (Хотел бы разобраться, чтобы использовать этот термин правильно). Я использую его как: разбор набора символов по элементам, чтобы потом можно было их использовать (обращаться к ним).
да не нужен никакой парсинг. нужно только определиться, что есть пакет данных, в нем в ячейках условно с 0 по 32 лежит строка символов, с 33 по 34 лежит переменная, а в 35 лежит срс, а потом по этим индескам и вынимать все что нужно. ну и класть туда точно так же в правильные места, а не в структуру
нет, не парсинг. Просто операцией присваивания переносишь значения из одной области памяти в другую. Каким инструментом это будет сделано - личное дело программиста. Если есть DMA в МК - то лучше через него, хотя иногда это и медленнее, чем просто копирование.
Если унутре структуры хранятся только типы-значения, то проблем нет, рассматривай саму структуру как массив байт определенного размера и с той и с другой стороны, потом приведешь типы как тебе надо. А вот если в массиве хранится хоть один указатель, тогда тебе надлежит немедленно ехать в Якутию.
То есть надо определить адрес начала структуры, к нему прибавлять адреса побитно, куда складываются полученные биты. Понятно. А можно тогда экспертное мнение - лучше массивом символов передавать данные или структурой? Из MySQL я получаю данные get запросом, то есть текстовую строку. Хотел ее разбирать в есп, у него мощностей побольше будет, а в нано хотел отправлять структуру. Но могу и в нано разобрать точно так же. Что требует меньших затрат памяти и времени обработки?
если есть уверенность что и в нане и в есп структуры будут точно одинаковой формы, то без разницы. но я в этом не шарю и ваще не эксперт ни разу только ведь можно передавать и не массив символов и не структуру, а пакет данных - то есть обычный массив байтов, в котором заранее известно где что лежит
Там с одной стороны АВР, с другой стороны ЕСП, без pragma pack на ЕСП выравнивание увеличит размер структуры, поля не совпадут :-(