Как объединить 4 байта в long ?
- Войдите на сайт для отправки комментариев
Вс, 02/12/2018 - 02:41
Добрый вечер.
есть массив 0x00 0x02 0xDD 0xCE что равно 187854 в десятичном виде
Хочу, НО не могу его засунуть его в long (выбрал long т.к. 4 байта)
Многие советуют "union", но толковой статьи не нашел про это чудо...
Подскажите, как решить проблему…
Или направьте на хорошую статью с примерами… сильно признателен буду :)
http://arduino.ru/forum/programmirovanie/zapis-i-chtenie-eeprom-peremennykh-tipa-float-unsigned-long-long-unsigned-int
Ниже тему нашел про Епром. Насколько я понял у меня задача точно такая же как и при чтении long из флешки.
Использую вот эту строку
Отправля в Serial получаю отрицательное значение
Учите основы языка Си и не будете побираться по форумам из-за мелочей . Вы потеряли unsigned. http://qaru.site/questions/114081/what-is-the-difference-between-signed-and-unsigned-int
тут два варианта :
либо используя union :
или "напрямую":
попробую отпишусь
или "напрямую":
СПАСИБО ОГРОМНОЕ!!! Все работает.
Метод "напрямую" мне больше подходит. Так проще разобраться в работе кода.
а через адрес начала буфера С не позволяет забрать?
Позволяет.
Позволяет.
А можно поинтересоваться примером?
Если включена строгая поверка типов, получите предупреждение, но ничего страшного.
но будьте аккуратны
Приведение типа по ссылке мне все равно представляется более наглядным:
и результат:
number 1 : 0002DDCE
number 2 : CEDD0200
Приведение типа по ссылке мне все равно представляется более наглядным:
и результат:
number 1 : 0002DDCE
number 2 : CEDD0200
что то я не в дуплю,как это у вас заработало(должно работать) ,в чем запускали ?
было инстресно как это работает,запустил в online компиляторе версия GCC 8.1.0
результат :
чядн ?
C++
чядн ?
Скорее всего язык не тот. А вообще, здесь форум по ардуино, вот в ардуино IDE и запускайте, а не где попало :)
Приведение типа по ссылке мне все равно представляется более наглядным:
насчёт наглядности - ХЗ, редко встречаю новичка, знающего о существовании ссылок, и уж совсем редко такого, кто понимает что это такое и чем от указателей отличается.
А то, что короче и как-то законченнее, чем с указателями, таки да, тут согласен.
Не взлетело )))
Похоже в ардуино используется LSB
Так расположите байты правильно - взлетит
Через приведение типов опасно мультибайтовыми переменными жонглировать. Захочется в какой-нить коммуникационный протокол такую изящную экономку запихать. А удаленный хост будет не той системы... Башку потом сломаешь, пытаясь понять что откуда лезет.
Так расположите байты правильно - взлетит
Да это понятно...
Задача, принимаем данные по последовательному интерфейсу, от младшего байта к старшему, складируем в буфер, далее из буфера извлекаем нужные данные...
Хотелось изящно, ан нет )))
А есть стек в ардуине? Может через стек перевернуть порядок?
Через приведение типов опасно мультибайтовыми переменными жонглировать. Захочется в какой-нить коммуникационный протокол такую изящную экономку запихать. А удаленный хост будет не той системы... Башку потом сломаешь, пытаясь понять что откуда лезет.
Так жонглировал, правда на ассемблере (точнее в кодах писал)
Ровно та же проблема встает во весь рост и без приведения типов, т.ч. без уточнения, какой endianness на той стороне, лучше вообще не начинать.
Так кот же спорит... Однако, мне кажется, что пока пишешь код сбора из отдельных байт - хоть немного соображаешь, как оно работает, а через приведение - как-то не наглядно. Зато красиво и и хочется использовать.
Фиг знает, я с этими разноконечностями сталкивался уже достаточно, а все равно никак не запомню, где у них что. Как затруднения, так букварь листать.
Поискал, кстати, ардуино-онлайн, как раз для таких целей, но гугл ничего не находит.
Такие вещи надо однозначно в ПЕСОЧНИЦЕ обозначить
Фиг знает, я с этими разноконечностями сталкивался уже достаточно, а все равно никак не запомню, где у них что. Как затруднения, так букварь листать.
Поискал, кстати, ардуино-онлайн, как раз для таких целей, но гугл ничего не находит.
https://www.tinkercad.com/ , регистрация нужна, правда.
Это я видел. Месяц триала, а потом деньги платить. Не впечатлило.
Через приведение типов опасно мультибайтовыми переменными жонглировать. Захочется в какой-нить коммуникационный протокол такую изящную экономку запихать.
Что да, то да. Есть, конечно, специально для этого функции htons(), htonl(), ntohs(), ntohl(), но как-то не пришлись они мне.
Поискал, кстати, ардуино-онлайн, как раз для таких целей, но гугл ничего не находит.
Редактор и компилятор есть онлайн на arduino.cc, а эмуляция ардуино есть в протеусе (тоже, правда, не бесплатно).
Кстати, о протеусе, натыкался на то, что один и тот же скетч:
1. На живом железном ардуино - OK
2. На голом ATmega328P в протеусе - Ok
3. на ардуино в протеусе - хренушки.
Так что теперь стараюсь в протеусе юзать голые чипы - больше доверия.
Так непонятно, где их применять, если AVR, ARM, PC -- все Little-Endian. Нет смысла конвертировать в сетевой порядок, чтобы на другом конце делать обратное преобразование.
Это чистая условность, как цвета проводов в электропроводке. Никакие электрические характеристики провода от цвета изоляции не зависят, но если Вы обнаруживаете фазу на жёлто-зелёном (пусть даже везде по дому единообразно и всё отлично работает), сразу ясно, что делал любитель, т.к. профессионал не сделает такого от слова никогда.
Не все так просто. В спецификации TCP/IP и Modbus жестко закреплен сетевой порядок передачи. В LIN и USB -- обратный, т.е. Little Endian. В стандарте CAN порядок следования отдан на откуп пользователю. Как ко всему этому подступиться с мерками "стандартизации", совсем непонятно.
Через приведение типов опасно мультибайтовыми переменными жонглировать. Захочется в какой-нить коммуникационный протокол такую изящную экономку запихать.
Что да, то да. Есть, конечно, специально для этого функции htons(), htonl(), ntohs(), ntohl(), но как-то не пришлись они мне.
Да и не компилятся в IDE
Могу отсыпать макросов, если надо.
Да и не компилятся в IDE
Почему? У меня 1.8.5 - всё компилится. Дайте точный код, что у Вас не компилится, версию IDE и сообщение компилятора.
Так ото ж. Корпоративные интересы берут верх над здравым смыслом. Разные разъёмы в разных министерствах СССР, ни у одного мобильника (до андроида) зарядка к другому не подходит, но всё это не отменяет пользы стандартизации.
Просто так, без инклюдов сетевых примочек не должны компилиться, конечно. Они же во всяких util.h раскиданы.
Могу отсыпать макросов, если надо.
Благодарю!
А то хотел попарное XOR делать
Да и не компилятся в IDE
Почему? У меня 1.8.5 - всё компилится. Дайте точный код, что у Вас не компилится, версию IDE и сообщение компилятора.
С макросами скомпилировалось! Код.
1.8.7
Хорошо ARM-ам. У них порядок следования байтов в 32-битном слове можно менять одной командой REV, а буде этого покажется мало, то с помощью команды RBIT можно и порядок битов поменять. Вобщем, как обычно, всем срочно на голубую пилюлю! :)
дак и Интел умеет swap делать. Што теперь, все на Интел?
есть массив 0x00 0x02 0xDD 0xCE что равно 187854 в десятичном виде
Хочу, НО не могу его засунуть его в long (выбрал long т.к. 4 байта)
Многие советуют "union", но толковой статьи не нашел про это чудо...
про union-ы:
и всё. Обьявляешь переменную типа TBytes, и обращаешься или к Value или к массиву Bytes.
есть массив 0x00 0x02 0xDD 0xCE что равно 187854 в десятичном виде
Хочу, НО не могу его засунуть его в long (выбрал long т.к. 4 байта)
Многие советуют "union", но толковой статьи не нашел про это чудо...
про union-ы:
и всё. Обьявляешь переменную типа TBytes, и обращаешься или к Value или к массиву Bytes.
Спасибо огромное. Этот способ очень удобный... вот только не описан для начинающих толком.
ну это, канеш, удобнее, чем черезжопные преобразования со ссылками.
Этот способ оч. хорошо у Кернигана описан, надо пойти в песочницу и в первом сообщении первого поста скачать эту книшку. Без нее С не даст.
Што теперь, все на Интел?
На "Эдисон"!
Какой КиР ? Начинающие не осилили даже сообщения №3 в этой ветке, где данный метод уже излагался. Не читатель, в общем.
Какой КиР ? Начинающие не осилили даже сообщения №3 в этой ветке, где данный метод уже излагался. Не читатель, в общем.
я осилил )))
что за КиР ?!
подскажите, я прочитаю...
Зайди в песочницу, во второе сообщение первой темы, там много полезного.
Зайди в песочницу, во второе сообщение первой темы, там много полезного.
Дед, есть предложение, для пенсионеров оказывать помощь, в расчёте на то, что прочитать то они смогут, понять и применить - на в ряд ли...