stm32 esp8266驅動程式

2021-08-28 06:59:10 字數 4524 閱讀 2873

esp8266模組是串列埠通訊,通訊的協議是at指令,要正確的配置對應的at指令模組才可以工作,這裡就需要知道at指令有沒有配置成功,這個比較容易實現,一般傳送at指令配置成功的話,晶元都會返回至少乙個ok,當然還有其它資料,我們只需要去解析有沒有接收到ok就知道指令傳送是否成功了。我這裡是作為tcp客服端,所以只需要以下一些指令即可:

1>>	傳送		at\r\n			返回 	"ok"

以上操作確保晶元連線正常,工作正常

2>> 傳送 ate0\r\n 返回 "ok"

關閉回顯

3>> 傳送 at+cwmode=1\r\n 返回 "ok"

設定成客服端模式

4>> 傳送 at+cipstatus 返回 "2 3 4 5" 2 3為連線

確保連線到路由器

5>> 傳送 at+cwjap="hes_wifi","wifi_pass" 返回 "ok"

返回 "fail"

連線到路由器

6>> 傳送 at+cwautoconn=1 返回 "ok"

開機自動連線

7>> 傳送 at+cipstart="tcp","192.168.0.105",8888 返回 "ok"

連線到伺服器

8>> 傳送 at+cipclose 返回 "ok"

關閉伺服器連線

8>> 傳送 at+cipmode=1 返回 "ok"

設定透傳模式1

9>> 傳送 at+cipsend 返回 ">"

進入透傳

10>> 傳送 +++ 返回 無

程式驅動也會按照這個流程來實現;

大概框架如下

esp8266wifi.c檔案主要是at指令配置

serial_config.c檔案主要用於解析返回的資料,例如ok,>等

uart.c是串列埠的應用協議

1-先看看esp8266wifi的內容

#define fanhui_v		"ok"		//普通指令返回值

extern u8 wifi_name[20]; //路由器名字

extern u8 wifi_pass[20]; //路由器密碼

extern u8 wifi_ip[32]; //伺服器ip

extern u8 wifi_port[6]; //伺服器端口

static u8 wifi_work_mode; //wifi模組的工作模式,1為配置模式,2為透傳模式

#define _wifi_tran_mode 2

#define _wifi_config_mode 1

/*模組初始化

1.測試at命令,保證晶元工作正常

2.關閉回顯

3.設定成客服端模式

4.連線到路由器

5.連線到伺服器

6.設定透傳模式1

7.開始透傳

8.關閉透傳

*/u8 esp8266_init(void);

//測試at指令,確保連線和晶元正常

u8 test_at(void);

//關閉回顯

u8 close_huixian(void);

//設定成客戶端

u8 set_client(void);

//判斷是否連線路由器

u8 is_connect_ap(void);

//連線到路由器

u8 connect_ap(void);

//設定自動連線路由器

u8 aotu_connect_ap(void);

//連線到伺服器

u8 connect_server(void);

//斷開伺服器

u8 disconnect_server(void);

//設定透傳模式

u8 set_mode1(void);

//開始透傳

u8 start_tran(void);

//關閉透傳

u8 close_tran(void);

//設定為透傳模式

void set_tran_mode(void);

//設定成配置模式

void set_config_mode(void);

//獲取工作模式

u8 get_work_mode(void);

//傳送命令和等待時間

u8 send_cmd_wait(u8 *str,u8 len,u32 d_ms);

#endif

這裡主要介紹一下//傳送命令和等待時間

u8 send_cmd_wait(u8 *str,u8 len,u32 d_ms);

這個函式比較重要,主要功能還是發生乙個at指令,等待nms後檢測是否收到ok,下面是實現

//傳送命令和等待時間

u8 send_cmd_wait(u8 *str,u8 len,u32 d_ms)

return 0;

}

關閉透傳也比較特殊,實現如下

//關閉透傳

u8 close_tran()

接下來是serial_config檔案這個檔案主要實現1-串列埠緩衝區新增資料(資料要在串列埠中斷新增),2-解析是否存在相應指令

#define mes_len 200

//command

#define ok (char*)"ok"

#define ap2 (char*)"2\r\n"

#define ap3 (char*)"3\r\n"

#define off (char*)"off"

#define on (char*)"on"

#define state (char*)"state"

//log switch

#define erial_config_log 0

static int num;

static char mes_buf[mes_len]; //串列埠佇列長度

//尋找子並移除子串

int find_str_del(char *mes,char *str);

//尋找命令

//引數:命令

//查詢到命令返回1,否則0

int find_quq_del(char *str);

//新增資料到佇列

void add_mes_buf(char ch);

#endif

uart.c應用協議是自己定義的,和模組沒有關係,其實以上2個檔案已經看正常的初始化esp8266了。

初始化函式:

u8 esp8266_init()

else

//關回顯

if(close_huixian())

else

//設定成客戶端

if(set_client())

else

//判斷是否連線到路由器 is_connect_ap

if(is_connect_ap())

else //如果沒有連線路由器,則去連線

else

} //連線到伺服器

if(connect_server())

else

else

}else

}//設定透傳模式1

if(set_mode1())

else

//開始透傳

if(start_tran())

else

return 1;

}

整體使用的過程。1,主函式必須初始化串列埠,esp8266_init()

2,while(1)裡面實現如下,

//任務2函式

void task2_func(void *param)

else

}//serial2_sned_buff((u8*)"hello world\r\n",13);

} task_delay(1); }

}

串列埠中斷實現如下:如果是配置模式,把資料放到命令解析的快取裡,如果是透傳模式,把資料放到應用協議的快取裡

void usart2_irqhandler(void)

else

} }

整體測試下來,效果還是很不錯的,一晚上通訊沒有宕機掉線。用的是tcp工具,沒有自己寫socket

stm32 esp8266上傳實時溫度到本地伺服器

在之前我們已經實現了esp8266和本地伺服器的互動,並將資料寫入到mysql資料庫中,但實際意義不大,我們需要實現將資料實時寫入,所以需要新增感測器模組,並以微控制器為主控處理資料,完成上傳。這一次配置esp8266不再使用串列埠助手,而是將命令寫到 中自動完成。我們使用兩個串列埠,串列埠一用來除...

STM32 ESP8266獲取網路時間和天氣

目錄 1 連網 2 獲取天氣和時間 3 對獲取到的資料進行解析 先給出兩個可以獲取天氣和時間的 可以獲取天氣 可以獲取時間 接下來簡單說說怎麼通過at指令的方式去獲取天氣及時間資訊 首先,esp8266肯定是需要連上網才能訪問這些資訊。所以,第一步要做的就是讓esp8266連線上wifi熱點,可以是...

STM32 ESP8266連線網路的幾種方法

上篇文章提到的 在程式中寫死 例如 void esp8266 init fixed wifi void define esp8266 wifi info at cwjap fast e162 12345678 r n define esp8266 tcp info at cipstart tcp w...