前言
% C) O/ R2 F: g/ _今天是学习百问网智能家居项目的第4天,本文我们将会介绍如何使用ESP8266进行连接WIFI- U6 n: n8 R/ i3 P
a/ |5 M2 y* r$ s: ]' K一、ESP8266和WIFI的连接2 t0 f& _+ r+ i8 ]1 @
STM32通过串口和ESP8266进行通信,发送指定的AT指令即可实现联网。ESP8266可以单独进行联网也可以通过上面方式进行联网。
+ s, T( [/ T/ x3 h) E注意:ESP8266只能连接2.4GHZ的WIFI,很多人可能因为连接到的是5GHZ的WIFI导致ESP8266无法和WIFI进行连接。
7 S% j# w" K% g% B" X/ g, I& p9 b$ \
+ ~7 D Y( x3 d% j: L3 k5 @二、代码展示
- o7 Z% N3 r# Emain.c3 B+ K% p, q% _" Y( c s
- S8 i1 E2 C* M- USART3_StartRx();//开启串口3接收函数
3 Y% z! f2 l) @) K# q: V - esp8266_Init();
复制代码
" Q! B; D- K/ m- A串口代码$ q c; q$ _) f% T. q0 ?
- g8 {2 ^' T# W* p7 J1 ], }
- static uint8_t rx_len;) z) w0 o/ G& k" Q9 v2 k
- static uint8_t rx_data;! A, b) ?9 g* ~( ^+ w9 @" K
- static uint8_t usart_rx_buf[200];
g' }/ h8 e. }& d4 R - 5 K2 d4 }. |$ H( J( J$ k
- // 串口3启动接收
2 d- m! u+ E# l" G/ C: y - void USART3_StartRx(void)
9 V* E% v' u# p( ~# B - {
& n- u2 Y/ z5 R/ t4 h - HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);. C4 E1 |, R4 @% f
- }
2 @" e/ E" V( g: e
/ v# B+ O2 @8 K2 R- // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收)
" g% [% p, ?. q# j/ c, w - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)8 J6 K- P/ X' m7 l n
- {
. I! G7 i* T! @& @5 m* }0 ` - usart_rx_buf[rx_len%200] = rx_data;' @/ L! u# i( ]" R9 ?/ [" k* j0 {) q
- rx_len++;4 Z5 h& ~3 C3 w8 j7 T
- HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);& T# J& M: n* B7 i. t
- }
* S+ o9 z2 P( B1 p+ ~+ h; q5 \ - + t# W+ s1 o% s* p# m
- // 串口3接收的数据
" U; ^. R" k( W8 ?) z* l( f - uint16_t USART3_Receive(uint8_t *pdata)+ n. V$ g+ r* m. l" C
- {/ r& p3 v- T. j+ R& B
- memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);
3 W# _$ W" N; ^3 ]+ s. H1 D! C - return rx_len;
" G8 O+ u2 W4 O0 ^1 P - }9 ?4 I' p J% z! u
# \4 M3 z& `# u" z' y# t- // 串口3发送数据
8 k; N! m4 p! p) D8 V! z4 h; P - void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)& o e; Z- l1 N6 p( k5 L
- {
5 f; Q, _5 j7 X" `% @ - HAL_UART_Transmit(&huart3, pData, Size, Timeout);4 O$ p* }- E3 f V$ B9 `9 u' n
- }
6 u" T- q& |% T' i! n
2 u! k$ c' F$ |2 ^& A- // 清理串口3接收的数据
/ K9 N Q0 Z ]( v - void USART3_ClearBuf(void)
8 Q/ X; X9 Q; O4 f+ |- ]- O - {9 ^! |4 ~* o+ F+ {
- rx_len = 0;
4 K( j. J8 n a! y - memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0
' q- M, t$ J' K9 N/ a - }9 t# M* \4 u& o- G: E1 P: M0 J
复制代码
3 _9 m7 D- X' x& Q I5 p3 L# M) gESP8266.c# q2 Q0 ^, V( f* P/ T
% n# N! u" q" u; O3 l* A& d6 l5 t- `- #include "esp8266.h"
' T3 ]% ~; ^) x1 K - #include "log.h"5 r2 X$ e+ k6 |0 ~! C9 }9 a+ Y
- #include <string.h>
3 z5 @8 e, T( ^* A R - * @. r z3 K# I6 F- g: I& }+ B# e
- / [$ p' Q! _( Z s
7 j9 U7 G, ~6 D" |5 L K- u8 esp8266_sendcmd(char *cmd,char *reply,u16 timeout)
8 H; S; R2 M' K- A9 J' V - {; w: O" K8 w2 r, R& s# F
- //保存传入的指令$ C) D% S8 r4 l+ W$ B8 O9 q
- u8 buf[256]={0};1 V/ k( @0 _ ^" x' w- H
- strcat(buf,cmd);//将AT指令拼接到buf
) k! G( _& C" r- @
& u, v5 H% `& `6 @- //处理AT指令: V. e9 @* R% \6 }4 R. C9 r
- if(0==strstr(buf,"\r\n"))//判断是否有换行符$ c1 d: c8 e% d1 K' D8 l
- {
. J; n8 G- f: [7 p' a! j - strcat(buf,"\r\n");//加上换行符* c5 [ \- G* `. s% e2 k
- }# R7 ^ ?$ ?. u0 I5 e; F- e
- - D* h/ O d3 B
- //清理前面接收的buf
$ H! O# p7 D# ? m; W j - USART3_ClearBuf();
; e' V' ~/ E9 P8 U L- r l - 1 ]2 b( ~2 O, P' x' O: \
- //发送数据4 I8 m4 n' ]& T0 U2 h3 I8 y/ E
- USART3_Transmit((u8*)buf,sizeof(buf),500);0 z2 o5 d2 Y7 d6 r0 J
- - K7 ~( \, y) \ E# y7 L
- //接收数据, q& P" n% h8 {5 Y7 a! G
- memset(buf,0,256);4 u' b. |! a3 L G4 E: _
- while(timeout!=0)
; L* X/ k+ M4 t8 u: ^( W0 E1 J7 w8 O* l - {' \1 N/ ~; }9 i0 v/ v3 P9 ~, G
- if(USART3_Receive((u8*)buf)), [! }% a/ R }9 @4 j. e7 @
- {
( S a7 z/ N2 L$ t7 E+ R - if(strstr(buf,reply))4 m; c2 k4 j; h+ @: R2 a
- {3 m# K8 U& Z) Y9 B7 Z/ Q% w: U. ]
- PRINTF("%s Send ok!\r\n", cmd); // 发送成功
" r2 _+ L" ]$ ^; O - if (strstr(buf, "CIFSR"))
9 {; I$ U( U9 J& s0 R, X0 g - {
2 F7 v0 D1 z# Z - PRINTF("%s\r\n", buf); // 打印IP地址
6 n6 E. G) J/ s9 `5 O8 t5 n - }
1 s+ Y$ N P" O& d( ?) r - return 0;
: V. A, i4 F w; g) x( r+ O - }& a& ^' J/ l, y# X& ]% p, b
- }
- |( w$ w" [ c. @) U - else
9 Y. D8 M& X4 A- j0 L - {
2 u# R& ]7 S) H" L: m - timeout--;& I3 i) ]7 @6 A7 j+ m2 f
- HAL_Delay(1);
G2 B) ~2 ?- D: N7 g6 a' W - }
3 k1 a2 ]0 N" C8 u1 V/ h" I - ) [: p! _" _- e& J2 _( `) v1 L/ @
- }! W( v* a7 N" I& y& S+ M
- , c' {4 _5 g. Y1 M
- 3 P0 g5 X) D ~
- PRINTF("%s send error\r\n",cmd);. F3 o* w- X1 C5 S
- return 1;
: |) C) B9 E; g: w - }* `' h# `. S% |
& ]$ P) p# ~* e6 y0 o- 3 f: t( y2 s% d( `# J: A9 M, D
- void esp8266_Init(void)
" P2 g/ ?1 H! ~ E: F. D1 P# _ - {
Y) H6 u* S! Y9 x2 Q# P - esp8266_sendcmd("AT+RST", "OK", 500);//重启模块6 S$ P+ S" z- Q( r" k
- HAL_Delay(1000);, H! K0 V" E4 H. {5 N* p
- esp8266_sendcmd("AT+CWMODE=1", "OK", 500);//模式设置 ~# O" Y; O% W) y' o
- esp8266_sendcmd("AT+CWJAP="MERCURY_2446","740740740"", "OK", 5000);//连接路由' U! ~/ v6 D7 ^
- esp8266_sendcmd("AT+CIPMUX=1", "OK", 500);//设置多连接
% V4 j" w. `7 _, [ - esp8266_sendcmd("AT+CIPSERVER=1,9999", "OK", 500);//创建TCP服务
* R9 \, X* ]0 ?4 N) p - esp8266_sendcmd("AT+CIFSR", "OK", 500);//查询IP地址
- a' @1 n0 a) g8 n | - }4 @. U: j% x% H
- : j8 i5 o9 b2 ?( I* }7 `
- void esp8266_Task(void); ?3 M! C! }) W* A" {5 Q4 e
- {3 `2 S5 b( [0 K9 J: @
- " N5 T3 a1 ]( l/ g) |
- }
( F5 ^7 f% y- K2 B0 e' v - & \4 d1 L% A1 f1 v
- void esp8266_Handle(void)' K8 b( P+ g+ k
- {
; \# t, f3 _5 ?9 v! X7 ~# o( f- z - 3 i$ `- S9 s6 g! _9 u& u C
- }
复制代码
' }) O! |2 D: W, F7 z7 ^7 I3 Z3 z. bESP8266.h& b1 b: f/ x1 q) k5 P M% A2 o
0 Q4 w, w1 [: u3 Y' ^7 f- #ifndef _ESP8266_H_ `- e4 d+ x; J) W/ H% Y+ D
- #define _ESP8266_H_) Y1 l! X- K5 a- ~
2 I( v: f! f# i# [- #include "main.h"
, l# I* [2 l9 M1 _7 d4 G& N; _% O# R. n
0 Y: m# M$ T a1 t8 r% S, Y4 u5 Q- #define u8 unsigned char
* Y: S& L, _' X: F# g! B# Y3 U - #define u16 unsigned short Z& r/ y( ]% h* h `
- #define u32 unsigned int( ]; {; @$ d" t V
- : R( ~/ ~$ b: L3 [! C; f
- #define WIFI_NAME "Dongsan201"
1 z1 x1 J& J" G3 R) ]5 ]( [ - #define WIFI_PASSWORD "66666666"
, A' v* T. m; c3 o+ m6 A+ J
; W% ^$ c4 ]" u3 F6 o- u8 esp8266_sendcmd(char *cmd,char *reply,u16 time);//向esp8266发送AT指令
* r+ ]9 U+ G+ N: F% N" K* `8 d/ x - 4 A+ @% v3 x' l8 Y
- void esp8266_Init(void);//初始化调用* ^5 x4 j4 T6 X* O( ~. ` }
- void esp8266_Task(void);//后台轮询调用
" o* ]( l" I' b - void esp8266_Handle(void);//中断调用4 v" R& m: P/ g5 H8 J2 B
- ! F- D3 |: Q# |! k
- . H: H5 h. [0 N' n2 |1 c; |; f
* M$ j/ I1 X1 J0 P7 J* [7 u0 q4 H- " D0 i5 G" u( [, ~( Y
- #endif
复制代码
* e5 J& p: ]2 Z5 X) }1 Y5 hmain.c) Y9 k5 H8 \! u1 M
2 M8 x! r* M: ]. M4 J3 q
+ S! ~7 r4 k. P9 {3 g5 h4 Z9 l% m- h K4 H
2 M$ |4 a: B, S0 R2 h& T: C
1 e* }! p0 q$ I P& \7 O, L |