Порядок байт, порядок вывода
- Войдите на сайт для отправки комментариев
Сб, 23/06/2018 - 11:45
есть код
typedef struct STRto9100 { byte address; byte command; uint16_t reg; uint16_t data; uint16_t crc; }; STRto9100 to9100[] = {0x31, 0x32, 0x3334, 0x3536, 0x3738}; void setup() { byte* buf; buf = (byte*)&to9100; Serial.begin(230400); for (int i = 0; i < 8; i++) { byte d = *(buf + i); Serial.print(d, HEX); Serial.print(" "); } Serial.write(buf,8); } void loop() { }
в структуре поля uint16_t выбраны из условия что вводимые значения имеют смысл для понимания и соответствия документации . и выводиться в устройство дложнв в порядке старший-младший байты.
данный код выводит
31 32 34 33 36 35 38 37 12436587
как-то можно задать желаемый порядок вывода?
только руцями, берем нужный байт и выводим.
используа ассембленую вставку поменять байты местами?
та и на си можна.
используа ассембленую вставку поменять байты местами?
можно и на Си. Вы же в цикле FOR выводите байты по одному - так просто пропишите правильный порядок вывода и все
"... и выводиться в устройство дложнв в порядке старший-младший байты ..."
Исторически, правильный порядок вывода "от младшего к старшему" поскольку память "линейна" и выводят увеличением указателя (при этом "младший бит" идет тоже первым, ибо прием должен быть одинаков на системах с разной разрядностью), но с тех пор как Моторолла (кажись) все попутала, предложив миру "иные порядки" появилось несколько стандартов. Так что ничего оно не должно, кроме того, что Вы сами и как реализуете.
вот для того чтоб самому реализовать - я и спашиваю, как на Си со сдвигами я знаю , может есть ассембленая команда обмена байтами , тита ообмена ниблами
вот для того чтоб самому реализовать - я и спашиваю, как на Си со сдвигами я знаю , может есть ассембленая команда обмена байтами , тита ообмена ниблами
Где вы собрались байты менять? В структуре STRto9100 ? - а она после этого работать не перестанет? Если нет - тогда зачем менять в ходе программы, просто сразу положите в структуру 0x4355 вместо 0х5543
Да сделайте Вы свои 16-тиритные значения структурой из двух байт и присобачте ей какой Вам нравится вывод в поток. И никаких премудростей на виду не остантеся, всё инкапсулируется в эту структуру. Делов на две строчки, написать и забыть.
Для ява-программиста у Вас какие-то "мелкоуголовные наклонности". Вы тут должны нам всем мозги ООПом загаживать, а Вас чего-то в другую стророну - на ассемблер тянет.
JonHappy1
Порядок вывода зависит от переменной (i) в цикле for, в код сильно не вникал но попробуйти считать не от "0", а от 8 до 0.
2ЕвгенийП
когда нужно поменять 2 байта в 2 местах и городить для этого городить много условий...
как это сделать несколькими строками я могу без проблем , меня интересует как это сделать коротко и красиво.
Я нигже не писал про много условий, это Ваши фантазии. Вам же их выводить в поток надо? Ну, так делайте Printable структуры и давайте ей метод принт из двух строк.
В пару строк - это коротко, если с умом, то эффективно, а насчёт красоты ... вопрос сугубо индивидуальный, я его, кстати, здесь уже поднимал с год назад.
есть у кого ссылки на ассемблерные команды для адуинки?
Дык даташит же! Вам нужна ссылка на даташит?
есть у кого ссылки на ассемблерные команды для адуинки?
И это программист такие вопросы задаёт?
нет в АВР командах свопа байт, так как он 8-битный.
Через указатели или юнион. Компилятор сам оптимизирует.
Вот, например:
есть у кого ссылки на ассемблерные команды для адуинки?
И это программист такие вопросы задаёт?
2wdrakula
СПАСИБО ! , Этого более чем достаточно
(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))
2wdrakula
СПАСИБО ! , Этого более чем достаточно
(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))
Фига-се!
Я Вам предлагал ООП-решение, а Вы предпочли вот эту тарабарщину? Вы правда на Java работали? Это не шутка была? :)))
Понятно.
Да и в яве помойму не совсем так. Павильнее сказать: если хочешь поиметь тормоза - твой выбор Java. Так точнее будет.
и сервера на java прилично работают.
Дело не в байткоде. В самом языке есть много вещей, которые с эффективной реализацией несовместимы. Такие языки хороши на мощных машинах. Как тот же JS, например - на мощной машине хорош, но он не про эффективную реализацию ещё в большей степени, чем ява.
(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))
....
вот эту тарабарщину?
Фи! Женя, кель тон?! Это "тру" адресная арифметика.
2wdrakula
СПАСИБО ! , Этого более чем достаточно
(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))
А этого не достаточно? ))
( ab >> 8 ), ( ab & 0x00FF )
Фи! Женя, кель тон?! Это "тру" адресная арифметика.
Дык и я ж про то же! :))) Тока в Яве её нету, в отличие от ООП, вот меня ТС и удивил до глубины души :)))
А вообще, cмотрели фильм "Миллион в брачной корзине"? Там была шикарная цитата: "Ну, да, у нас в медицине это устройство называется "хреновина"" :)))
2wdrakula
СПАСИБО ! , Этого более чем достаточно
(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))
А этого не достаточно? ))
( ab >> 8 ), ( ab & 0x00FF )
Конечно можно! Ты, брат, цель не так понял.
Какая цель мести плац... ломом? ;)
А если серьезно, то ты ... тока без обид? ... не круто знаешь код компилятора.
В АВР ассемблере нет группового сдвига. Сначит сдвиг на 8 = 8 сдвигов, остальное - работа оптимизатора.
Ну и еще раз - мой код - прикол... троллинг ТС-а. Сам я такое ВСЕГДА делаю на юнионах - читаиццо нормально;). Нет, конечно не на сдвигах ;) уж прости.
в общем-то тут главное идея, а сама реализация уже вторична.
у меня пока подобных нароботок нет, поэтому тролить не стоит.
а что такое "Сам я такое ВСЕГДА делаю на юнионах" ? поделись секретом
в общем-то тут главное идея, а сама реализация уже вторична.
у меня пока подобных нароботок нет, поэтому тролить не стоит.
а что такое "Сам я такое ВСЕГДА делаю на юнионах" ? поделись секретом
Ребенок, ты точно программирование учил? Волшебные фамилии Керниган, Ричи, Страуструп слышал? Мама знает, чем ты тут занимаешься? Пипец, млин!
если тебя просят , значит надо ответить, а не ерничать..и не разбрасываться словами. я в си начинающий, но зато имел опыт работы с Ада на 580 проце. и в машинных кодах на PDP11.
А этого не достаточно? ))
( ab >> 8 ), ( ab & 0x00FF )
Ну и еще раз - мой код - прикол... троллинг ТС-а. Сам я такое ВСЕГДА делаю на юнионах - читаиццо нормально;). Нет, конечно не на сдвигах ;) уж прости.
Ну так и я ведь, обрати внимание, цитировал не тебя, а радостный ответ ТС.
Можешь считать, тоже попытался слегка потроллить. Ну и помочь, заодно.
Кстати, насколько я представляю - юнионы переставить байты никак не помогут. Думаю, если б мне пришло в голову делать красиво - я бы, вместо uint16_t, использовал другой тип, специально созданный. И определил бы для него оператор присваивания, и оператор преобразования в int. Так чтобы они автоматически, незаметно для программиста-пользователя, сами всё переставляли на нужное место.
ТС, ты забыл ношкой топнуть.
А вот отсюда поподробней плиз, можно на мыло .. особенно про Аду на 580 проце, (вроде по времени уже "можно"). Мыло на мейле, ник "до" тире.
Ну блин .. Вы ни разу юнионом не пользовались?
В этом подходе только одна "неприятность", ставящая на нем курест в avr-gcc (вообще, а не только в Ардуино) - неспособность компилятора размещать struct и union на регистрах, в случае локальных объявлений и/или параметров. Увы, все это будет исключительно в SRAM и через него.
(*тоже уже писал года 1.5 назад в техподдержку - обещались, но пока не заметил чтобы научились *)
я бы, вместо uint16_t, использовал другой тип, специально созданный. И определил бы для него оператор присваивания,
Я про это талдычу уже второй день. Только там нужно не присваивание определять, а вывод в поток? Т.к. перестановка нужна только для вывода в поток. Но, похоже, что эти слова ТС неизвестны, а потому ... :))))
Кому надо?
Парень, вот уже второй день пытаюсь тебе объяснить, здесь тебе никто ничего не должен. Каждый сам для себя решает, что ему надо, а что - нет. Твои регулярные наскоки, на тему «вы обязаны мне отвечать» ни к чему, кроме срача не приведут.
Сопоставил это с вопросами, которые ты здесь задаёшь. Посмеялся.
далее разработка контроллеров на 1806/macro11... 51 однокристалка/ассемблер
счас бы сам не против поиметь , вот только с областью применеия не уверен. для моих задач java очень подходит.
под окнами написал, отладил - в лиукс .jar скинул, и все работает.
как раз это я и взял на вооружение. вот только толкового описания не нашёл про sprintf , что получается по размеру кода и быстродействию.
Ну, я же говорил, что Вы слов не понимаете и Вас несёт совем в другую сторону. sprintf тут врообще не при делах, абсолютно. Я уже писал про интерфейс Printable. Знаете. я начинаю сомневаться, что Вы действительно знаете Java (ну, что-нибудь за пределами цикла for).
Я про это талдычу уже второй день. Только там нужно не присваивание определять, а вывод в поток? Т.к. перестановка нужна только для вывода в поток. Но, похоже, что эти слова ТС неизвестны, а потому ... :))))
Да, если именно для вывода - конечно можно переопределять вывод.
Я просто уже немного ушёл от темы топика, и писал про "в целом". Когда необходимо именно реально переставить байты в памяти.
Такое бывает, например, когда приходится формировать пакет данных по определённому протоколу, а порядок байтов в нём, как назло, не совпадает с принятым в микроконтроллере или конкретном компиляторе.
не хочешь отвечать - твоё дело, но не надо флудить. я новичёк в си , и тут на помощь надеюсь
Алё, гараж! Ты вообще слышишь, что тебе говорят? До тех пор, пока ты будешь всем указывать что надо, а что не надо, никакой помощи ты не получиль - только срач. Если ты этого до сих пор не понял, ... ну, дело хозяйское.
Понял, отстал. Мне было интересно какой версии компилятор с АДА Вы пользовали и насколько плотно. Участвовал (делал синт и лекс анализатор к одному из таких, а мой брат ставил АДА на Эльбрусы в свое время).. просто стало любопытно за прошлое .. язык академический, потому и помер, в отличии от Си.
Кстати, сильно похоже что Java Вы знаете примерно так же как АДА (поработал - бросил).. ничего личного, просто читая этот попкорн, иных мыслей тут нет. И да, union в том или ином виде есть не только в Си, а ссылаясь на "580-й", Вы как-бы указываете свой возраст и косвенно "опыт", следы которого по сообщениям обнаружить несколько проблематично.
В общем, за "полторы недели" освоения, вполне можно открыть интернет-учебник по языку и освоить ..
А Вы считаете, что юниона до Си не было?
Помнится, еще в FORTRAN'е были COMMON блоки, включающие в себя функциональность юнионов.
С Адой подробно не знаком, но, судя по тому, что она восходит к Паскалю, вряд ли в ней не было аналогов юниона.
Мля, да шож тварицца-то?
У человека с сорокалетним стажем и опытом работы на всём, от цифровых кодов до Ады, возинкла проблема два
пальца обосс...байта поменять! И он этой охренительной проблемой уже два дня всем мозг выносит.У меня уже попкорн закончился, жую снятую с ушей лапшу! Даже аватарку поменял по такому поводу.
В общем, мужики - это стопудовый тролль. Сидит щас и ржёт над нами.
Да ладно. Ада - классный язык, особенно книжка была с описанием стандарта. Так и называлась "Язык Ада". Золотом по черной обложке. Когда читал в поезде, бабки на нижней полке крестились неистово все три дня поездки. :)
Помнится, еще в FORTRAN'е были COMMON блоки, включающие в себя функциональность юнионов.
С Адой подробно не знаком, но, судя по тому, что она восходит к Паскалю, вряд ли в ней не было аналогов юниона
пальца обосс...байта поменять! И он этой охренительной проблемой уже два дня всем мозг выносит.не разу не писав на Си , за 2 недели отладить клиента ws, подключить лазерный дальномер, и всё это заставить работать вместе -получив бегущую кривую в браузере в реальном времени отражающую дальность от дачика до препятствия. я считаю достатосно продктивно.
...
в паскале нет,
Пипец наглое, брехливое ЧМО, в Паскале это называется запись с вариантами!
Какой еще язык ты "знаешь"?
Блин, специально пошарил про жабу:
Прочие отличия от C
Так он и JAVA не знает! :)Нет, реализовать С-подобные union похоже запрещено явно в жабе.
Ну и за Алгол абыдна .. Алгол-68 вполне имел и структуры и объединения..