因此,我制作了一种电路,通过使用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 (这只是ADC的下限)。
相反,我的输出是:
-2.05 (延迟) -2.05
然后,当我的输入是2048时,我的输出是:
0(延迟) -2.05
输入4095会得到以下结果:
2.05 (延迟) -2.05
因此,据我所知,在arduino第一次读取我的输入之后,值0被留在串行端口内,然后触发if语句。首先,我只是想知道为什么串行端口会这样做,以及我如何才能绕过这个问题,使它只为一个输入打印一个值。
发布于 2019-01-04 18:16:09
如果您在输入数字后发送回车符或换行符,则在parseInt运行后,它们仍将位于Serial缓冲区中。
当parseInt再次运行时,它无法解析这些字符并返回0,然后由您的代码进行处理。
无法区分parseInt解析实际的0字符和此错误条件之间的区别。可能的解决方案:
strtol或atoi,如下所示:while (Serial.available())
{
Serial.read();
}https://stackoverflow.com/questions/54031206
复制相似问题