代碼思路是:
//station //Esp8266_Station_mode_init(); wifi_set_opmode(STATION_MODE); //Station_mode //定時器任務創建 Esp8266_Timer1_init(1000,1); //1000ms, 1:重復定時
/** timer1 init **/ ICACHE_FLASH_ATTR void Esp8266_Timer1_init(u32 mstime, u8 mode) { os_timer_disarm(&K_Timer01); //先關閉定時器 os_timer_setfn(&K_Timer01,(os_timer_func_t *)K_Timer01_cb,NULL); os_timer_arm(&K_Timer01, mstime, mode); }
/* Timer1回調函數 */ ICACHE_FLASH_ATTR void K_Timer01_cb(void) { u8 K_WIFI_STA_Connect; //表示wifi當前的連接狀態 struct ip_info ap_ip_info; u8 ESP8266_IP[4]; u8 K_LED_Flash = 0; K_WIFI_STA_Connect = wifi_station_get_connect_status(); if(K_WIFI_STA_Connect == STATION_GOT_IP) //如果已經連接wifi { wifi_get_ip_info(STATION_IF,&ap_ip_info); ESP8266_IP[0] = ap_ip_info.ip.addr; ESP8266_IP[1] = ap_ip_info.ip.addr>>8; ESP8266_IP[2] = ap_ip_info.ip.addr>>16; ESP8266_IP[3] = ap_ip_info.ip.addr>>24; os_printf("ESP8266_IP:%d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]); //OLED_SHOW for(;K_LED_Flash <=5; K_LED_Flash++) { GPIO_OUTPUT_SET(GPIO_ID_PIN(4),(K_LED_Flash%2)); delay_ms(100); } os_printf(" ESP8266 Connect Wifi success! \n"); os_timer_disarm(&K_Timer01);//關閉定時器, ESP8266_SNTP_Init(); //連接服務器 } else if(K_WIFI_STA_Connect == STATION_NO_AP_FOUND || //如果未能連接wifi,進入智能配網模式 K_WIFI_STA_Connect == STATION_WRONG_PASSWORD || K_WIFI_STA_Connect == STATION_CONNECT_FAIL ) { os_timer_disarm(&K_Timer01);//關閉定時器, 進入配網模式 //wifi_set_opmode(STATION_MODE); smartconfig_set_type(SC_TYPE_AIRKISS); smartconfig_start(ESP8266_Smartconfig_Cb); } else os_printf("uknow error\n"); //ESP8266_NetConnect_Init(); //TCP }
8266上電后進入配網模式.
1.先設置成station模式
2.然后進入1秒重復定時器
3.在定時器的回調函數中定義:
如果flash中保存的wifi 可以連接就自動連接
如果無法連接就進入配網模式.
那么問題來了,在家里測試的時候,很正常,但是在公司測試的時候,
8266的狀態都不是 STATION_NO_AP_FOUND, STATION_NO_AP_FOUND, STATION_CONNECT_FAIL
而是IDLE模式. 百度無果.
后來仔細想了想,好像並沒有看到掃描wifi結束的提示

於是我有了一個大膽的猜測
1秒定時器,1秒定時器,如果沒有進入配網模式,在一秒之后就會重新復位,那么 1秒真的就夠了嗎?
若然,把1秒定時改成3秒(或更多)就不會出現這種情況了.
