卡在 Arduino 的 for 循环中 IDE

Stuck in a for loop in Arduino IDE

我正在使用 Arduino 寻找 I2C 地址,在进行到一半时出现了这个新故障,我不知道是 IDE 还是我快疯了。

我知道其中大部分可能并不重要,但我不知道发生了什么,所以这是我的整个循环。

void loop(){

    byte error, address;
    int nDevices;

    Serial.println("Scanning...");

    nDevices = 0;
    for(address = 0; address <= 255; address++ )
    {

        Wire.beginTransmission(address);

        error = Wire.endTransmission();
        Serial.print(address);
        Serial.print("|");
        Serial.println(error);
        if (error == 0)
        {
            Serial.print("I2C device found at address 0x");
            if (address<16)
            Serial.print("0");
            Serial.print(address, HEX);
            Serial.println(" !");
            nDevices++;
        }
        else if (error==4)
        {
            Serial.print("Unknow error at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.println(address,HEX);
        }
        delay(200);
        //Serial.println(address);
    }
    delay(150);
    Serial.println("Exiting");

    if (nDevices == 0)
        Serial.println("No I2C devices found\n");
    else
        Serial.println("done\n");

    delay(30000);

    exit(0);
}

正如您在图片中看到的,我将 for 循环 returns 包含在 address=0 中,而没有在 loop() 之后或之前打印任何内容。为什么会这样?

我确定这与您将 address 声明为一个字节有关,该字节最多可以是整数 255。如果将 1 添加到 255 的字节值,它会再次循环到 0

address = 255 和 for 循环返回检查条件时会发生什么,255 通过并且 address++1 添加到 address所以现在 address = 0.

https://www.arduino.cc/en/reference/byte

或者,您可以改用 while 循环并在循环的最后递增地址计数器,然后进行测试以查看它是否已返回到零。在循环的第一个 运行 中,地址计数器将为 1,因此循环将继续,直到计数器达到 255,此时增量会将其环绕为零并执行到 break 语句。

byte address = 0;

while( true ) // Creating an unconditional loop
{
    // Run your test here

    address++;

    if( !address ) // If address has wrapped around to 0, exit the loop
    {
        break;
    }
}

...或 do/while 循环,它做同样的事情,但在某些情况下可能稍大。

byte address = 0;

do
{
    // Run your test here

    address++;
} while( address ); // The loop will continue until address becomes zero again

根据您的微控制器,这可能需要多几个字节的程序 space 尽管看起来 while 循环最终与 ATMega328 上的 for 循环大小相同。 (当然是 YMMV)

然而,在 8 位微控制器上,操作 int 的代码会更慢并且占用更多 space,因此根据您的代码,您可能仍然会更好通过能够坚持使用一个字节作为您的地址。