столкнулся с проблемой цикла while

Я пытаюсь разработать код, в котором возникает проблема с циклом while. Как только я ввожу любую новую строку, она входит в цикл while, она считается до 10 раз, когда (n> 10), она выходит из цикла while. Возникли проблемы в этой части

while (n < 10)
  {
    while (!ret) {
      if ((time + 15) < millis()) {
        ret = dmd.stepMarquee(-1,0);
        time = millis();
      }
    }
     ret = false;
     n++;
    }

Я просто хочу, когда я ввожу любую новую строку во время выполнения цикла, она прерывает цикл и начинает отображать новую строку.

Пожалуйста, помогите мне с этим. Спасибо за вашу помощь, очень признателен.

Вот мой полный код:

#include <SPI.h>
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Arial_black_16.h"

//Запускаем библиотеку DMD как dmd
#define DISPLAYS_ACROSS 2
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

String inputString = "";
boolean stringComplete = false;
String commandString = "";


void ScanDMD()
{ 
  dmd.scanDisplayBySPI();
}


void setup()
{
   Serial.begin(9600);
   Serial.println("Arduino Start");
   Timer1.initialize( 5000 );
   Timer1.attachInterrupt( ScanDMD );
   dmd.clearScreen( true );
}

void loop() {

if(stringComplete)
{
  stringComplete = false;
  getCommand();

  if(commandString.equals("STAR"))
  {
   dmd.clearScreen( true );
  }

  else if(commandString.equals("PRSC"))
  {
    String text = getTextToPrint();
    printText(text);
  }
  inputString = "";
}

}


void getCommand()
{
  if(inputString.length()>0)
  {
     commandString = inputString.substring(1,5);
  }
}


String getTextToPrint()
{
  String value = inputString.substring(5,(inputString.length())-2);
  return value;
}

void printText(String text)
{
  char newString[256];
  int sLength = text.length();
  text.toCharArray( newString, sLength+1 );
  dmd.selectFont(System5x7);
  dmd.drawMarquee( newString , sLength , (32*DISPLAYS_ACROSS )-1 ,1);
  unsigned long time;
  boolean ret = false;
  time = millis();
  int n;
  n= 0;
  while (n < 10)
  {
    while (!ret) {
      if ((time + 15) < millis()) {
        ret = dmd.stepMarquee(-1,0);
        time = millis();
      }
    }
     ret = false;
     n++;
    }
} 

void serialEvent() {        
  while (Serial.available()) {            // получаем новый байт:
    char inChar = (char)Serial.read();    // добавляем его в inputString:
    inputString += inChar;                // если входящий символ является новой строкой, устанавливаем флаг
    // так что основной цикл может что-то с этим сделать:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

, 👍0

Обсуждение

какова цель цикла while? ... как вы хотите, чтобы программа вела себя?, @jsotola

Я отправляю данные в Arduino UNO через последовательный порт (клавиатуру), а затем UNO должен повернуться, чтобы прокрутить полученный текст на дисплее P10 DMD. Всякий раз, когда он получает новые последовательные данные, он начинает отображать эти данные на дисплее. Я хочу это., @Suraj Bhan Singh

прокручивать полученный текст... вы не определили четко желаемую операцию... серийные символы поступают по одному... имейте это в виду, когда вы решаете, как вы хотите, чтобы прокрутка символов работала, @jsotola


2 ответа


Лучший ответ:

0

Забудьте об использовании serialEvent(). Это одна из самых глупых вещей, реализованных Arduino. Это не что иное, как функция, которая вызывается (обернутая в чек Serial.available()) один раз за итерацию основной функции loop().

На самом деле это вовсе не функция "события".

Чтобы что-то произошло внутри цикла while, вы должны вручную реализовать это в цикле while. Ничто за пределами цикла while (за исключением прерываний) не может повлиять на работу цикла while.

,

Так есть ли возможности изменить код?? Пожалуйста, помогите мне, @Suraj Bhan Singh

Есть много возможностей. Лично я бы полностью отказался от цикла while., @Majenko


0

Теперь мой код работает так, как я отправляю данные в Arduino UNO через последовательный порт (клавиатуру), когда он получает какие-либо последовательные данные, он прокручивается до 10 раз, а когда (n>10 ) цикл остановится. В промежутках между этим всякий раз, когда я отправляю какие-либо новые данные, они не принимаются.

что именно я хочу всякий раз, когда я отправляю новые данные в Arduino UNO через последовательный порт (клавиатуру), а затем UNO должен одновременно прокручивать полученный текст на дисплее P10 DMD. Всякий раз, когда он получает новые последовательные данные, он начинает отображать эти данные на дисплее.

,