因此,我制作了一个电路,该电路使用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语句。首先,我只是想知道为什么串行端口会以这种方式工作,以及我如何能够规避该问题,因此它只为一个输入输出一个值。
答案 0 :(得分:0)
如果您在输入数字之后发送回车符或换行符,则在运行Serial
之后,它们仍将位于parseInt
缓冲区中。
parseInt
再次运行时,它无法解析这些字符并返回0
,然后由您的代码进行处理。
无法分辨parseInt
解析实际0
字符与此错误情况之间的区别。可能的解决方案:
strtol
或atoi
)while (Serial.available())
{
Serial.read();
}