столкнулся с проблемой цикла 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;
}
}
}
2 ответа
Лучший ответ:
Забудьте об использовании serialEvent()
. Это одна из самых глупых вещей, реализованных Arduino. Это не что иное, как функция, которая вызывается (обернутая в чек Serial.available()
) один раз за итерацию основной функции loop()
.
На самом деле это вовсе не функция "события".
Чтобы что-то произошло внутри цикла while
, вы должны вручную реализовать это в цикле while
. Ничто за пределами цикла while
(за исключением прерываний) не может повлиять на работу цикла while
.
Так есть ли возможности изменить код?? Пожалуйста, помогите мне, @Suraj Bhan Singh
Есть много возможностей. Лично я бы полностью отказался от цикла while., @Majenko
Теперь мой код работает так, как я отправляю данные в Arduino UNO через последовательный порт (клавиатуру), когда он получает какие-либо последовательные данные, он прокручивается до 10 раз, а когда (n>10 ) цикл остановится. В промежутках между этим всякий раз, когда я отправляю какие-либо новые данные, они не принимаются.
что именно я хочу всякий раз, когда я отправляю новые данные в Arduino UNO через последовательный порт (клавиатуру), а затем UNO должен одновременно прокручивать полученный текст на дисплее P10 DMD. Всякий раз, когда он получает новые последовательные данные, он начинает отображать эти данные на дисплее.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
какова цель цикла while? ... как вы хотите, чтобы программа вела себя?, @jsotola
Я отправляю данные в Arduino UNO через последовательный порт (клавиатуру), а затем UNO должен повернуться, чтобы прокрутить полученный текст на дисплее P10 DMD. Всякий раз, когда он получает новые последовательные данные, он начинает отображать эти данные на дисплее. Я хочу это., @Suraj Bhan Singh
прокручивать полученный текст
... вы не определили четко желаемую операцию... серийные символы поступают по одному... имейте это в виду, когда вы решаете, как вы хотите, чтобы прокрутка символов работала, @jsotola