Arduino - 等待功能导致数字堆积

Arduino - waiting on function causes a number pile-up

我有一个函数 filledFunction() returns 一个浮点数 filled:

float filledFunction(){
    if (FreqMeasure.available()) {
        sum = sum + FreqMeasure.read();
        count = count + 1;
        if (count > 30) {
            frequency = FreqMeasure.countToFrequency(sum / count);
            a = frequency * x;
            b = exp (a);
            c = w * b;
            d = frequency * z;
            e = exp (d);
            f = y * e;
            float filled = c + f;
            sum = 0;
            count = 0;
            return filled;
        }
    }
}

当我用

调用这个函数时
while (1){
    fillLevel = filledFunction();
    int tofill = 500 - fillLevel;
    Serial.print("fillLevel:    ");
    Serial.println(fillLevel);
    Serial.print("tofill:       ");
    Serial.println(tofill);

串口监视器应该输出两个加起来为 500 的数字,名为 fillLeveltofill。相反,我得到了相似值的重复序列:

http://i.imgur.com/Y9Wu8P2.png

前两个值是正确的 (410.93 + 89 = 500),但后面的 60 个值我不知道,不属于那里。

我正在使用 arduino nano

如果 FreqMeasure.available() return 和 true AND count > 30filledFunction() 函数仅 return 是一个值。正如 this question 的答案中所述,C89、C99 和 C11 标准都说函数的默认 return 值是未定义的(也就是说,如果函数在没有执行 return 语句的情况下完成).这真的意味着任何事情都可能发生,例如输出任意数字。

此外,您看到的输出从 'correct' 开始,其中一个数字从 500 中减去,即使它们具有奇怪的值,例如 11699.00-11199(等于 500 - 11699.00)。然而,在输出的下方,这似乎崩溃了,原因是在 Arduino Nano 上,int 最多只能容纳 32767 的数字,因此减法的结果太大并且 'overflows' 是一个大的负数。

修复 filledFunction() 函数以显式 return 一个值,即使 FreqMeasure.available()falsecount <= 30 并确保它不能 return 大于 500 的数字可能会解决这些问题。