Функция Abs не обеспечивает требуемые значения - PullRequest
0 голосов
/ 06 июня 2018

Я пытался этот код сопоставить значение с плавающей запятой с другим значением с плавающей запятой, используя функцию abs. Вот код:

float li=0;
float d=2;
void setup() {

Serial.begin(9600);

}

void loop() {
   li=li+0.1125;
   Serial.println(li);
   if(abs(li-d)<0.2)
    {
      Serial.println('h');
      exit(0);
    }

}

Я хочу, чтобы значение li достигало ближайшего к значению d.Разница между значениями должна быть меньше 0,2. Если true, тогда должен выполняться оператор if. Но это вывод, который я получаю:

0.11
0.22
0.34
0.45
0.56
0.68
0.79

Оператор if завершается после 0.79.Помощь!!!Я новичок в Arduino.

1 Ответ

0 голосов
/ 06 июня 2018

Объект Arduino Serial использует прерывания для отправки данных через UART.

Это помогает максимально сократить время, затрачиваемое на функцию println.

По существу, объект Serial не отправляет все данные, отправленные в функцию «println», прежде чем вернуть управление функции «loop».Из-за этого, когда вы запускаете свой код, буфер последовательной передачи заполняется.

Поэтому, когда ваш код фактически входит в условие if, некоторые данные из буфера последовательной передачи не достигли вашего монитора последовательного интерфейса.

Функция 'exit' приостанавливает всю активность Arduino.Поэтому, если в буфере передачи объекта Serial есть какие-либо данные, они не передаются.

В вашем коде функция abs работает правильно.Просто некоторые числа в буфере объекта Serial не передаются, и вы чувствуете, что что-то не так.Вам нужно будет очистить буфер передачи объектов Serial перед вызовом функции 'exit', чтобы увидеть желаемые результаты.

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

if(abs(li-d)<0.2)
{
  Serial.println('h');
  Serial.flush();
  exit(0);
}

Надеюсь, это поможет.

...