Проблемы с Serial.read()

void loop()
{
  if (sensor.begin() == true)
  {
    Serial.print("Current Conversion Mode: ");
    Serial.println(sensor.getConversionMode());
    Serial.println("Enter your mode of Conversion (number 0 - 3): ");
    while (Serial.available() == 0); // Ожидает ввода пользователя
    mode = Serial.read(); // Считывает входную строку из последовательного порта
    Serial.print("Number recieved: ");
    Serial.println(mode);
    delay(500);
    if (mode == '0' | mode == '1' | mode == '2' | mode == '3')
    {
      sensor.setConversionMode(mode);
      Serial.println();
      delay(500);
    }
    else
    {
      Serial.println("Conversion mode unsuccessfully set - Please enter a number 0 - 3");
    }
    delay(1000);
  }
  else // Запускается, когда устройство не удалось правильно настроить
  {
    Serial.println("Device failed to setup");
  }
}

В настоящее время я использую красную плату SparkFun для запуска этого кода. Я пытался получить это для чтения с последовательного монитора, чтобы принять ввод для отправки в библиотеку, которую я написал, чтобы изменить значение регистра режима преобразования датчика температуры. Когда я запускаю код, я могу только один раз правильно запустить его, затем он переходит непосредственно к оператору else для входных данных, говоря, что 0-3 не был входным. Я пробовал другие методы, предложенные людьми на этом веб-сайте и форумах Arduino, но ни один из них мне пока не помог. Я не уверен, поможет ли добавление дополнительных задержек - это было одно из наиболее распространенных предложений, которые я нашел для этой конкретной проблемы, и оно не было таким последовательным. Пожалуйста помоги! Спасибо.

, 👍1

Обсуждение

Что говорит вам ваш «Полученный номер:», когда он терпит неудачу?, @Majenko

Когда он терпит неудачу, он имеет значение 0, но раньше иногда я получал -1., @Madison Chodikov

Какой тип данных является «режимом»?, @Majenko

Режим имеет тип данных char. Я объявил его как глобальную переменную над циклом, @Madison Chodikov

Протестировал его с фиктивной реализацией sensor. Работает как положено. Проблема должна быть в той части кода, которую вы не показываете., @Edgar Bonet

@EdgarBonet Мне действительно интересно, как этот код может работать так, как ожидалось. | не является операндом для ИЛИ. Кроме того, «режим» — это байт, но он сравнивается с символом. Я думаю, есть шанс найти ошибку в предоставленном коде., @Sim Son

@SimSon: Вы правы в том, что | должно быть ||, но они оказываются эквивалентными, если их операнды равны 0 или 1. А mode - это char согласно комментарию ОП., @Edgar Bonet

@SimSon, спасибо за подсказку - сейчас я это изменю, @Madison Chodikov


1 ответ


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

0

Используя слегка измененную версию вашего скетча, я получаю следующий вывод в последовательном мониторе, когда ввожу число 2.

Текущий режим преобразования: введите свой режим преобразования (цифры от 0 до 3): Получено число: 2

Текущий режим преобразования: введите свой режим преобразования (цифры от 0 до 3): Полученный номер:

Не удалось установить режим преобразования. Введите число от 0 до 3. Текущий режим преобразования: введите свой режим преобразования (цифры 0–3): Полученный номер:

Не удалось установить режим преобразования. Введите число от 0 до 3. Текущий режим преобразования: введите свой режим преобразования (число 0–3):

Если вы измените mode на int, а затем повторите проверку, вы увидите, что второе и третье "Число получено" равны 10 и 13. Это будет новая строка. и символы возврата каретки. Когда вы отправляете данные через последовательный монитор, вы выбрали «Без окончания строки» или что-то еще?

Вот тестовый скетч:

char mode;

void setup(){
  Serial.begin(9600);
}

void loop()
{
  if (true)
  {
    Serial.print("Current Conversion Mode: ");
    //Serial.println(sensor.getConversionMode());
    Serial.println("Enter your mode of Conversion (number 0 - 3): ");
    while (Serial.available() == 0); // Ожидает ввода пользователя
    mode = Serial.read(); // Считывает входную строку из последовательного порта
    Serial.print("Number recieved: ");
    Serial.println(mode);
    delay(500);
    if (mode == '0' | mode == '1' | mode == '2' | mode == '3')
    {
      //sensor.setConversionMode(mode);
      Serial.println();
      delay(500);
    }
    else
    {
      Serial.println("Conversion mode unsuccessfully set - Please enter a number 0 - 3");
    }
    delay(1000);
  }
  else // Запускается, когда устройство не удалось правильно настроить
  {
    Serial.println("Device failed to setup");
  }
}
,

Спасибо за предложение, оно сработало! Я просто изменил значение на int, а затем изменил серийный монитор на «Без окончания строки», и это сработало. Я никогда раньше не менял эту настройку и не осознавал, что она там есть. Еще раз спасибо!, @Madison Chodikov