Страница 1 из 2
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 20:29
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 не только не пугает, но уже и влечет

Запаковка/распаковка данных
Добавлено: 28 июл 2018, 20:38
Sancho
код панель переваривает?
функции.
Отправлено спустя 1 минуту 49 секунд:
Добавь в названии темы упоминание о панели - знатоки данного железа наверняка в курсе.
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 21:21
Alias
Панель то? Ну, упаковать умножением сможет, разобрать из числа - не уверен, но больше в себе, тк формулы большие и придется промежуточные переменные вводить. Текст, наоборот - разберет, но не соберет. Ну, как мне кажется на настоящий момент понимания.
Отправлено спустя 22 минуты 54 секунды:
Тут, если брать конкретно мой пример, хочется иметь легкий блок распаковки пяти переменных из одной в среде flprog. Если из блоков арифметики строить, это вавилонская башня получится и не факт, что места съесть меньше.
Но если еще и в панели получится - вообще отлично!
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 21:35
kalobyte
ты никак не упакуеш, твоя панель должна поддерживать метод упаковки, чтобы распаковать
именно поэтому придуман стандартный протокол модбас, но он строки не поддерживает
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 21:43
fsergei70
Alias писал(а): 28 июл 2018, 20:29Если их просто склеить, как текст, все уместится в переменную UL с ее диапазоном от 0 до 4294967295, то есть вместо пяти переменных будет всего одна со значением 3545632398. Одну переменную переслать, как я наивно полагаю, проще и быстрее, чем пять.
Не пойму смысла всех этих преобразований. 5 переменных до 255 можно передать 5 байтами если выбрать тип Byte а число с 10 цифрами будет типа Unsigned long Integer и передается 4 байтами из за 1 байта стоит ли городить весь этот огород
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 21:50
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кб только на передачу одной переменной
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 21:51
Alias
В одну переменную средствами панели можно упаковать - арифметику панель знает. Это я не знаю, как это красиво раскрутить потом на Меге и уточнил, нет ли простого способа у программистов. Ведь в flprog даже сложить три числа одним блоком не получится - два подавай.
Смысл преобразований прост - передавать не пятью блоками из flprog, а одним, поскольку каждый из этих блоков - что "задать параметр", что "получить параметр" - откусывают ощутимые ресурсы. Вопрос не в экономии байт, а в экономии на блоках и, в итоге, на памяти, в которую лучше воткнуть функционал устройства, а не простую пересылку.
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 21:56
kalobyte
для передачи пакета обычно используется формат
1байт - команда
1 байт длина данных в байтах, который вычисляется функцией sizeof(struct_name)
данные до 255 байт
если бы это было в коде, то это была бы структура данных и на приемном контроллере он бы знал, что пришла структура, тип ее определяется в номере команды, а в данных идет набор непонятных данных, но т.к. туда была засунута еще одна структура с полями, то на приемной стороне данные тоже будут преобразованны в структуру и разобраны без ошибки
по сути это бинарный протокол
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 22:01
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? Просто так не умножишь ведь
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 22:15
Alias
8, 3, 7, 1, 0 это 0803070100 = 0*1 + 1* 100 + 7*10000 и так далее. Есть и ограничения - первая переменная не может быть больше 42, при этом пятая - не больше 95, если первая равна 42. Но это ограничение понятно и в ряде случаев приемлемо.
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 22:25
fsergei70
А если так берем 4 числа типа Byte записываем по очереди 1 число в первый байт 2 во второй потом считываем эти 4 байта любым типом 4 байтной переменной и передаем Ну а после передачи обратный процесс раскодировки
Отправлено спустя 3 минуты 36 секунд:
Саня по такому принципу блоки для EPROM кажется делал
Запаковка/распаковка данных
Добавлено: 28 июл 2018, 23:06
kalobyte
я придумал годный вариант
в новой версии есть структуры, надо допилить их, чтобы был вход и выход сериал и тогда можно будет послать структуру в порт
Запаковка/распаковка данных
Добавлено: 29 июл 2018, 00:20
Alias
Я тоже хотел в EEPROM так записывать, но пока хватает
Про четыре однобайтных числа, чтобы запихнуть в четырехбайтную переменную UL, тоже думал, но не знаю, как провернуть, хотя, по логике, должно быть проще.
Новую версию пока даже не смотрел. В стабильной то частенько осложнения на ровном месте возникают, а со структурами и вовсе дело - табак.
Отправлено спустя 14 минут 3 секунды:
Думаю, проще будет поступить так: собрать математикой пять переменных в одну, конвертировать в строку и отправить на панель. На панели разобрать текст на пять фрагментов, конвертировать их в числа и расставить по нужным местам. Перед отправкой обратно собрать значения из тех самых мест, математикой склеить и сконвертировать в строку. Кажется, вполне реально. На неделе попробую.
Запаковка/распаковка данных
Добавлено: 29 июл 2018, 00:32
Hijin
Alias писал(а): 29 июл 2018, 00:20Думаю, проще будет поступить так: собрать математикой пять переменных в одну, конвертировать в строку и отправить на панель. На панели разобрать текст на пять фрагментов, конвертировать их в числа и расставить по нужным местам. Перед отправкой обратно собрать значения из тех самых мест, математикой склеить и сконвертировать в строку. Кажется, вполне реально. На неделе попробую.
Вернуться к началу
Быстрый ответ
А если так собрать математикой пять переменных в одну и отправить на панель. На панели конвертировать в строку разобрать текст на пять фрагментов, конвертировать их в числа и расставить по нужным местам.
Запаковка/распаковка данных
Добавлено: 29 июл 2018, 00:37
Alias
А, ну да, зарапортовался )))
Запаковка/распаковка данных
Добавлено: 29 июл 2018, 07:23
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;
Запаковка/распаковка данных
Добавлено: 29 июл 2018, 10:45
kalobyte
Alias писал(а): 29 июл 2018, 00:20Думаю, проще будет поступить так: собрать математикой пять переменных в одну, конвертировать в строку и отправить на панель.
не прокатит, я вчера пробовал 3 переменные сложить как строки, 5кб сожрало
пример [ref=#ff8000]Sancho[/ref] годный, но нет стандартных блоков побайтового сдвига
Запаковка/распаковка данных
Добавлено: 29 июл 2018, 10:55
Sancho
Типа так
Отправлено спустя 1 минуту 45 секунд:
[ref]Alias[/ref], Добавите входы/выходы, внутренности сами. Или каскадируйте, что сожрёт память в виде переменных.
Запаковка/распаковка данных
Добавлено: 29 июл 2018, 16:47
Alias
О, как много написали, спасибо! Буду разбираться, а пока поставил скачиваться бету.
Отправлено спустя 2 часа 9 минут 49 секунд:
Sancho писал(а): 29 июл 2018, 10:55Добавите входы/выходы, внутренности сами
Это нужно редактировать блок? Открыл и не могу разобраться, что куда добавлять.
А сейчас что блоки делают? "Сдвиг >>" по логике еще могу прикинуть, то есть, как я понимаю, на выходе дает тот байт четырехбайтного входного числа, смещение на который укажем на входе.
"Сдвиг <<" передает байт в выходную переменную с указанным смещением? То есть нужно как-то синхронизировать входную переменную и смещение, чтобы записалось по адресу?
Стенда под рукой нет, унес на работу коротать дежурства и пока могу только паниковать в уме

Запаковка/распаковка данных
Добавлено: 29 июл 2018, 18:34
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 байта