Serial Monitor печатает странные значения и пропускает строки

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

В настоящее время я пытаюсь заставить свой код работать и отлаживать его с помощью Serial Monitor, но он выводит странные вещи.

Скорость передачи одинакова для монитора и Serial.begin().

int checkSum[] = {-1, -1};

String stringPool[] =   
                      {
                        "Satz 1", "Satz 2", 
                        "Satz 3", "Satz 4",
                        "Satz 5", "Satz 6", 
                        "Satz 7", "Satz 8", 
                        "Satz 9", "Satz 10", 
                        "Satz 11", "Satz 12", 
                        "Satz 13", "Satz 14", 
                        "Satz 15", "Satz 16", 
                        "Satz 17", "Satz 18",
                        "Satz 19", "Satz 20",
                        "Satz 21", "Satz 22"            
                      };



String chooseRandom ()
{
  bool isMaybeThreeTimes;
  int randomInt;

  do
  {
      randomInt = random( 0, sizeof( stringPool ) -1 );

      // выбраны первое и последующие случайные числа
      if( checkSum[0] == -1 ) { checkSum[0] = randomInt; }
      else 
      {
        checkSum[1] = checkSum[0];
        checkSum[0] = randomInt;
      }

      if( randomInt == checkSum[0] && randomInt == checkSum[1] )
      {
        isMaybeThreeTimes = true;
      }
      else
      {
        isMaybeThreeTimes = false;
      }

      Serial.print("Current random value: " + randomInt);
      delay(1000);
      Serial.print("Last random value: " + checkSum[0]);
      delay(1000);
      Serial.print("Last last random value: " + checkSum[1]);
      delay(1000);
      Serial.print("Three times in row?: " + isMaybeThreeTimes);
      delay(1000);

   } while ( isMaybeThreeTimes );


  return stringPool[randomInt];
}

void buttonPressed()
{
  String stringToPrint = chooseRandom();
  // Отправляем строку на принтер adafruit.
  Serial.println(stringToPrint); 
}

void setup() 
{
    Serial.begin(19200);
    delay(2000);
    Serial.println("Setup finished");
    randomSeed(analogRead(0));


}

void loop() 
{
    buttonPressed();
}

Есть идеи, почему это происходит? Я переключил скорость передачи данных, изменил задержки и изменил места, где и как часто и с какой частотой вызывается метод buttonPressed().

Вот изображение вывода:

, 👍0

Обсуждение

sizeof(stringPool) это не то, что вы догадываетесь, если вам нужно 22 или подобное число., @DataFiddler

"Текущее случайное значение: " + randomInt; работает, только если randomInt равно 0, и никогда не добавляет что-либо к тексту, а увеличивает указатель на этот текст, что выглядит как усечение первых символов., @DataFiddler


1 ответ


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

2
int checkSum[] = {-1, -1};

const String stringPool[] = {
                        "Satz 1", "Satz 2", "Satz 3", "Satz 4",
                        "Satz 5", "Satz 6", "Satz 7", "Satz 8", 
                        "Satz 9", "Satz 10", "Satz 11", "Satz 12"
                      };

const String& chooseRandom () {
  bool isMaybeThreeTimes;
  int randomInt;

  do {
      randomInt = random( 0, sizeof(stringPool) / sizeof(stringPool[0]));
      isMaybeThreeTimes = (randomInt == checkSum[0] && randomInt == checkSum[1] );

      Serial.print("Current random value: "); Serial.println(randomInt);
      delay(1000);
      Serial.print("Last random value: "); Serial.println(checkSum[0]);
      delay(1000);
      Serial.print("Last last random value: "); Serial.println(checkSum[1]);
      delay(1000);
      Serial.print("Three times in row?: "); 
      Serial.println(isMaybeThreeTimes?"Yes":"No");
      delay(1000);
      checkSum[1] = checkSum[0]; // для следующего запуска
      checkSum[0] = randomInt;
  } while (isMaybeThreeTimes);
  return stringPool[randomInt];
}

void buttonPressed()
{  // не имеет ничего общего с нажатием кнопки, просто тест
  const String& stringToPrint = chooseRandom();  // ждем 3 секунды
  // Отправляем строку на принтер adafruit.
  Serial.println(stringToPrint); 
}

void setup() {
    Serial.begin(19200);
    delay(2000);
    Serial.println("Setup finished");
    randomSeed(analogRead(0));
}

void loop() {
    buttonPressed();
}

Некоторые исправления, не проверенные. Изменить: еще несколько исправлений, проверено.

,

Спасибо. Не могли бы вы объяснить, что не так с моим кодом?, @Cedric Jansen

посмотри мои комментарии к твоему посту. В основном у вас странное представление об операторе +. «Привет» +1 — это, конечно, «привет» :), @DataFiddler

Ага, понятно. Я думал, что смогу объединить int и строку с оператором +. Я еще не работал с С++ или С (не уверен, какой язык здесь используется) и не очень хорошо обучен работе с указателями (материал &/*). Я просто использовал свой фон Java и попытался заставить его работать. Я лучше посмотрю несколько руководств по синтаксису для arduino! Еще раз спасибо., @Cedric Jansen

это С++, и основное отличие от Java заключается в том, что вы не должны _not_: использовать объекты Arduino String для текстов., @DataFiddler