Serial.available () все еще читает данные, несмотря на отсутствие ввода - PullRequest
0 голосов
/ 04 января 2019

поэтому я создал схему, которая отправляет аналоговый сигнал через ЦАП, используя I2C, а затем считывает аналоговый сигнал через АЦП.Тем не менее, я получаю неожиданный вывод из кода ниже:

#include <Wire.h>
#include <Adafruit_MCP4725.h>
#define voltsIn A0

Adafruit_MCP4725 dac; // constructor

uint32_t dac_value=0;
uint8_t adcValueRead[3] = {};  
int16_t result=0;

void setup(void) {
  Serial.begin(9600);
  Wire.begin();
  dac.begin(0x60);  
}

void loop(void) {
    if (Serial.available()>0) {
      dac_value=Serial.parseInt()

      Wire.beginTransmission(0x6A);
      Wire.write(0xA8);
      Wire.endTransmission();

      delay(1000);
      Wire.requestFrom(0x6A, 3);
      for (uint8_t i=0; i<3; ++i) {
        adcValueRead[i]=Wire.read();
      }


      result = (( ( (int16_t)(adcValueRead[0]) ) << 8) + adcValueRead[1]);

      Serial.print(result*0.0000625);

       delay(500);
    }
}

Таким образом, ожидаемый вывод при вводе 0 должен быть:

-2.05 (это просто нижний пределАЦП).

Вместо этого мой вывод:

-2.05 (задержка) -2.05

Тогда, когда мой ввод 2048, мой вывод:

0 (задержка) -2.05

Ввод 4095 дает мне:

2.05 (задержка) -2.05

Итак, насколько я понимаю, после того, как arduino прочитает мой ввод в первый раз, значение0 затем остается внутри последовательного порта, который затем запускает оператор if.Во-первых, мне просто интересно, почему последовательный порт будет действовать таким образом и как я мог бы обойти проблему, чтобы он печатал только одно значение для одного входа.

1 Ответ

0 голосов
/ 04 января 2019

Если вы отправляете возврат каретки или разрывы строк после вашего введенного номера, они все равно будут в буфере Serial после выполнения parseInt.

Когда parseInt запускается снова, он не может их проанализироватьсимволов и возвращает 0, который затем обрабатывается вашим кодом.

Невозможно определить разницу между parseInt разбором фактических 0 символов и этим условием ошибки.Возможные решения:

  • Отправьте целые числа без завершающих символов
  • Используйте другой метод преобразования (например, strtol или atoi)
  • Очистите полевходящий последовательный буфер после каждого чтения, например:
while (Serial.available())
{
    Serial.read();
}
...