我使用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()
之前打印。为什么会这样?
答案 0 :(得分:4)
我确定它与你声明address
为一个字节有关,最大可以是255的整数。如果您将1
添加到字节值255
,它会再次循环到0
。
当address = 255
以及for循环重新开始检查条件,255
次传递以及address++
将1
添加到address
时会发生什么address = 0
。
答案 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位微控制器上,用于操作整数的代码会更慢并占用更多空间,因此根据您的代码,您可以通过坚持使用一个字节来获得更好的效果为你的地址。