Как применить формулу к последовательности байт?
- ElectroMechaniC
- Сержант
- Сообщения: 230
- Зарегистрирован: 21 сен 2016, 06:50
- Откуда: Донецк
- Имя: Юрий
Как применить формулу к последовательности байт?
Привет! Есть задача! есть входная последовательность HEX => 7F 22 12
мне нужно применить к ней формулу
(1.0*(10*((A*16777216+B*65536+C*256+D)&268435455)))/1000
Научите как это сделать? Желательно блоком, с возможностью подмены входного значения и изменения формулы расчёта...
мне нужно применить к ней формулу
(1.0*(10*((A*16777216+B*65536+C*256+D)&268435455)))/1000
Научите как это сделать? Желательно блоком, с возможностью подмены входного значения и изменения формулы расчёта...





- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Как применить формулу к последовательности байт?
Это число или поток из uart?
Если число, long, то : Отправлено спустя 3 минуты 22 секунды:
Кстати, в формуле четыре байта, A-D, а во входной последовательности - три байта.... Или это как пример?
Если определиться, где какой байт - блок запросто сделает любой.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- ElectroMechaniC
- Сержант
- Сообщения: 230
- Зарегистрирован: 21 сен 2016, 06:50
- Откуда: Донецк
- Имя: Юрий
Как применить формулу к последовательности байт?
[ref=#ff8000]Sancho[/ref], Да я тоже заметил, скорее всего последний байт просто 00,
Это ответ полученный через UART. последовательность такова A-7F: B-22: C-12: D-(предположительно) 00.
Эта последовательность в качестве примера, она постоянно будет обновляться, должна проходить через формулу и выдавать конечный результат в виде десятичного числа...
Отправлено спустя 3 минуты 18 секунд:
Всё правильно - поток)
Отправлено спустя 2 минуты 32 секунды:
Так! Разбили на 4е байта, потом каждый по формуле "переарифметили"
А вот как быть вот с этим : ...)&268435455- это побитовое "и " , как его применить?
Это ответ полученный через UART. последовательность такова A-7F: B-22: C-12: D-(предположительно) 00.
Эта последовательность в качестве примера, она постоянно будет обновляться, должна проходить через формулу и выдавать конечный результат в виде десятичного числа...
Отправлено спустя 3 минуты 18 секунд:
Всё правильно - поток)
Отправлено спустя 2 минуты 32 секунды:
Так! Разбили на 4е байта, потом каждый по формуле "переарифметили"
А вот как быть вот с этим : ...)&268435455- это побитовое "и " , как его применить?





Как применить формулу к последовательности байт?
Если я правильно Вас пронял, и "7F" это "А" в Вашей формуле; B==0x22 ; C==0x12, то в таком случае легче нам будет, если мы представим все числовые константы как бинарные числа и вспомним что AVR, в принципе своём умеют из математических простых операций только сложение и вычитание и битовый сдвиг. Для умножения/деления применяются сложные функции, которые спрятаны в библиотеках.
в таком случае Ваша формула
(1.0*(10*((A*16777216+B*65536+C*256+D)&268435455)))/1000
принимает вид
(1.0*(10*((((A<<24)+(B<<16)+(C<<8)+D)&268435455))/1000, убираем совершенно лишнюю операцию- &B1111111111111111111111111111
сокращаем лишние нолики в знаменателе и числителе
(((A<<24)+(B<<16)+(C<<8)+D))/100.0
и если я нигде не ошибся (п.ж. исправте, я только учусь)
дальше, засовываем формулу в Пользовательский Блок и... вспоминаем, что Ув.Автор, анонсировав включение поддержки переменных word и double не включил их в Пользовательские блоки. Удачи!
- ElectroMechaniC
- Сержант
- Сообщения: 230
- Зарегистрирован: 21 сен 2016, 06:50
- Откуда: Донецк
- Имя: Юрий
Как применить формулу к последовательности байт?
А! Совсем забыл! Я буду работать с каждым байтом отдельно!!!!!
с помощью :
с помощью :
У вас нет необходимых прав для просмотра вложений в этом сообщении.





- ElectroMechaniC
- Сержант
- Сообщения: 230
- Зарегистрирован: 21 сен 2016, 06:50
- Откуда: Донецк
- Имя: Юрий
Как применить формулу к последовательности байт?
То есть это нужно всего лишь для того, что бы убрать лишние ноли? это 2й операндр, что ли?
и да! мне нужно как то этот процесс автоматизировать. в буках хорошо но как на деле не понятно))) уж извините не программист))))





Как применить формулу к последовательности байт?
это Ваше DEC268435455 == 0b1111111111111111111111111111 в бинарном представлении, которое делает операцию побитового И совершенно лишней.
Изв. не посчитал знаки, в блоке всё правильно кажется.
Сейчас [spoiler title=накидал ПБлок] [/spoiler] в проекте, только мат. действие /100,0 вынес за пределы блока.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Labu559 05 окт 2018, 12:52, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Как применить формулу к последовательности байт?
[ref]Labu559[/ref], Не соглашусь. Эта операция уберёт четыре старших бита в числе, 32 битном.
Отправлено спустя 10 минут 50 секунд:
Собираем long из байтов: Если что, в конце дописать:
out = (out & 268435455) / 100.0;
Отправлено спустя 4 минуты 56 секунд:
Соответственно, при смещении более 8 получим нули.
Необходимо приводить "А" перед преобразованием к другому типу данных.
Можете проверить.
Уже писал где-то на форуме...
Отправлено спустя 6 минут 46 секунд:
[ref]ElectroMechaniC[/ref], Обновил, была очепятка при копипасту...
Отправлено спустя 10 минут 50 секунд:
Собираем long из байтов: Если что, в конце дописать:
out = (out & 268435455) / 100.0;
Отправлено спустя 4 минуты 56 секунд:
При операции (A<<24) и остальным подобным, где "А" - тип байт, имеем всего 8 байт!!!
Соответственно, при смещении более 8 получим нули.
Необходимо приводить "А" перед преобразованием к другому типу данных.
Можете проверить.
Уже писал где-то на форуме...
Отправлено спустя 6 минут 46 секунд:
[ref]ElectroMechaniC[/ref], Обновил, была очепятка при копипасту...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- AlexCrane
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Как применить формулу к последовательности байт?
viewtopic.php?f=87&t=3122&p=55223#p55223
Здесь выкладывал данные функции, и в новой версии FLProg они есть в числе стандартных
Здесь выкладывал данные функции, и в новой версии FLProg они есть в числе стандартных
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Как применить формулу к последовательности байт?
И правильно делаете, исправился выше. А по сдвигам, я в курсе, попадал на то, что компилятор предупреждает и пропускает такое безобразие. Надо делать так- value = (((A|0UL)<<24)+((B|0UL)<<16)+((C|0UL)<<8)+D);
На заметку, не поставил в ПБлоке точку с запятой в конце действия, "никто" не ругался на некорректность блока, и при вызове компиляции в IDE FLProg каждый раз [spoiler title=вылетает с логом] [/spoiler]
Ув. [ref]AlexCrane[/ref], Вы ошибаетесь в блоке "4byte_to_long_(CODE).ubi" к сожалению , и [spoiler title=делаете то о чём предупредил Ув.Sancho]C:\Users\SL\AppData\Local\Temp\flprog\pr10\pr10.ino: In function 'void loop()':
C:\Users\SL\AppData\Local\Temp\flprog\pr10\pr10.ino:32:113: warning: left shift count >= width of type
out_100076728_1 = ((four_100076728_1 << 0) & 0xFF) + ((three_100076728_1 << 8) & 0xFFFF) + ((two_100076728_1 << 16) & 0xFFFFFF) + ((one_100076728_1 << 24) & 0xFFFFFFFF);
^
C:\Users\SL\AppData\Local\Temp\flprog\pr10\pr10.ino:32:152: warning: left shift count >= width of type
out_100076728_1 = ((four_100076728_1 << 0) & 0xFF) + ((three_100076728_1 << 8) & 0xFFFF) + ((two_100076728_1 << 16) & 0xFFFFFF) + ((one_100076728_1 << 24) & 0xFFFFFFFF);
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Labu559 05 окт 2018, 13:42, всего редактировалось 2 раза.
- ElectroMechaniC
- Сержант
- Сообщения: 230
- Зарегистрирован: 21 сен 2016, 06:50
- Откуда: Донецк
- Имя: Юрий
Как применить формулу к последовательности байт?
тоесть моя последовательность это и есть преобразование в десятичное число / на 100 ?





- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Как применить формулу к последовательности байт?
Да, с предварительным отбрасыванием четырёх старших битов. Почему они лишние - не знаю...ElectroMechaniC писал(а): 05 окт 2018, 13:26тоесть моя последовательность это и есть преобразование в десятичное число / на 100 ?
Отправлено спустя 35 минут 50 секунд:
А вот мой любимый "режим" сложения/собирания байтов. При этом сама переменная "out" не используется

Использую его при передаче/приёме по I2C, при работе с внешней памятью при размере переменной более одного байта, флоат в том числе.
Разборка почти аналогично.
Код: Выделить всё
byte* ptrin_x;
ptrin_x = (byte*)(& out );
*ptrin_x = in_H_byte;
*(ptrin_x+1) = in_h_byte;
*(ptrin_x+2) = in_l_byte;
*(ptrin_x+3) = in_L_byte;
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Как применить формулу к последовательности байт?
Теперь разрешите мне усомниться.

Может потому, что не влезут во float? Я потому и писал о double и вынес деление на 100,0 из блока.
[spoiler title=Числа с плавающей точкой ]Типы данных с плавающей точкой хранятся в памяти иначе, чем целочисленные. Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка. Величины типа float занимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Мантисса — это число, большее 1.0, но меньшее 2.0. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.[/spoiler]
Последний раз редактировалось Labu559 05 окт 2018, 20:11, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Как применить формулу к последовательности байт?

Показания одометра не влезли во флоат...


мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Как применить формулу к последовательности байт?
Александр, ну так не честно. Откуда мне знать и зачем, что речь идёт об одометре? Это первый раз упомянулось в предыдущем 14-м сообщении. Для меня показатель - калькулятор программиста и 32-х или ставшее уже 28-и битное слово разделённое на 100.0. И ещё,
которые всегда, при любом значении А будут == 0, и после чего не влезают ещё 4 старших бита этого же А при значениях больше 127 (0xF). Может тогда есть смысл облегчить страдания Arduino и вставить строку if (A>0xF) A=0xF;
Пожалуй лучше объяснит проект ниже с максимальными значениями, которые могут принимать байтовые B,C,D и переключением значения A с 255(0xFF) к 127(0x0F). Включать компиляцию плат при проверке.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Как применить формулу к последовательности байт?
Может я и не сильно шарю в С++, но как 127 == 0xF, 0x0F ???? Я всегда считал F==15.....Labu559 писал(а): 05 окт 2018, 20:17которые всегда, при любом значении А будут == 0, и после чего не влезают ещё 4 старших бита этого же А при значениях больше 127 (0xF). Может тогда есть смысл облегчить страдания Arduino и вставить строку if (A>0xF) A=0xF;
Пожалуй лучше объяснит проект ниже с максимальными значениями, которые могут принимать байтовые B,C,D и переключением значения A с 255(0xFF) к 127(0x0F).

Пойду учится...
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Как применить формулу к последовательности байт?
Александр, ну елки-палки, никто не сомневается в тебе, даже более того, я уверен что ты прекрасно понял, что я имел ввиду под "A с 255(0xFF) к 127(0x0F)", хотя должен был написать 0x000000FF и 0x0000000F , и как это [spoiler title=выглядит на калькуляторе где гасятся незначащие нули] [/spoiler]. Хорошо если это поможет нашему взаимопониманию и решению проблемы /задачи ТС, - у меня с этим произошла субботница. Давай перейдём к помощи человеку, ведь там явно что-то не так. Я вчера попробовал обсчитать сколько-же влезает в Флоат с одним знаком после запятой, задавшись вопросом, неужели у меня так всё плохо с Си, хотя и никогда не утверждал обратное. У меня получилось 4194672,0 и с двумя знаками- 42945376,00. В проекте TestFloat.flp, после всех действий, максимальное число получается- 2684354,5. Это хоть с твоим (исправленным) блоком, хоть с моим. Наверное я тоже

У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Как применить формулу к последовательности байт?
[ref]Labu559[/ref], Василий, hex 0xF или 0x0F - это dec 15, а 127 - всего на 1 бит(старший) меньше 255, и это уже 0x7F.
Это и ввело меня в заблуждение.
Субботница у меня будет сегодня к вечеру, а
теста, результатов потока наших мыслей/идей [ref]ElectroMechaniC[/ref] пока не провёл/выложил.
Отправлено спустя 8 минут 26 секунд:
16777216 - это единица в старшем байте слова. Почему я не могу умножить её на любой байт?
О преобразовании во флоат пока молчу.
Это и ввело меня в заблуждение.
Субботница у меня будет сегодня к вечеру, а
теста, результатов потока наших мыслей/идей [ref]ElectroMechaniC[/ref] пока не провёл/выложил.
Отправлено спустя 8 минут 26 секунд:
Не могу согласится.Labu559 писал(а): 05 окт 2018, 20:17И ещё,которые всегда, при любом значении А будут == 0, и после чего не влезают ещё 4 старших бита этого же А при значениях больше 127 15Sancho писал(а): ↑Вчера [12:33]
Эта операция уберёт четыре старших бита в числе, 32 битном.
16777216 - это единица в старшем байте слова. Почему я не могу умножить её на любой байт?
О преобразовании во флоат пока молчу.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Как применить формулу к последовательности байт?
Да и я как-то не очень и придаю словам значение при тех.обсуждениях (у многих языковые барьеры), мне со схемами и диаграмами и т.п. проще, потому и в связи с озвученными намерениями по субботнице

Саша, посмотри, пожалуйста, методы и результаты в этом проекте. С 4-й платой- понятно и так, выше писали уже. Я же понимаю, что Флоат- тип данных одинарной точности, но чтобы старших 4бита так мизерно влияли на показания в 3-й плате (если я правильно понял озвученный тобою алгоритм) и вообще не влияли на 1и2-й плате. Вот о чём я, чем больше пытаюсь объясниться словами- тем больше сам запутываюсь. И ещё мне жаль, что ушёл из обсуждения ув.[ref]AlexCrane[/ref]. Спасибо!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Labu559 06 окт 2018, 14:08, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Как применить формулу к последовательности байт?
[ref]Labu559[/ref], Василий, ты подал не в том порядке - сверху младшие, снизу старшие...Labu559 писал(а): 06 окт 2018, 13:44но чтобы старших 4бита так мизерно влияли на показания в 3-й плате (если я правильно понял озвученный тобою алгоритм) и вообще не влияли на 1и2-й плате. Вот о чём я. Спасибо!
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя