首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管没有输入,Serial.available()仍在读取数据

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

Stack Overflow用户
提问于 2019-01-04 07:27:07
回答 1查看 216关注 0票数 0

因此,我制作了一种电路,通过使用I2C的数模转换器发送模拟信号,然后通过模数转换器读回模拟信号。然而,我从下面的代码中得到了意外的输出:

代码语言:javascript
复制
#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语句。首先,我只是想知道为什么串行端口会这样做,以及我如何才能绕过这个问题,使它只为一个输入打印一个值。

EN

回答 1

Stack Overflow用户

发布于 2019-01-04 18:16:09

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

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

无法区分parseInt解析实际的0字符和此错误条件之间的区别。可能的解决方案:

  • 发送不带任何尾随字符的整数
  • 使用不同的转换方法(对于每次读取后传入的串行缓冲区,请使用strtolatoi,如下所示:

代码语言:javascript
复制
while (Serial.available())
{
    Serial.read();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54031206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档