Побитово два int16_t во float и обратно.
- Войдите на сайт для отправки комментариев
Пнд, 25/06/2018 - 06:21
Уважемые гуру пожлуйста подскажите.
Я соверненно не силен в Си++ c арудино на весьма любительском уровне.
Задача у меня следующия. От электросчетчика SDM120 (слейва) по Modbus получаю на ардуину (мастер) последовательность байт 2 шт. по 16 бит.
Формат данных счетчика Float. Нужно 2 по 16 бит переделать во float 32 бита
Попробовал сделать:
uint16_t au16data[]={111,222} ; float volts ; bitWrite(volts, 0, bitRead(au16data [1], 0));
Компилятор ругается:
error: invalid operands of types 'float' and 'long unsigned int' to binary 'operator&' #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
Находил решения подбных проблема
типа:
typedef union { float asFloat; long asLong; short asWord[2]; byte asByte[4]; } float_cracker_t; void setup( void ) { float_cracker_t cracker; cracker.asFloat = 13.13; for ( int8_t i=0; i < 4; ++i ) { byte byteToSend = cracker.asByte[i]; } } void loop( void ) { }
или http://arduino.ru/forum/processing/peredacha-float-v-processing
Но мозг взорвал но не разобрался и в примере выше конвертирует только в одну сторону.
Пожалуйста подскажите
1. Как должен выглядеть код в моем случае.
2. Что и где конкретно почитать про все элементы в коде выше в небольшом обьеме.
Заранее благодарен.
Блин..приношу извинения за орфографию...., а правка невозможно!!!!!!!!!!!!!!!!
1. Хотелось бы знать, какой смысл Вы вкладываете в слово "конвертировать". Что при этом должно происходить?
2. В тексте Вы говорите о "конвертации" одного float в два 16-разрядных слова, а в примере "конвертируете" float в 4 байта. Это как?
3. Что значит "конвертирует только в одну сторону"?
мне больше понравилось про "2 байта по 16 бит".
ТС, разберитесь с типами переменных и с их размерностью. Для затравки хочу открыть вам тайну -в байте ВСЕГДА 8 бит. А теперь сами - сколько байт и бит в лонге, флоат, и инте? - при этом учитывайте, что размеры типов на разном железе могут быть разными.
Для затравки хочу открыть вам тайну -в байте ВСЕГДА 8 бит.
Не всегда, зависит от платформы ;) Именно поэтому существует константа CHAR_BIT в limits.h ;)
тиресно, на какой платформе в байте не 8 бит?
Не всегда, зависит от платформы ;) Именно поэтому существует константа CHAR_BIT в limits.h ;)
DIYMan, это непедагогично - подрывать автритет коллеги в глазах учеикоа :) Тем более что по сути-то я прав, во всех современных компьютерных системах байт = 8 бит
С интресом уточнил для себя что оказывается байт это не котегорично 8 бит! Принято, все используют, все ЗАНАЮТ! По сути - да сейчас стандарт де факто! Но формально есть ньюанс!
Байт (англ. byte) (русское обозначение: байт и "Б"; международное: B, byte)[1] — единица хранения и обработки цифровой информации; совокупность битов, обрабатываемая компьютером одномоментно. В современных вычислительных системах байт состоит из восьми битов и, соответственно, может принимать одно из 256 (28) различных значений (состояний, кодов). Однако в истории компьютерной техники существовали решения с иными размерами байта (например, 6, 32 или 36 битов), поэтому иногда в компьютерных стандартах и официальных документах для однозначного обозначения группы из 8 битов используется термин «октет» (лат. octet).
Ряд ЭВМ 1950-х и 1960-х годов использовали 6-битовые символы в 48-битовых или 60-битовых машинных словах. В некоторых моделях ЭВМ производства Burroughs Computer Corporation (ныне Unisys) размер символа был равен 9 битам. Во многих современных цифровых сигнальных процессорах используется машинное слово длиной 16 бит и больше.
Название Байт было впервые использовано в 1956 году В. Бухгольцем при проектировании первого суперкомпьютера IBM 7030 для пучка одновременно передаваемых в устройствах ввода-вывода битов (шести штук) , позже в рамках того же проекта расширили байт до восьми (23) бит.
Байтовая адресация памяти была впервые применена в системе IBM System/360. В более ранних компьютерах адресовать можно было только целиком машинное слово, состоявшее из нескольких символов, что затрудняло обработку нечисловых данных.
8бит - размер "машинного слова" в процессоре i8080 - на нем собрали
первый IBM PC. А все (точнее, подавляющее большинство) современные компьютеры являются именно IBM-совместимыми, т. е. развернись история так, что на первое место вышли бы процессоры другой фирмы (не Intel, т. к. i8080 — 8-битный микропроцессор, выпущенный компанией Intel в апреле 1974 года) , мы бы, возможно, использовали семибитовые буты или девятибитовые баты ;-)))
тиресно, на какой платформе в байте не 8 бит?
https://stackoverflow.com/questions/2098149/what-platforms-have-somethin...
Не всегда, зависит от платформы ;) Именно поэтому существует константа CHAR_BIT в limits.h ;)
DIYMan, это непедагогично - подрывать автритет коллеги в глазах учеикоа :) Тем более что по сути-то я прав, во всех современных компьютерных системах байт = 8 бит
По сути - ты неправ, не во всех компьютерных системах байт = 8 бит: https://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char
Давай не будем привязываться к слову "современный". Всё зависит не от слова "современный", а от платформы, под которую собирается код. И там, ВНЕЗАПНО, CHAR_BIT может быть равен 12, скажем. И если ты изначально закладываешься на CHAR_BIT == 8, то код на такой платформе будет работать неверно.
Да, в современных реалиях всем пох, и мало кто юзает CHAR_BIT в коде - тупо считают, что там 8. И я тоже - не исключение. Но для полноты картины - не упомянуть не мог ;)
З.Ы. Авторитет не подрывал, даже в мыслях не было ;)
при этом учитывайте, что размеры типов на разном железе могут быть разными.
Дополню: категорически советую для переносимого между разными платформами скетча юзать не int, byte, char, long и т.п. - а типы с чётко прописанной размерностью:
int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t
Ну и структуры выравнивать по границе байта:
Помогает избежать многих головняков при переносе проекта на другую платформу.
DIYMan, если ты хочешь по гамбурскому счету - то обьясни, какое отношение имеет CHAR_BIT к байту? то. что char на разных системах может быть разным - это понятно. но байт - это единица измерения, как "метр" или "секунда", он везде одинаков.
То. что когда-то где-то байт был не 8 бит - это примерно тоже самое как устаревшие единицы измерения "сажЕнь" или "локоть",
Я понимаю, что могу сильно ошибатся - но всегда думал именно так. Тут уж не до авторитета - хочу разобраться.
DIYMan, если ты хочешь по гамбурскому счету - то обьясни, какое отношение имеет CHAR_BIT к байту?
Читать: https://ru.wikipedia.org/wiki/Limits.h , увидеть, что "
CHAR_BIT
"
CHAR_BIT - просто название определения, но его суть - это именно число бит в байте. Вообще, limits.h - интересная штука, если это дело юзать в проектах - это ещё один большой шаг к переносимому коду, взять те же лимиты мин/макс-значений.
...я думал, что сойду с ума от перловых регекспов, а тут вон чего - еще похлеще в ваших Си.
DIYMan, спасибо, почитал. Век живи, век учись. Правда я с сигнальными процессорами дела не имел никада, паэтому был свято уверен, что байт всегда = 8 бит, а бит - это байт минус налоги. Придёца напицца.
...я думал, что сойду с ума от перловых регекспов, а тут вон чего - еще похлеще в ваших Си.
Да не, у нас всё норм :) Просто история языка длинная, вот и вылезают уши всякие. Да и требования к переносимости кода - существуют, зависит от проекта, конечно, но - существуют. Поэтому если закладываться на переносимость - в Perl легче, конечно: поставил интерпретатор под конкретную платформу - и похер. А вот с C - придётся повозиться.
Да далеко ходить не надо: размерность int под AVR (Arduino Uno) и ARM (Arduino Due) - не совпадает, емнип. В одном проекте сталкивался, пришлось допиливать, т.к. сам дурак - не заложил переносимость.
паэтому был свято уверен, что байт всегда = 8 бит
Строго говоря, в текущем окружении ты вряд ли столкнёшься с другой ситуацией, так что 8 бит в байте - это как норма, обратное - исключение, достаточно редкое. Хотя (емнип, опять же, могу ошибаться), в Windows CE единицей данных являлось двухбайтовое поле (wchar_t), т.е. формально в такой системе в байте - 16 бит. Но, во-первых - могу ошибаться (память подводит, старенький :) ), и, во-вторых - то уже всё сдохло, и недостойно выкапывания из могилы :)
Так что считаем, что в байте 8 бит, и не забиваем себе голову академическими знаниями :)
З.Ы. Не пей много :) И мало - тоже не надо :)
DIYMan, спасибо
в Windows CE единицей данных являлось двухбайтовое поле (wchar_t), т.е. формально в такой системе в байте - 16 бит. Но, во-первых - могу ошибаться (память подводит, старенький :) ), и, во-вторых - то уже всё сдохло, и недостойно выкапывания из могилы :)
В своё время имел коммуникатор на WinCE 6.5 и писал под него программы на шарпе в VS2005/8. Символы там действительно все были широкие (2 байта), но и тип byte был, никуда не девался. И знаковый был, и беззнаковый.
В своё время имел коммуникатор на WinCE 6.5 и писал под него программы на шарпе в VS2005/8. Символы там действительно все были широкие (2 байта), но и тип byte был, никуда не девался. И знаковый был, и беззнаковый.
Ну я ж говорю - память подводит :)
8бит - размер "машинного слова" в процессоре i8080 - на нем собрали
первый IBM PC. А все (точнее, подавляющее большинство) современные компьютеры являются именно IBM-совместимыми, т. е. развернись история так, что на первое место вышли бы процессоры другой фирмы (не Intel, т. к. i8080 — 8-битный микропроцессор, выпущенный компанией Intel в апреле 1974 года) , мы бы, возможно, использовали семибитовые буты или девятибитовые баты ;-)))
Это, конечно, очень интересно, но, увы, не соответствует действительности.
IBM PC был собран не на 8080, а на 8088, который, кстати, в отличие от 8080 был не 8-, а 16-разрядным процессором. Хотя и с 8-разрядной внешней шиной. За счет чего в IBM PC широко использовалась 8-разрядная периферия, разработанная для 8080, что позволило выпустить 16-разрядный компьютер почти по цене 8-разрядного. Что и определило в конце концов его популярность.
В любом случае, утеврждение, что размером 8 бит байт обязан 16-разрядному процессору, выглядит как-то немного странно.
IBM PC был собран не на 8080, а на 8088, который, кстати, в отличие от 8080 был не 8-, а 16-разрядным процессором. Хотя и с 8-разрядной внешней шиной.
Да. Верно.
IBM PC/TX на 8088 только разглядывал. А вот IBM PC/AT на 80286 уже пользовал. Давно это было!
на 8080 были собраны "Микроша", "Радио РК-86" и "Специалист". Но как только в союзе появился "Спектрум", все эти поделки бесславно сгинули.
на 8080 были собраны "Микроша", "Радио РК-86" и "Специалист".
Как сказал мой одногрупник в институте в году примерно 1988 - "тех кто сам собрал дома Радио РК-86, ОБХСС может сразу сажать". Для молодежи поясняю - тогда детали для его сборки было ОЧЕНЬ трудно КУПИТЬ (дефицит). А вот с работы вынести детали (у кого они были на работе) - гораздо легче.
Сгинули, да. Но не согласен что бесславно. Они сильно помогли в продвижении ЭВМ в массы.
естесственно. я для своего спектрума чесно накрал деталек на тогдашней работе. Правда, качество было не ахти, мне пришлось перебрать ночами, когда я дежурил, целый ящег РУ5 и РУ6, чтобы найти не битые. А Z80 пришлось у спекулянтов покупать, GoldStar. Он на 9 Мгц запросто работал. :)
Еще паял их, помню, на индий, чтоб заменять было легче. Плату над ланпой подержал, поддел отверткой и достал без проблем.
IBM PC/TX на 8088 только разглядывал. А вот IBM PC/AT на 80286 уже пользовал. Давно это было!
Вероятно, дело не в процессоре, а в видеоадаптере: XT обычно комплектовался CGA с безальтернативно латинским знакогенератором, а в AT уже зачастую использовались EGA/VGA с загружаемым знакогенератором, куда уже можно было залить кириллицу.
Ностальгия она такая ностальгическая. В первый матричный принтер тоже загружали кирилицу. А второй взяли Star-1500 с прошитой кириллицой. Круть неимоверная.
IBM PC был собран не на 8080, а на 8088, который, кстати, в отличие от 8080 был не 8-, а 16-разрядным процессором. Хотя и с 8-разрядной внешней шиной.
Да. Верно.
IBM PC/TX на 8088 только разглядывал. А вот IBM PC/AT на 80286 уже пользовал. Давно это было!
IBM PC/TX на 8088 только разглядывал. А вот IBM PC/AT на 80286 уже пользовал. Давно это было!
Вероятно, дело не в процессоре, а в видеоадаптере: XT обычно комплектовался CGA с безальтернативно латинским знакогенератором,
Ностальгия она такая ностальгическая. В первый матричный принтер тоже загружали кирилицу. А второй взяли Star-1500 с прошитой кириллицой. Круть неимоверная.
Ранний Epson, скорее всего. Мня тоже начальство озадачивало.
Ранний Epson, скорее всего. Мня тоже начальство озадачивало.
мне с начальством повезло. Мой начальник считал. что русский в принтере - это для лохов. "Если в принтере нет русского - это даже хорошо, будем учить английский." - это было в то время, когда всякую ерунду, типа заявления в отпуск или обьяснительных на принтерах не печатали - только серьезные вещи :)
Тридцать лет прошло, а я до сих пор чту его заветы. Ни в одной из моих программ за эти годы не было кириллицы :)
ну вот и на ардуино это как-то удачно легло... никакой кириллицы.
это было в то время, когда всякую ерунду, типа заявления в отпуск или обьяснительных на принтерах не печатали - только серьезные вещи :)
Серьёзно? По-моему первое, что печатал новый принтер - это было вот такое:
Серьёзно? По-моему первое, что печатал новый принтер - это было вот такое:
ну и где тут кириллица? :)
Кириллицы нет - тут спорить не стану.
нинаю, я когда в не свой Epson кириллицу вставил, первым делом Стругацких напечатал с конференций релкома и читал.
Ну это кому что. Кто-то первым делом Руфь Диксон печатал.
Но компилятор ругается. см в первом сообщении.
нинаю, я когда в не свой Epson кириллицу вставил, первым делом Стругацких напечатал с конференций релкома и читал.
+1
Я тоже фантастику печатал. :-)
Большое спасибо всем кто откликнулся.
Если в функций bitRead() и bitWrite() не передавать float а передвать только uint16_t или int16_t, то все работает.
Вот еще полностью, что выдает помпилятор.
http://arduino.ru/forum/programmirovanie/kak-razobrat-float-na-slova
Правильное решение.
Огромное спасибо всем откликнувшимся за подсказки, кажется победил:
у мя первый был на 8086.
Тогда это был не "IBM PC/XT", а "IBM PC/XT-совместимый". Их - на чем только не делали. В том числе и на К1810ВМ86.
Работали XT с кириллицей.
Не работали. Работали - некоторые "совместимые". У которых в аппаратный знакогенератор была изначально зашита кириллица. Помнится, у жены, когда она преподавала информатику, был целый класс таких - совместимых. Если мне не изменяет память - на NEC V30.