Проблемы с вводом в serial monitor

В настоящее время я работаю над проектом, где я беру частоту, и я хочу, чтобы код взял это значение и использовал формулу для определения его уровня mmH2O. Я использую последовательный монитор для ввода значений, но у меня есть проблема. При записи значений, например "44.62352548","44.49151522". Отправленное значение неверно и отображается неправильно.

Я знаю, что код, который я написал, не поддерживает такое количество значимых цифр из float. И я попробовал несколько вещей, чтобы попытаться решить эту проблему, но я не могу ее взломать.

Я пытался использовать команду dtostrf (), но я никогда не использовал это раньше и не понимаю. Кто-то из форумов arduino помог мне, но это, похоже, не сработало. Я также пробовал форматировать, но это, похоже, не сработало.

Если у кого-то есть какая-либо помощь и совет, я был бы очень признателен.

float level;
float myValue;

String msg1 = "Enter Frequency (type 0 to exit): "; 
String msg2 = "Your Frequency is: ";

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

void loop() 
{
  Serial.print(msg1);

  while (Serial.available() == 0);
  {
     
  }
  myValue = Serial.parseFloat();
  if (myValue == 0.0)
  {
    Serial.end();
  }
  else
  { 
    freqConversion();
  }
}

 void freqConversion()
{
  level = (myValue-44.712)/-0.0285493333;
  Serial.println(myValue);
  Serial.print(msg2);
  Serial.println(level);
}

, 👍2

Обсуждение

Что вы подразумеваете под “Неверно отправленное значение и неверно отображаемое значение”? А чего ты ожидал? Что было показано вместо этого?, @Edgar Bonet

добавлено изображение результата, @Jack Lythgoe

пожалуйста , никаких изображений ... добавьте текст и отформатируйте его как код, @jsotola


1 ответ


2

Вы столкнулись с ошибкой в реализации parseFloat().

Эта функция считывает отправленное число как целое, игнорируя десятичную точку, и сохраняет его в long. Затем он умножает его на коэффициент масштабирования (степень 0,1), чтобы получить правильное значение. Проблема в том, что если вы укажете слишком много значащих цифр, целое число переполнится, и вы получите мусор. Например, "44.64978683" интерпретируется как

(long) 4464978683 * 0.00000001

но (длинный) 4464978683 переполняется и перекатывается к 170011387, отсюда и результат, который вы получаете.

Простой обходной путь: не указывайте так много значащих цифр. В любом случае они не имеют значения, учитывая разрешение float.

Edit: Я не нашел никакого отчета об ошибке для этой проблемы, поэтому я отправил свой собственный в команду разработчиков Arduino.

Обновление: По запросу сопровождающего я отправил запрос на вытягивание с неудачным модульным тестом, выявившим эту ошибку. Затем мы работали над исправлением, которое теперь было объединено с master. Он должен быть опубликован в следующем выпуске ArduinoCore-API.

Однако обратите внимание, что ядро AVR еще не использует общий репозиторий API. В то же время, возможно, стоит отправить запрос на извлечение в ArduinoCore-avr, который выберет исправление из ArduinoCore-API.

,