陷入Arduino IDE的for循环中

时间:2017-05-04 16:25:13

标签: arduino arduino-uno 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循环返回到address=0而不在其之后打印任何内容,或者在loop()之前打印。为什么会这样?

Look at the output in the Serial

2 个答案:

答案 0 :(得分:4)

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

address = 255以及for循环重新开始检查条件,255次传递以及address++1添加到address时会发生什么address = 0

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

答案 1 :(得分:1)

或者,您可以使用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

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

然而,在8位微控制器上,用于操作整数的代码会更慢并占用更多空间,因此根据您的代码,您可以通过坚持使用一个字节来获得更好的效果为你的地址。