Как уменьшить количество сериалов

Тема в разделе "Arduino & Shields", создана пользователем Vector2019s, 9 июл 2021.

  1. Vector2019s

    Vector2019s Нуб

    Здравствуйте! Есть такой вопрос: Программа должна отправлять разношёрстные типы данных. Я отправляю через Serial... Пример прилагается. Можно ли осуществлять данную отправку не повторяя много раз Serial, а вызывать Serial в цикле?
    Код (C++):

    #define Set 4
    #define CS 5

    unsigned long timer_radio;
    unsigned long int period_radio = 100;
    float altReal = 0;
    float getVectorA = 9.8;
    bool flag_start = 0;
    bool flag_undoking = 0;
    bool flag_ss = 0;
    bool flag_landing = 0;


    void setup()
    {
      Serial1.begin(9600);
      pinMode(Set, HIGH);
      pinMode(CS, LOW);
    }

    void loop()
    {
      if(timer_radio + period_radio > millis())
      {
       timer_radio = millis();
       Serial1.print("CS");
       Serial1.print(";");
       Serial1.print(millis());
       Serial1.print(";");
       Serial1.print(altReal);
       Serial1.print(";");
       Serial1.print(getVectorA);
       Serial1.print(";");
       Serial1.print(flag_start);
       Serial1.print(";");
       Serial1.print(flag_undoking);
       Serial1.print(";");
       Serial1.print(flag_ss);
       Serial1.print(";");
       Serial1.print(flag_landing);
       Serial1.print("\n");
      }
     
     
         
    }
    Код (C++):

    #define Set 4
    #define CS 5

    unsigned long timer_radio;
    unsigned long int period_radio = 100;
    float altReal = 0;
    float getVectorA = 9.8;
    bool flag_start = 0;
    bool flag_undoking = 0;
    bool flag_ss = 0;
    bool flag_landing = 0;


    void setup()
    {
      Serial1.begin(9600);
      pinMode(Set, HIGH);
      pinMode(CS, LOW);
    }

    void loop()
    {
      if(timer_radio + period_radio > millis())
      {
       timer_radio = millis();
       Serial1.print("CS");
       Serial1.print(";");
       Serial1.print(millis());
       Serial1.print(";");
       Serial1.print(altReal);
       Serial1.print(";");
       Serial1.print(getVectorA);
       Serial1.print(";");
       Serial1.print(flag_start);
       Serial1.print(";");
       Serial1.print(flag_undoking);
       Serial1.print(";");
       Serial1.print(flag_ss);
       Serial1.print(";");
       Serial1.print(flag_landing);
       Serial1.print("\n");
      }
     
     
         
    }
     
  2. a1000

    a1000 Гуру

    Объедините выводимые данные в одну строку и выводите за один раз.
     
  3. a1000

    a1000 Гуру

    Как-то типа
    Код (C++):
    String data = "CS" + ";" + String(millis()) + ";" + String(altReal) + ";" + String(getVectorA) + ";" + String(flag_start) + ";" + String(flag_undoking) + ";" + String(flag_ss) + ";" + String(flag_landing) + "\n";
    Serial1.print(data);
     
  4. Unixon

    Unixon Оракул Модератор

    Это прямо приглашение к срыву стека и фрагментация памяти. :)
    На микроконтроллерах лучше так не делать...
     
  5. akl

    akl Гуру

    если без string всё это сделать по православному на ЧИстом Си, то будет нормально
     
  6. Unixon

    Unixon Оракул Модератор

    В принципе так можно сделать, но за возможность итерировать переменные придется заплатить и более сложным кодом и памятью. Чтобы перебирать переменные в цикле, придется, как минимум, сложить их указатели в массив, при необходимости сделать то же самое для заголовков. Альтернативно - передавать через переменный список параметров функции в стеке, см. va_arg и т.д.. Непосредственно печать нужно будет прокинуть через свою функцию типа print(std::variant<typelist> arg), которая будет дергать из себя какой либо из Serial.print() в зависимости от типа аргумента.
     
  7. Asper Daffy

    Asper Daffy Иксперд

  8. parovoZZ

    parovoZZ Гуру

    воткнуть всё в массив int8_t и передавать по указателю. На приёмной стороне сделать обратную операцию.
    Поймите: bool, float - это всё в ВАШЕЙ голове. МК оперирует ТОЛЬКО нулями и единицами.
     
  9. Asper Daffy

    Asper Daffy Иксперд

    А моя голова оперирует bool, float и др. И я хочу писать так, как мне удобно, а не как удобно МК или кому-то другому.
     
    Последнее редактирование: 9 июл 2021
    Airbus и issaom нравится это.
  10. a1000

    a1000 Гуру

    Вы пишите как удобно компилятору. На незамутнённом ASM типизации переменных не существует в принципе. А такой прикол как область видимости переменных вообще воспринимается как дичь.:)
     
    parovoZZ нравится это.
  11. Asper Daffy

    Asper Daffy Иксперд

    Какой нах асм?

    Как выражается Паровоз, все эти sbi, equ и прочие addc
    Писать надо сразу в HEX кодах! Можно в двоичных!
     
    SergeiL нравится это.
  12. a1000

    a1000 Гуру

    Тот в который компилятор переводит всё, что написано на языках высокого уровня.;)
     
  13. Asper Daffy

    Asper Daffy Иксперд

    Никогда он ни в какой "асм" ничего не переводит. Он переводит в машинные команды.
     
  14. a1000

    a1000 Гуру

    Вполне может быть. Я спорить не буду. Учился всему сам, надёжность источников знаний могла быть ненадёжной. У меня в голове картинка сложилась такая. На сколько она соответствует действительности судить не берусь. Но, в книге Ю. Ревича, которую тут все хвалят и советуют новичкам, есть пример прямого перевода HEX файла (а он, на секундочку, непосредственно заливается в память микроконтроллера) в команды ASM. Так, что запишите вы 1100 или rjmp это одно и тоже.
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Эмм.. У Ревича в той самой книге нет ни слова про Си а только ассемблер. Про перевод с асма в НЕХ что то не припомню могу ошибаться но это есть в блоге у DiHalt a. Там он какраз рассказывает на уровне ликбеза как перевести магические цыферки в команды ассемблера. Но про Си там тоже ни слова
     
  16. a1000

    a1000 Гуру

    У меня скачана книга "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" третье издание. На странице 82 расказывается о hex файле и как он устроен. Там есть и расшифровка.
    Не претендую на истину в последней инстанции, просто выскажу своё понимание. На каком языке мы бы не писали, после компиляции получим hex файл. Из него можно получить ассемблерный листинг просто заменив код на мнемоники инструкций. Да, будут заморочки с адресами и переходами, но код мы получим. Когда мы пишем на ассемблере мы вместо кодов инструкций процессора используем мнемоники, их буквенное обозначение. Зачем? Да их проще запомнить. Компилятор, хотя это даже и не компилятор, формируя hex файл заменяет их кодами понятными процессору. Вот и весь процес "компиляции" ассемблерного кода. Да, часть тупой механической работы "компилятор" берёт на себя. Это вычисление адресов переходов по меткам, замена символьных имён регистров на реальные адреса памяти и т.д. Так, что процессор будет видеть те-же инструкции из ассемблерного листинга, только в виде двоисного кода. Вот и все
     
  17. parovoZZ

    parovoZZ Гуру

    сперва в асм, затем в машинные команды.
     
  18. Vector2019s

    Vector2019s Нуб

    Спасибо. Будем работать.:)
     
  19. b707

    b707 Гуру

    вот это вот неверное использование миллис, будет глючить при переполнении
     
  20. Asper Daffy

    Asper Daffy Иксперд

    Нет. Никогда ни в какой "асм".

    Если ему "заказать" выдать ассемблерный код, он его уже из команд "взад" восстанавливает.