卡在 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
.
或者,您可以改用 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,因此根据您的代码,您可能仍然会更好通过能够坚持使用一个字节作为您的地址。
我正在使用 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
.
或者,您可以改用 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,因此根据您的代码,您可能仍然会更好通过能够坚持使用一个字节作为您的地址。