Порядок байт, порядок вывода

JonHappy1
Offline
Зарегистрирован: 11.06.2018

есть код

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

как-то можно задать желаемый порядок вывода?

Logik
Offline
Зарегистрирован: 05.08.2014

только руцями, берем нужный байт и выводим.

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

используа ассембленую вставку поменять байты местами?

Logik
Offline
Зарегистрирован: 05.08.2014

та и на си можна.

b707
Offline
Зарегистрирован: 26.05.2017

JonHappy1 пишет:

используа ассембленую вставку поменять байты местами?

можно и на Си. Вы же в цикле FOR выводите байты по одному - так просто пропишите правильный порядок вывода и все

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

"... и выводиться в устройство дложнв в порядке старший-младший байты ..."

Исторически, правильный порядок вывода "от младшего к старшему" поскольку память "линейна" и выводят увеличением указателя (при этом "младший бит" идет тоже первым, ибо прием должен быть одинаков на системах с разной разрядностью), но с тех пор как Моторолла (кажись) все попутала, предложив миру "иные порядки" появилось несколько стандартов. Так что ничего оно не должно, кроме того, что Вы сами и как реализуете.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

вот для того чтоб самому реализовать - я и спашиваю, как на Си со сдвигами я знаю , может есть ассембленая команда обмена байтами , тита ообмена ниблами

b707
Offline
Зарегистрирован: 26.05.2017

JonHappy1 пишет:

вот для того чтоб самому реализовать - я и спашиваю, как на Си со сдвигами я знаю , может есть ассембленая команда обмена байтами , тита ообмена ниблами

Где вы собрались байты менять? В структуре STRto9100 ? - а она после этого работать не перестанет? Если нет - тогда зачем менять в ходе программы, просто сразу положите в структуру 0x4355 вместо 0х5543

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да сделайте Вы свои 16-тиритные значения структурой из двух байт и присобачте ей какой Вам нравится вывод в  поток. И никаких премудростей на виду не остантеся, всё инкапсулируется в эту структуру. Делов на две строчки, написать и забыть.

Для ява-программиста у Вас какие-то "мелкоуголовные наклонности". Вы тут должны нам всем мозги ООПом загаживать, а Вас чего-то в другую стророну - на ассемблер тянет.

Efim
Offline
Зарегистрирован: 04.05.2018

JonHappy1

Порядок вывода зависит от переменной (i) в цикле for, в код сильно не вникал но попробуйти считать не от "0", а от 8 до 0.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

2ЕвгенийП
когда нужно поменять 2 байта в 2 местах и городить для этого городить много условий...

как это сделать несколькими строками я могу без проблем , меня интересует как это сделать коротко и красиво.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я нигже не писал про много условий, это Ваши фантазии. Вам же их выводить в поток надо? Ну, так делайте Printable структуры и давайте ей метод принт из двух строк.

В пару строк - это коротко, если с умом, то эффективно, а насчёт красоты ... вопрос сугубо индивидуальный, я его, кстати, здесь уже поднимал с год назад.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

есть у кого ссылки на ассемблерные команды для адуинки?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дык даташит же! Вам нужна ссылка на даташит?

kalapanga
Offline
Зарегистрирован: 23.10.2016

JonHappy1 пишет:

есть у кого ссылки на ассемблерные команды для адуинки?

И это программист такие вопросы задаёт?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

нет в АВР командах свопа байт, так как он 8-битный.

Через указатели или юнион. Компилятор сам оптимизирует.

Вот, например:

#include <stdio.h>

void setup(void)
{
  Serial.begin(57600);
  while (!Serial);
  
  }
void loop(void){
  uint16_t ab = 0;
  byte b;
  char ss[64];
  
  if (Serial.available()){ 
     ab = Serial.parseInt();
     while(Serial.available()) b = Serial.read();

     snprintf (ss,63,"Введено число: %5d=%#06x ;\n", ab,ab);
     Serial.println(ss);
     snprintf (ss,63,"Обратный порядок: %#04x %#04x\n", (uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1)));
     Serial.println(ss);
  }
}

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

kalapanga пишет:

JonHappy1 пишет:

есть у кого ссылки на ассемблерные команды для адуинки?

И это программист такие вопросы задаёт?

певая неделя с адуинкой, и знать все ссылки?если есть - поделись

JonHappy1
Offline
Зарегистрирован: 11.06.2018

2wdrakula
СПАСИБО ! , Этого более чем достаточно
 

(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:

2wdrakula
СПАСИБО ! , Этого более чем достаточно
 

(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))

Фига-се! 

Я Вам предлагал ООП-решение, а Вы предпочли вот эту тарабарщину? Вы правда на Java работали? Это не шутка была? :)))

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
Я Вам предлагал ООП-решение, а Вы предпочли вот эту тарабарщину? Вы правда на Java работали? Это не шутка была? :)))
по поводу ООП в java - если хочешь поиметь тормоза - ООП твой выбор. (не знаю как в Си)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

JonHappy1 пишет:
(не знаю как в Си)
Здесь всё больше от мозгов зависит.

Да и в яве помойму не совсем так. Павильнее сказать: если хочешь поиметь тормоза - твой выбор Java. Так точнее будет.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
Да и в яве помойму не совсем так. Павильнее сказать: если хочешь поиметь тормоза - твой выбор Java. Так точнее будет.
если рассмативать , что байт код выполняется медленнее, то возможно, но в java есть оптимизатоы рантайма, так что скорость достаточная. но как ни крути - кросплатформенность вещь стоящая.
и сервера на java прилично работают.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Дело не в байткоде. В самом языке есть много вещей, которые с эффективной реализацией несовместимы. Такие языки хороши на мощных машинах. Как тот же JS, например - на мощной машине хорош, но он не про эффективную реализацию ещё в большей степени, чем ява.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
В самом языке есть много вещей, которые с эффективной реализацией несовместимы.
отчасти с этим можно согласиться

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))

....

вот эту тарабарщину?

Фи! Женя, кель тон?! Это "тру" адресная арифметика.

Datak
Offline
Зарегистрирован: 09.10.2014

JonHappy1 пишет:

2wdrakula
СПАСИБО ! , Этого более чем достаточно
 

(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))

А этого не достаточно? )) 

( ab >> 8 ), ( ab & 0x00FF )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Фи! Женя, кель тон?! Это "тру" адресная арифметика.

Дык и я ж про то же!  :))) Тока в Яве её нету, в отличие от ООП, вот меня ТС и удивил до глубины души :)))

А вообще, cмотрели фильм "Миллион в брачной корзине"? Там была шикарная цитата: "Ну, да, у нас в медицине это устройство называется "хреновина"" :)))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Datak пишет:

JonHappy1 пишет:

2wdrakula
СПАСИБО ! , Этого более чем достаточно
 

(uint16_t)(*((byte*)&ab+0)),(uint16_t)(*((byte*)&ab+1))

А этого не достаточно? )) 

( ab >> 8 ), ( ab & 0x00FF )

Конечно можно! Ты, брат, цель не так понял.

Какая цель мести плац... ломом? ;)

А если серьезно, то ты ... тока без обид? ... не круто знаешь код компилятора.

В АВР ассемблере нет группового сдвига. Сначит сдвиг на 8 = 8 сдвигов, остальное  - работа оптимизатора.

Ну и еще раз - мой код - прикол... троллинг ТС-а. Сам я такое ВСЕГДА делаю на юнионах - читаиццо нормально;). Нет, конечно не на сдвигах ;) уж прости.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

в общем-то тут главное идея, а сама реализация уже вторична.

у меня пока подобных нароботок нет, поэтому тролить не стоит.

а что такое "Сам я такое ВСЕГДА делаю на юнионах" ? поделись секретом

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

JonHappy1 пишет:

в общем-то тут главное идея, а сама реализация уже вторична.

у меня пока подобных нароботок нет, поэтому тролить не стоит.

а что такое "Сам я такое ВСЕГДА делаю на юнионах" ? поделись секретом

Ребенок, ты точно программирование учил? Волшебные фамилии Керниган,  Ричи, Страуструп слышал? Мама знает, чем ты тут занимаешься? Пипец, млин!

JonHappy1
Offline
Зарегистрирован: 11.06.2018

если тебя просят , значит надо ответить, а не ерничать..и не разбрасываться словами. я в си начинающий, но зато имел опыт работы с Ада на 580 проце. и в машинных кодах на PDP11.

Datak
Offline
Зарегистрирован: 09.10.2014

wdrakula пишет:

Datak пишет:

А этого не достаточно? )) 

( ab >> 8 ), ( ab & 0x00FF )

Ну и еще раз - мой код - прикол... троллинг ТС-а. Сам я такое ВСЕГДА делаю на юнионах - читаиццо нормально;). Нет, конечно не на сдвигах ;) уж прости.

Ну так и я ведь, обрати внимание, цитировал не тебя, а радостный ответ ТС.

Можешь считать, тоже попытался слегка потроллить. Ну и помочь, заодно.

Кстати, насколько я представляю - юнионы переставить байты никак не помогут. Думаю, если б мне пришло в голову делать красиво - я бы, вместо uint16_t, использовал другой тип, специально созданный. И определил бы для него оператор присваивания, и оператор преобразования в int. Так чтобы они автоматически, незаметно для программиста-пользователя, сами всё переставляли на нужное место.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ТС, ты забыл ношкой топнуть. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

JonHappy1 пишет:
если тебя просят , значит надо ответить, а не ерничать..и не разбрасываться словами. я в си начинающий, но зато имел опыт работы с Ада на 580 проце. и в машинных кодах на PDP11.

А вот отсюда поподробней плиз, можно на мыло .. особенно про Аду на 580 проце, (вроде по времени уже "можно"). Мыло на мейле, ник "до" тире.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну блин .. Вы ни разу юнионом не пользовались?

typedef uinon {
  uint32_t  varLong;
  struct{
    uint8_t pos1, pos2, pos3, pos4;
  } bytes;
} uint32_union;

uint32_union myVar;

// ...
myVar.varLong = 12345UL;

sprintf("% ... чего там было .. %d", myVar.bytes.pos3, myVar.bytes.pos2);

В этом подходе только одна "неприятность", ставящая на нем курест в avr-gcc (вообще, а не только в Ардуино) - неспособность компилятора размещать struct и union на регистрах, в случае локальных объявлений и/или параметров. Увы, все это будет исключительно в SRAM и через него.

(*тоже уже писал года 1.5 назад в техподдержку - обещались, но пока не заметил чтобы научились *)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Datak пишет:

 я бы, вместо uint16_t, использовал другой тип, специально созданный. И определил бы для него оператор присваивания, 

Я про это талдычу уже второй день. Только там нужно не присваивание определять, а вывод в поток? Т.к. перестановка нужна только для вывода в поток. Но, похоже, что эти слова ТС неизвестны, а потому ... :))))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

JonHappy1 пишет:
если тебя просят , значит надо ответить

Кому надо?

Парень, вот уже второй день пытаюсь тебе объяснить, здесь тебе никто ничего не должен. Каждый сам для себя решает, что ему надо, а что - нет. Твои регулярные наскоки, на тему «вы обязаны мне отвечать» ни к чему, кроме срача не приведут.

JonHappy1 пишет:
имел опыт работы с Ада на 580 проце. и в машинных кодах на PDP11.

Сопоставил это с вопросами, которые ты здесь задаёшь. Посмеялся.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
А вот отсюда поподробней плиз, можно на мыло .. особенно про Аду на 580 проце, (вроде по времени уже "можно"). Мыло на мейле, ник "до" тире.
какие тут подробности. это было в конце 80, компилятор на 8" флопи. понравились структуры, по тем временам очень прогрессивные. пописал, получил удовольствие... , перешёл на другое место и всё. самое страшное это флопи, летели со свистом.
далее разработка контроллеров на 1806/macro11...  51 однокристалка/ассемблер
счас бы сам не против поиметь , вот только с областью применеия не уверен. для моих задач java очень подходит.
под окнами написал, отладил - в лиукс .jar скинул, и все работает.

Цитата:
Я про это талдычу уже второй день. Только там нужно не присваивание определять, а вывод в поток? Т.к. перестановка нужна только для вывода в поток. Но, похоже, что эти слова ТС неизвестны, а потому ... :))))
как раз это я и взял на вооружение. вот только толкового описания не нашёл про sprintf , что получается по размеру кода и быстродействию.

Цитата:
Ну блин .. Вы ни разу юнионом не пользовались?
представляешь, за полторы недели вхождения в Си ещё не успел...

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
Парень, вот уже второй день пытаюсь тебе объяснить, здесь тебе никто ничего не должен. Каждый сам для себя решает, что ему надо, а что - нет. Твои регулярные наскоки, на тему «вы обязаны мне отвечать» ни к чему, кроме срача не приведут.
не хочешь отвечать - твоё дело, но не надо флудить. я новичёк в си , и тут на помощь надеюсь. а не на ёрничание.

Цитата:
Сопоставил это с вопросами, которые ты здесь задаёшь. Посмеялся.
ты явно про этих монстров не слышал :) и уж точно , не видел.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:

как раз это я и взял на вооружение. вот только толкового описания не нашёл про sprintf , что получается по размеру кода и быстродействию.

Ну, я же говорил, что Вы слов не понимаете и Вас несёт совем в другую сторону. sprintf  тут врообще не при делах, абсолютно. Я уже писал про интерфейс Printable. Знаете. я начинаю сомневаться, что Вы действительно знаете Java (ну, что-нибудь за пределами цикла for).

Datak
Offline
Зарегистрирован: 09.10.2014

ЕвгенийП пишет:

Я про это талдычу уже второй день. Только там нужно не присваивание определять, а вывод в поток? Т.к. перестановка нужна только для вывода в поток. Но, похоже, что эти слова ТС неизвестны, а потому ... :))))

Да, если именно для вывода - конечно можно переопределять вывод.

Я просто уже немного ушёл от темы топика, и писал про "в целом". Когда необходимо именно реально переставить байты в памяти.

Такое бывает, например, когда приходится формировать пакет данных по определённому протоколу, а порядок байтов в нём, как назло, не совпадает с принятым в микроконтроллере или конкретном компиляторе. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

JonHappy1 пишет:

не хочешь отвечать - твоё дело, но не надо флудить. я новичёк в си , и тут на помощь надеюсь

Алё, гараж! Ты вообще слышишь, что тебе говорят? До тех пор, пока ты будешь всем указывать что надо, а что не надо, никакой помощи ты не получиль - только срач. Если ты этого до сих пор не понял, ... ну, дело хозяйское.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

JonHappy1 пишет:
какие тут подробности. это было в конце 80, компилятор на 8" флопи. понравились структуры, по тем временам очень прогрессивные. пописал, получил удовольствие... , перешёл на другое место и всё. ...

Понял, отстал. Мне было интересно какой версии компилятор с АДА Вы пользовали и насколько плотно. Участвовал (делал синт и лекс анализатор к одному из таких, а мой брат ставил АДА на Эльбрусы в свое время).. просто стало любопытно за прошлое .. язык академический, потому и помер, в отличии от Си.

Кстати, сильно похоже что Java Вы знаете примерно так же как АДА (поработал - бросил).. ничего личного, просто читая этот попкорн, иных мыслей тут нет. И да, union в том или ином виде есть не только в Си, а ссылаясь на "580-й", Вы как-бы указываете свой возраст и косвенно "опыт", следы которого по сообщениям обнаружить несколько проблематично.

В общем, за "полторы недели" освоения, вполне можно открыть интернет-учебник по языку и освоить ..

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
Ну, я же говорил, что Вы слов не понимаете и Вас несёт совем в другую сторону. sprintf  тут врообще не при делах, абсолютно. Я уже писал про интерфейс Printable. Знаете. я начинаю сомневаться, что Вы действительно знаете Java (ну, что-нибудь за пределами цикла for).
просто у меня есть два случая . первый когда набор байт поступает из вне - то тогда можно в этом наборе поменять местами и отправить.  и второй когда в ардуинке отправляется в цикле из одно места , там менять не получится нужно переписывать в другой массив. и в нем менять. как это сделать не стремясь к сокращению кода , места в озу и не заботясь о быстродействии - у меня пробоем нет. мне надо вывести в Serial.wreite(buf,n).

Цитата:
Такое бывает, например, когда приходится формировать пакет данных по определённому протоколу, а порядок байтов в нём, как назло, не совпадает с принятым в микроконтроллере или конкретном компиляторе.
имено такая ситуация.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

JonHappy1 пишет:

Цитата:
Ну блин .. Вы ни разу юнионом не пользовались?
представляешь, за полторы недели вхождения в Си ещё не успел...

А Вы считаете, что юниона до Си не было?

Помнится, еще в FORTRAN'е были COMMON блоки, включающие в себя функциональность юнионов.

С Адой подробно не знаком, но, судя по тому, что она восходит к Паскалю, вряд ли в ней не было аналогов юниона.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Мля, да шож тварицца-то?

У человека с сорокалетним стажем и опытом работы на всём, от цифровых кодов до Ады, возинкла проблема два пальца обосс... байта поменять! И он этой охренительной проблемой уже два дня всем мозг выносит.

У меня уже попкорн закончился, жую снятую с ушей лапшу! Даже аватарку поменял по такому поводу.

В общем, мужики - это стопудовый тролль. Сидит щас и ржёт над нами.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да ладно. Ада - классный язык, особенно книжка была с описанием стандарта. Так и называлась "Язык Ада". Золотом по черной обложке. Когда читал в поезде, бабки на нижней полке крестились неистово все три дня поездки. :)

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
А Вы считаете, что юниона до Си не было?

Помнится, еще в FORTRAN'е были COMMON блоки, включающие в себя функциональность юнионов.

С Адой подробно не знаком, но, судя по тому, что она восходит к Паскалю, вряд ли в ней не было аналогов юниона

в алголе не было, в паскале нет, в ассемблерах нет, в аде по другому нечто подобное, в аксессе нет, в java нет.

Цитата:
У человека с сорокалетним стажем и опытом работы на всём, от цифровых кодов до Ады, возинкла проблема два пальца обосс... байта поменять! И он этой охренительной проблемой уже два дня всем мозг выносит.
для тебя как два польца, взял бы да подробно рассказал. чтоб было минимум исполняемого кода, минимум занятого озу, и максимум быстродействия.
не разу не писав на Си , за 2 недели отладить клиента ws, подключить лазерный дальномер, и всё это заставить работать вместе -получив бегущую  кривую в браузере в реальном времени отражающую дальность от дачика до препятствия. я считаю достатосно продктивно.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

JonHappy1 пишет:

...

в паскале нет,

Пипец наглое, брехливое ЧМО, в Паскале это называется запись с вариантами!

Какой еще язык ты "знаешь"?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Блин, специально пошарил про жабу:

Прочие отличия от C

 

  • Java допускает локальные объявления переменных в месте их использования (с большими ограничениями, чем в C++).
  • В Java отсутствует struct, т.к. класс с открытыми переменными и без методов - это структура C.
  • В Java нет union, т.к. union можно смоделировать подклассами.

Так он и JAVA не знает! :)

Нет, реализовать С-подобные union похоже запрещено явно в жабе.

Ну и за Алгол абыдна .. Алгол-68 вполне имел и структуры и объединения..