Проблемы с вводом в 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);
}
@Jack Lythgoe, 👍2
Обсуждение1 ответ
Вы столкнулись с ошибкой в реализации parseFloat()
.
Эта функция считывает отправленное число как целое, игнорируя
десятичную точку, и сохраняет его в long
. Затем он умножает его на
коэффициент масштабирования (степень 0,1), чтобы получить правильное значение.
Проблема в том, что если вы укажете слишком много значащих цифр, целое
число переполнится, и вы получите мусор. Например, "44.64978683" интерпретируется
как
(long) 4464978683 * 0.00000001
но (длинный) 4464978683
переполняется и перекатывается к 170011387, отсюда
и результат, который вы получаете.
Простой обходной путь: не указывайте так много значащих цифр. В любом случае они не имеют
значения, учитывая разрешение float
.
Edit: Я не нашел никакого отчета об ошибке для этой проблемы, поэтому я отправил свой собственный в команду разработчиков Arduino.
Обновление: По запросу сопровождающего я отправил запрос на вытягивание с неудачным модульным тестом, выявившим эту ошибку. Затем мы работали над исправлением, которое теперь было объединено с master. Он должен быть опубликован в следующем выпуске ArduinoCore-API.
Однако обратите внимание, что ядро AVR еще не использует общий репозиторий API. В то же время, возможно, стоит отправить запрос на извлечение в ArduinoCore-avr, который выберет исправление из ArduinoCore-API.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
Что вы подразумеваете под “Неверно отправленное значение и неверно отображаемое значение”? А чего ты ожидал? Что было показано вместо этого?, @Edgar Bonet
добавлено изображение результата, @Jack Lythgoe
пожалуйста , никаких изображений ... добавьте текст и отформатируйте его как код, @jsotola