尽管没有输入,Serial.available()仍在读取数据

时间:2019-01-03 23:27:07

标签: arduino i2c

因此,我制作了一个电路,该电路使用I2C通过DAC发送模拟信号,然后通过ADC读回模拟信号。但是,我从下面的代码中得到了意外的输出:

#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(这只是ADC的下限)。

相反,我的输出是:

-2.05(延迟)-2.05

然后,当我的输入为2048时,我的输出为:

0(延迟)-2.05

输入4095可得到:

2.05(延迟)-2.05

因此,据我了解,在arduino第一次读取我的输入后,值0留在了串行端口内,然后触发了if语句。首先,我只是想知道为什么串行端口会以这种方式工作,以及我如何能够规避该问题,因此它只为一个输入输出一个值。

1 个答案:

答案 0 :(得分:0)

如果您在输入数字之后发送回车符或换行符,则在运行Serial之后,它们仍将位于parseInt缓冲区中。

parseInt再次运行时,它无法解析这些字符并返回0,然后由您的代码进行处理。

无法分辨parseInt解析实际0字符与此错误情况之间的区别。可能的解决方案:

  • 发送不带任何尾随字符的整数
  • 使用其他转换方式(例如strtolatoi
  • 每次读取后清除传入的串行缓冲区,如下所示:
while (Serial.available())
{
    Serial.read();
}