如果设备连接到 I2C 总线,我已经制作了一个 I2C 扫描器代码,打印出 I2C 地址和指示器。它适用于前 0...123 个地址,直到打印最后一行 4...127
我的问题:最后一行地址怎么可能打印在“#2#”之后,而代码说明这是不可能的。希望有人能告诉我如何解决这种奇怪的代码行为。
此代码在 ESP8266 上运行并使用 Arduino 库。 在 ATmega328 上运行的相同代码不会显示这种奇怪的行为。
这是代码
uint8_t I2C_scan(uint8_t mode){ // mode0=no output, Mode1= Summery, mode2=full output
uint8_t device_cnt=0, I2C_adr=0, cnt;
uint8_t rc, colcnt=0, collumns=4;
struct I2C_devices {
uint8_t I2C_adr;
char* deviceID;
char* type;
} I2Cdevice[]={{0x36,"AS5600","Magn Rotary"},{0x27, "PCF8574","GPIO(diplay)"},{0x3C,"DS1306","OLED-Disp"}, {0x68,"DS3231","RTC"}, 0x57, "AT24C32", "2KB Mem" };
switch (mode){
case 2 : {
printf("I2C Scanner\n");
for(cnt= 1; cnt <= 14*collumns+5; cnt++) printf("%s","=");
printf("\n ");
for(colcnt=0;colcnt<collumns;colcnt++) printf("%6s%02u%6s","",colcnt,"|");
for(I2C_adr = 0; I2C_adr <= 127; I2C_adr++) {
Wire.beginTransmission(I2C_adr);
rc = Wire.endTransmission();
if ( ((I2C_adr)%collumns)==0) printf("\n %03u\t", I2C_adr);
if (rc) printf("0x%02X = %s | ", I2C_adr, " - ");
else printf("0x%02X = %s | ", I2C_adr, "Fnd");
}
printf("#1#\n");
for(cnt= 1; cnt <= 14*collumns+5; cnt++) printf("%s","=");
printf("\n#2#\n");
} break;
这是输出