Запаковка/распаковка данных

Вопросы от новичков
Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27 ноя 2017, 13:15
Откуда: Rus44
Имя: Michael
Контактная информация:

Запаковка/распаковка данных

Сообщение Alias »

Гуглил и не нашел. Видимо, непрограммисту сложно такое найти. Видел только упаковку байт. А хочу передавать одной переменной сразу пять.
Имеем пять десятичных двухразрядных значений, то есть от 0 до 99. Например, 35, 45, 63, 23 и 98.
Если их просто склеить, как текст, все уместится в переменную UL с ее диапазоном от 0 до 4294967295, то есть вместо пяти переменных будет всего одна со значением 3545632398. Одну переменную переслать, как я наивно полагаю, проще и быстрее, чем пять.
Собрать ее тоже несложно: 98 + 23*100 + 63*10000 + 45*1000000 + 35*100000000. Flprog справится на ура.
А вот как разобрать обратно?
На бумаге получаются увесистые многоэтажные формулы. Может, есть какая-то программистская хитрость и это все делается легко и непринужденно?
Задача банальна - передавать данные на панель Nextion и получать обратно. Если плодить кучу блоков для передачи отдельных значений, код разрастается как на дрожжах, поскольку их может быть за полсотню и даже Мега не все может вместить и начинает ругаться IDE.
Скупость доступных операций самой панели такова, что передачу на панель упакованных данных вижу только в тексте, тк панель, кажется, умеет только разбирать текст, а вот собирать в текстовую строку не нашел как, поэтому в обратную сторону проще упаковать в число и уже его на Меге разбирать на пять переменных.
Пусть мой взгляд и наивен, но я непрограммист. Но понемногу самообучающийся и уже язык Nextion не только не пугает, но уже и влечет :smile469:
Последний раз редактировалось Alias 28 июл 2018, 20:54, всего редактировалось 1 раз.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

Запаковка/распаковка данных

Сообщение Sancho »

код панель переваривает?
функции.

Отправлено спустя 1 минуту 49 секунд:
Добавь в названии темы упоминание о панели - знатоки данного железа наверняка в курсе.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27 ноя 2017, 13:15
Откуда: Rus44
Имя: Michael
Контактная информация:

Запаковка/распаковка данных

Сообщение Alias »

Панель то? Ну, упаковать умножением сможет, разобрать из числа - не уверен, но больше в себе, тк формулы большие и придется промежуточные переменные вводить. Текст, наоборот - разберет, но не соберет. Ну, как мне кажется на настоящий момент понимания.

Отправлено спустя 22 минуты 54 секунды:
Тут, если брать конкретно мой пример, хочется иметь легкий блок распаковки пяти переменных из одной в среде flprog. Если из блоков арифметики строить, это вавилонская башня получится и не факт, что места съесть меньше.
Но если еще и в панели получится - вообще отлично!
kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22 окт 2016, 14:22

Запаковка/распаковка данных

Сообщение kalobyte »

ты никак не упакуеш, твоя панель должна поддерживать метод упаковки, чтобы распаковать
именно поэтому придуман стандартный протокол модбас, но он строки не поддерживает
fsergei70
Капитан
Сообщения: 861
Зарегистрирован: 17 ноя 2015, 20:36
Имя: Сергей
Благодарил (а): 41 раз
Поблагодарили: 9 раз

Запаковка/распаковка данных

Сообщение fsergei70 »

Alias писал(а): 28 июл 2018, 20:29Если их просто склеить, как текст, все уместится в переменную UL с ее диапазоном от 0 до 4294967295, то есть вместо пяти переменных будет всего одна со значением 3545632398. Одну переменную переслать, как я наивно полагаю, проще и быстрее, чем пять.
Не пойму смысла всех этих преобразований. 5 переменных до 255 можно передать 5 байтами если выбрать тип Byte а число с 10 цифрами будет типа Unsigned long Integer и передается 4 байтами из за 1 байта стоит ли городить весь этот огород
kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22 окт 2016, 14:22

Запаковка/распаковка данных

Сообщение kalobyte »

fsergei70 писал(а): 28 июл 2018, 21:43из за 1 байта стоит ли городить весь этот огород
автор имел в виду, что для передачи одной переменной флпрог генерит вот такой код

Код: Выделить всё

//Плата:1
if(!(( _gtv1)==(_SV1CP0))){_SV1CP0needSend = 1;} _SV1CP0 = _gtv1; 


if(_SV1CP0needSend) {
_SV1CP0needSend = 0;
Serial.write (1);
Serial.print (1);
Serial.write (2);
Serial.print (_SV1CP0);
Serial.write (3);}

}
Sketch uses 1856 bytes (5%) of program storage space. Maximum is 32256 bytes.
Global variables use 187 bytes (9%) of dynamic memory, leaving 1861 bytes for local variables. Maximum is 2048 bytes.
почти 2кб только на передачу одной переменной
Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27 ноя 2017, 13:15
Откуда: Rus44
Имя: Michael
Контактная информация:

Запаковка/распаковка данных

Сообщение Alias »

В одну переменную средствами панели можно упаковать - арифметику панель знает. Это я не знаю, как это красиво раскрутить потом на Меге и уточнил, нет ли простого способа у программистов. Ведь в flprog даже сложить три числа одним блоком не получится - два подавай.
Смысл преобразований прост - передавать не пятью блоками из flprog, а одним, поскольку каждый из этих блоков - что "задать параметр", что "получить параметр" - откусывают ощутимые ресурсы. Вопрос не в экономии байт, а в экономии на блоках и, в итоге, на памяти, в которую лучше воткнуть функционал устройства, а не простую пересылку.
kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22 окт 2016, 14:22

Запаковка/распаковка данных

Сообщение kalobyte »

для передачи пакета обычно используется формат
1байт - команда
1 байт длина данных в байтах, который вычисляется функцией sizeof(struct_name)
данные до 255 байт

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

по сути это бинарный протокол
fsergei70
Капитан
Сообщения: 861
Зарегистрирован: 17 ноя 2015, 20:36
Имя: Сергей
Благодарил (а): 41 раз
Поблагодарили: 9 раз

Запаковка/распаковка данных

Сообщение fsergei70 »

Alias писал(а): 28 июл 2018, 20:29Имеем пять десятичных двухразрядных значений, то есть от 0 до 99. Например, 35, 45, 63, 23 и 98.
Если их просто склеить, как текст, все уместится в переменную UL с ее диапазоном от 0 до 4294967295, то есть вместо пяти переменных будет всего одна со значением 3545632398. Одну переменную переслать, как я наивно полагаю, проще и быстрее, чем пять.
Собрать ее тоже несложно: 98 + 23*100 + 63*10000 + 45*1000000 + 35*100000000.
Может и есть выгода но тут еще вопрос Как будет выглядеть подсчет если числа будут меньше 10? Просто так не умножишь ведь
Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27 ноя 2017, 13:15
Откуда: Rus44
Имя: Michael
Контактная информация:

Запаковка/распаковка данных

Сообщение Alias »

8, 3, 7, 1, 0 это 0803070100 = 0*1 + 1* 100 + 7*10000 и так далее. Есть и ограничения - первая переменная не может быть больше 42, при этом пятая - не больше 95, если первая равна 42. Но это ограничение понятно и в ряде случаев приемлемо.
fsergei70
Капитан
Сообщения: 861
Зарегистрирован: 17 ноя 2015, 20:36
Имя: Сергей
Благодарил (а): 41 раз
Поблагодарили: 9 раз

Запаковка/распаковка данных

Сообщение fsergei70 »

А если так берем 4 числа типа Byte записываем по очереди 1 число в первый байт 2 во второй потом считываем эти 4 байта любым типом 4 байтной переменной и передаем Ну а после передачи обратный процесс раскодировки

Отправлено спустя 3 минуты 36 секунд:
Саня по такому принципу блоки для EPROM кажется делал
kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22 окт 2016, 14:22

Запаковка/распаковка данных

Сообщение kalobyte »

я придумал годный вариант
в новой версии есть структуры, надо допилить их, чтобы был вход и выход сериал и тогда можно будет послать структуру в порт
Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27 ноя 2017, 13:15
Откуда: Rus44
Имя: Michael
Контактная информация:

Запаковка/распаковка данных

Сообщение Alias »

Я тоже хотел в EEPROM так записывать, но пока хватает :)
Про четыре однобайтных числа, чтобы запихнуть в четырехбайтную переменную UL, тоже думал, но не знаю, как провернуть, хотя, по логике, должно быть проще.
Новую версию пока даже не смотрел. В стабильной то частенько осложнения на ровном месте возникают, а со структурами и вовсе дело - табак.

Отправлено спустя 14 минут 3 секунды:
Думаю, проще будет поступить так: собрать математикой пять переменных в одну, конвертировать в строку и отправить на панель. На панели разобрать текст на пять фрагментов, конвертировать их в числа и расставить по нужным местам. Перед отправкой обратно собрать значения из тех самых мест, математикой склеить и сконвертировать в строку. Кажется, вполне реально. На неделе попробую.
Аватара пользователя
Hijin
Лейтенант
Сообщения: 325
Зарегистрирован: 22 авг 2017, 11:08
Откуда: Винница
Имя: Юрий

Запаковка/распаковка данных

Сообщение Hijin »

Alias писал(а): 29 июл 2018, 00:20Думаю, проще будет поступить так: собрать математикой пять переменных в одну, конвертировать в строку и отправить на панель. На панели разобрать текст на пять фрагментов, конвертировать их в числа и расставить по нужным местам. Перед отправкой обратно собрать значения из тех самых мест, математикой склеить и сконвертировать в строку. Кажется, вполне реально. На неделе попробую.
Вернуться к началу
Быстрый ответ
А если так собрать математикой пять переменных в одну и отправить на панель. На панели конвертировать в строку разобрать текст на пять фрагментов, конвертировать их в числа и расставить по нужным местам.
Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27 ноя 2017, 13:15
Откуда: Rus44
Имя: Michael
Контактная информация:

Запаковка/распаковка данных

Сообщение Alias »

А, ну да, зарапортовался )))
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

Запаковка/распаковка данных

Сообщение Sancho »

Попробовать так, если прокатит

Код: Выделить всё

// упаковка байтовых переменных
unsigned int eprst=0; // объявляем выходную переменную, с инициализацией
eprst = input_01; // фаршируем
eprst = (eprst << 8) || input_02;
eprst = (eprst << 8) || input_03;
eprst = (eprst << 8) || input_04;

// распаковка
out_04 = gde_vzyal & 0xFF; //gde_vzyal - приняли лонг инт
gde_vzyal >>= 8; 
out_03 = gde_vzyal & 0xFF; // принимаем дальше
gde_vzyal >>= 8; 
out_02 = gde_vzyal & 0xFF;
gde_vzyal >>= 8; 
out_01 = gde_vzyal & 0xFF;
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22 окт 2016, 14:22

Запаковка/распаковка данных

Сообщение kalobyte »

Alias писал(а): 29 июл 2018, 00:20Думаю, проще будет поступить так: собрать математикой пять переменных в одну, конвертировать в строку и отправить на панель.
не прокатит, я вчера пробовал 3 переменные сложить как строки, 5кб сожрало

пример [ref=#ff8000]Sancho[/ref] годный, но нет стандартных блоков побайтового сдвига
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

Запаковка/распаковка данных

Сообщение Sancho »

Типа так

Отправлено спустя 1 минуту 45 секунд:
[ref]Alias[/ref], Добавите входы/выходы, внутренности сами. Или каскадируйте, что сожрёт память в виде переменных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27 ноя 2017, 13:15
Откуда: Rus44
Имя: Michael
Контактная информация:

Запаковка/распаковка данных

Сообщение Alias »

О, как много написали, спасибо! Буду разбираться, а пока поставил скачиваться бету.

Отправлено спустя 2 часа 9 минут 49 секунд:
Sancho писал(а): 29 июл 2018, 10:55Добавите входы/выходы, внутренности сами
Это нужно редактировать блок? Открыл и не могу разобраться, что куда добавлять.
А сейчас что блоки делают? "Сдвиг >>" по логике еще могу прикинуть, то есть, как я понимаю, на выходе дает тот байт четырехбайтного входного числа, смещение на который укажем на входе.
"Сдвиг <<" передает байт в выходную переменную с указанным смещением? То есть нужно как-то синхронизировать входную переменную и смещение, чтобы записалось по адресу?
Стенда под рукой нет, унес на работу коротать дежурства и пока могу только паниковать в уме :)
kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22 окт 2016, 14:22

Запаковка/распаковка данных

Сообщение kalobyte »

[ref]Alias[/ref],

есть переменная на 4 байта eprst
[3][2][1][0]

eprst = input_01; записывает в ячейку 0 число из input_01
eprst = (eprst << 8) || input_02;

теперь это значение в первой ячейке сдвигаем влево на вторую ячейку
eprst << 8

на месте первой ячейки опять пусто, поэтому мы опять записываем туда, но уже значение из input_02

обрати внимание, что что пришло последним в переменной input_04 - оно лежит в нулевой ячейке справа и берется от туда первым
out_04 = gde_vzyal & 0xFF;

если переменная out_04 типа байт, то надо делать каст
out_04 = (char)gde_vzyal & 0xFF;


[ref=#ff8000]Sancho[/ref],
переменная инт 2 байта
надо лонг инт на 4 байта
Ответить

Вернуться в «Начинающим»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость