Serial не выводит данные на экран

Тема в разделе "Arduino & Shields", создана пользователем Kamikadze, 23 дек 2017.

  1. Kamikadze

    Kamikadze Гик

    Добрый вечер, уважаемые форумчане. Ситуация следующая: имеется 1 мега 2560, которая отсылает по i2C данные на ведомые uno. При этом ведомые принимают информацию, обрабатывают ее, и собственно продолжают ожидать прием данных от Меги. Для отладки скетча Меги в некоторые ключевые места была запилен вывод данных в сериал монитор. И наблюдается следующая картина, основной код программы выполняется, данные в монитор последовательно выводятся, но когда очередной раз должна быть выведено сообщение в Serial, выводится только первые два символа, и далее программа не выполняется. К сообщению приложил скрин. Из-за чего такое может происходить и как с этим бороться? И на всякий случай, да это именно два первых символа сообщения которое должно быть напечатано, а не какие то левые знаки, в том плане если сообщение изменить то печатаются в сериал соответственно два других первых символа сообщения, на скрине я обвел сообщение которое выводится и которое должно быть отпечатано. И может такое быть, не хватает ОЗУ?
     

    Вложения:

    • Serial.jpg
      Serial.jpg
      Размер файла:
      282,7 КБ
      Просмотров:
      906
    Последнее редактирование: 23 дек 2017
  2. rkit

    rkit Гуру

    Где-то после этой строчки, в процессе отправки, все сломалось.
     
  3. DetSimen

    DetSimen Guest

    так бывает иногда, если в момент вывода в сериал прерывания запрещены
     
    Kamikadze нравится это.
  4. Kamikadze

    Kamikadze Гик

    В момент вывода прерывания не запрещены, более того после вывода текста программа должна вывести ещё переменную и только потом прерывания запрещаются. Из—за чего это происходит и как это устранить? Если заменить могу на другую поможет? Если вообще во всем скетче убрать запрет на прерывания ( что крайне не желательно) поможет? Отзовитесь пожалуйста профи, очень нужна помощь!
     
  5. rkit

    rkit Гуру

    С чего вы решили, что вывод моментально происходит? Микроконтроллер не на на волшебстве работает. Записали строку в буфер, а потом она выводится на протяжении тысяч циклов.
     
  6. Kamikadze

    Kamikadze Гик

    Допустим все так, тогда можно добавить задержку для корректной отработки данной части программы? Или ок если верить выше сказанному отказавшись от запрета на прерывания то данный сбой будет устранён? Сейчас попробую
     
  7. b707

    b707 Гуру

    "та часть программы", в которой не работает вывод - она случаем не из прерывания вызывается?
     
  8. Kamikadze

    Kamikadze Гик

    Нет, она вызывается в функции , прерываний в данной функции нет, есть запрет на прерывание на скрине видно, после того как отправляются данные в сериал отправляется переменная в сериал и потом только запрет активируется на прерывание.
     
  9. DetSimen

    DetSimen Guest

    ну так отправка в сериал - неблокирующая, данные копируются в буфер сериала, программа продолжается дальше. Тем временем, из буфера ПО ПРЕРЫВАНИЯМ выводятся символы в сериал. А раз программа продолжается дальше, то перед запретом прерывания успевают вывестись 2 символа. И это еще много...
     
    Kamikadze нравится это.
  10. Kamikadze

    Kamikadze Гик

    Ну ок если так, поступил запрет на прерывания и Ведущее мега передает на сателиты Данные, тогда ведомые должны принять сигнал по событию и прочитать его, а они его не считывают. Т.е. им не доходит сигнал, следовательно и передан он им не был...
    Слушайте а походу действительно из-за запрета на прерывание это происходит, сейчас до гаража дойду протестирую
     
  11. Kamikadze

    Kamikadze Гик

    Спасибо огромное за помощь, да дело было все в прерываниях...
     
  12. Kamikadze

    Kamikadze Гик

    Лобрый вечер, в продолжение созданой темы, теперь в сериал монитор не выводится следующая часть скетча, а точнее цикл While, при чем сейчас прерывания отключены полностью. Ниже выложил скрин с данными которые выводятся на сериал монитор и фрагментом скетча который дальшге не работает, так же для полной картины выкладываю часть скетча которая не идет после получения данных на экран
    Код (C++):
    Serial.println("Peredacha zavershena");
            //ждем завершения операции
            int stopwhile = 0;
            while (stopwhile != 1)
            {
              delay(500);
              //опрос ног с ведомых уно
              if (digitalRead(endFunctionUno1) == HIGH)
              {
                endFunUnoOne = 1;
                Serial.println("Uno 1 doehala");
              }
              if (digitalRead(endFunctionUno2)== HIGH)
              {
                endFunUnoTwo = 1;
                Serial.println("Uno 2 doehala");
              }
              if (endFunUnoOne == 1 && endFunUnoTwo == 1)
              {
                Serial.println("obe doehali 1 povorot");
                endFunUnoOne = 0;
                endFunUnoTwo = 0;
                stopwhile = 1;
                break;
              }
              //опрос индуктивного датчика
              if (digitalRead(pinIndukcii) == HIGH)
              {
                Serial.println("pinIndukcii) == HIGH");
                InduckIGH = 1;
              }
              if (InduckIGH == 1)  // если наехали на полосу то выходим из функции
              {
                Serial.println("InduckIGH == 1");
                //тормозим моторы
                //отправляем сигнал на прерывание уно 1 и уно 2
                digitalWrite (StopMotorPinUno1, HIGH);
                digitalWrite (StopMotorPinUno2, HIGH);
                delay(5);     //время что бы ведомые уно успели посчитать количество шагов, хотя оно и не нужно я КРАСАВЧЕг, исправил код
                //выходим из функции
                digitalWrite (StopMotorPinUno1, LOW);
                digitalWrite (StopMotorPinUno2, LOW);
                //обнуляем переменную
                InduckIGH = 0;
                PostroenieMarshruta = 0;
                Where = 0;
                return;
              }
              //опрос кнопки стоп
              if (digitalRead (StopButton) == HIGH)    //Проверяем была команда стоп или нет
              {
                Serial.println("Stop Button puch");
                HandManual = 1;
                Prerivanie = 1;
                PrerivaniePark =1;
                //отправляем сигнал на прерывание уно 1 и уно 2
                digitalWrite (StopMotorPinUno1, HIGH);
                digitalWrite (StopMotorPinUno2, HIGH);
                delay(5);     //время что бы ведомые уно успели посчитать количество шагов, хотя оно и не нужно я КРАСАВЧЕг, исправил код
                //выходим из функции
                digitalWrite (StopMotorPinUno1, LOW);
                digitalWrite (StopMotorPinUno2, LOW);
                PostroenieMarshruta = 0;
                Where = 0;
                return;
              }
            }
    Видимо я чего то не догоняю, но когда цикл имел вид
    Код (C++):
    while(1)
    {
       ...
       if (условие выполнено)
          {
             ...
             return;
          }
    }
    хотя бы 6 итераций цикла проходило, с чем может быть связан данный глюк и как его лечить?
     

    Вложения:

    • Serial2.jpg
      Serial2.jpg
      Размер файла:
      256,5 КБ
      Просмотров:
      587
  13. Kamikadze

    Kamikadze Гик

    Закомментировал перебор условий в цикле и он заработал... может такое быть что ардуино зависает при опросе сигнала?
     
  14. Kamikadze

    Kamikadze Гик

    Снял предыдущий комментарий и скетч продолжил работать ... вопрос закрыт...
     
  15. DetSimen

    DetSimen Guest

    Всё дело в волшебных аптимизациях....
     
  16. Kamikadze

    Kamikadze Гик

    В оптимизациях IDE?
     
  17. brokly

    brokly Гик

  18. Kamikadze

    Kamikadze Гик

    В том то и дело , что компилятор не выдает ошибок, на скрине если вы посмотрите все видно, что написано после загрузки скетча и сколько памяти используется, я специально скрин Serial.Monitora на фоне основного скетча сделал с информацией которая после компиляции появляется
    А по поводу использования флеш памяти, спасибо за заметку, возьму на вооружение.
     
  19. brokly

    brokly Гик

    Я как то мутно спросил ? Или считаете, что я просто не знаю как убить время ? Где вы увидели вопрос про ошибки ? Ну да ладно, как хотите.
     
  20. AlexU

    AlexU Гуру

    Код (C++):
    Serial.println("Peredacha zavershena");
           //ждем завершения операции
           int stopwhile =0;
           while(stopwhile !=1)
           {
               delay(500); // здесь контроллер зависнет из-за отключенных прерываний
    ..................