用esp8266連接路由器時,要設置成station工作模式,然後配置好熱點名字 和密碼就可以連接了。
那我們首先 講一下8266的工作模式。
1、esp8266的工作模式
首先,我們 去樂鑫官網下載SDK編程手冊,如下
《2C-ESP8266__SDK__Programming Guide__CN_v1.2.0.pdf》
打開SDK編程手冊,如下圖,找到wifi_get_opmode函數
void ICACHE_FLASH_ATTR user_init() { uint8 opmode; uart_init(115200,115200); ||模式查看函數 opmode = wifi_get_opmode(); ||列印當前的模式 os_printf("\r\n當前模式為:%d\r\n", opmode); }2、ICACHE_FLASH_ATTR宏定義
細心的同學已經注意到了,上面的程序 用了一個宏ICACHE_FLASH_ATTR 來修飾user_init() 函數,那這個宏到底有什麼用呢?
由於空間有限,我們無法將所有代碼都一次性加載到IRAM中運行,因此大部分函數放在IROM中,運行時再加載到IRAM中。
(1)對於ESP8266_NONOS_SDK,
加了「ICACHE_FLASH_ATTR」宏的函數,將存放在IROM中,CPU僅在調用到它們的時候,將它們讀到緩存中運行;
沒有加「ICACHE_FLASH_ATTR」宏的函數,將在一開始上電運行時,就加載到IRAM中運行;
注意,不要在中斷函數中調用帶有ICACHE_FLASH_ATTR函數,因為它可能與快閃記憶體R / W操作衝突。
(2)對於ESP8266_RTOS_SDK
函數默認都存放在IROM中,所以無需再添加「ICACHE_FLASH_ATTR」宏。
中斷處理函數也是可以定義在IROM中。
如果需要將一些頻繁調用的函數定義在IRAM中,在函數前添加「IRAM_ATTR」宏就可以。
我現在使用的是ESP8266_RTOS_SDK,所以加和不加這個宏都可以。
3、掃描WIFI
esp8266設置為station模式,並在初始化完成後調用WiFi掃描函數。程序如下:
void ICACHE_FLASH_ATTR scan_done(void *arg, STATUS status){ uint8 ssid[33];
if (status == OK) { struct bss_info *bss_link = (struct bss_info *) arg; bss_link = bss_link->next.stqe_next; while (bss_link != NULL) { os_memset(ssid, 0, 33); if (os_strlen(bss_link->ssid) <= 32) { os_memcpy(ssid, bss_link->ssid, os_strlen(bss_link->ssid)); } else { os_memcpy(ssid, bss_link->ssid, 32); } ||輸出AP的信息 os_printf("+CWLAP:(%d,\"%s\",%d,\""MACSTR"\",%d)\r\n", bss_link->authmode, ssid, bss_link->rssi, MAC2STR(bss_link->bssid), bss_link->channel); bss_link = bss_link->next.stqe_next; } } }
void ICACHE_FLASH_ATTR scan_wifi(void) { ||獲取 AP 的信息 wifi_station_scan(NULL, scan_done);}
void user_init() { uint8 opmode; uart_init(115200,115200); opmode = wifi_get_opmode(); os_printf("\r\n當前模式為:%d\r\n", opmode); ||設置模式為station模式 wifi_set_opmode (0x01); opmode = wifi_get_opmode(); os_printf("\r\n當前模式為:%d\r\n", opmode); ||初始化完成後註冊回調函數scan_wifi system_init_done_cb(scan_wifi); }編譯、下載後, 串口1輸出的信息如下圖:
+CWLAP:(4,"TP-LINK_501",-68,"dc:fe:18:05:da:da",6)
第一個4表示加密類型,
"TP-LINK_501"為WiFi熱點名字,
-68為信號強度,
"dc:fe:18:05:da:da"為mac地址,
最後一個6為信道號。
4、連接路由與定時器的用法
設置 WiFi密碼,用esp8266連接路由,使用定時器查看是否連接成功,超時返回連接失敗。
定時器使用的函數如下:
||定義一個定時器變量ETSTimer connect_timer;||設置定時器回調函數os_timer_setfn(&connect_timer, Wifi_conned, NULL); ||使能定時器os_timer_arm(&connect_timer, 2000, NULL); ||關閉定時器, os_timer_disarm(&connect_timer);路由器wifi連接程序如下
||定義結構體stationConfstruct station_config stationConf; ||連接的路由器 os_memcpy(&stationConf.ssid, "TP-LINK", 32); ||密碼os_memcpy(&stationConf.password, "123******", 64); ||wifi來連接的接口配置。sdk有例子 wifi_station_set_config(&stationConf); ||wifi連接函數 wifi_station_connect(); ||定時器回調函數os_timer_setfn(&connect_timer, Wifi_conned, NULL); ||定時器2s掃描一次 os_timer_arm(&connect_timer, 2000, NULL);定時器回調函數為:
void ICACHE_FLASH_ATTR Wifi_conned(void *arg){ static uint8 count = 0; uint8 status; ||關閉定時器connect_timer os_timer_disarm(&connect_timer); count++; ||查詢連接的狀態函數輸出 status = wifi_station_get_connect_status(); ||判斷連接狀態 if (status == STATION_GOT_IP) { ||輸出連接成功 os_printf("Wifi connect success!"); return; } else { ||判斷連接次數 if (count >= 7){ ||輸出連接失敗 os_printf("Wifi connect fail!"); return; } } ||使能定時器connect_timer os_timer_arm(&connect_timer, 2000, NULL);}程序下載後,連接路由成功後列印的信息如下圖:
好了,今天就講這麼多,明天繼續。
原創不易,如果你喜歡我的公眾號、覺得我 文章對你有所啟發,
請務必「點讚、收藏、轉發」,這對我很重要,謝謝!
歡迎訂閱 嵌入式小書蟲