前言
; U8 H- u# M" `* q1 p今天是学习百问网智能家居项目的第4天,本文我们将会介绍如何使用ESP8266进行连接WIFI
# Q' G9 N% h% n5 I8 F" L$ ~ W3 P
一、ESP8266和WIFI的连接3 s' F- B! x' h( ^) B
STM32通过串口和ESP8266进行通信,发送指定的AT指令即可实现联网。ESP8266可以单独进行联网也可以通过上面方式进行联网。
- E, ]( n% y- M* | s( f5 C, y7 j注意:ESP8266只能连接2.4GHZ的WIFI,很多人可能因为连接到的是5GHZ的WIFI导致ESP8266无法和WIFI进行连接。
: \* ]/ P- A D3 S5 T. c& |# W9 i' N" F: {; y
二、代码展示/ N k5 Q; S& j% k# P, ~$ t7 y+ ?
main.c
8 b# G4 w& x9 [+ J; C9 l4 o- o
; q" n5 _& z. y( D B3 U) d- USART3_StartRx();//开启串口3接收函数
3 d: k1 d$ p/ M - esp8266_Init();
复制代码 & I' W( r( K6 p3 |+ `/ z. T
串口代码
6 z. [) A4 ]+ N/ g& f: a% b% G4 r) {7 H
- static uint8_t rx_len;
* o0 X; n2 g/ l Q - static uint8_t rx_data;
4 S- j- \9 y Q8 E - static uint8_t usart_rx_buf[200];
9 g8 C7 c& L- Y! o - / S2 d9 @$ `5 x; ^7 E; W
- // 串口3启动接收3 Y8 x& s. l; M% o; K7 \( S' ?
- void USART3_StartRx(void), ?& }& l1 L+ u5 N. b
- {
: ?1 f, @! H$ S# x0 ~4 R. A) T - HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);* x/ f+ ^' J* r. m2 l
- }# u$ ?% g5 E( G: b0 N
" ]. I( r. [3 K/ c, D- S: q- // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收): y: Y4 i' B5 ]! l' ` s
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
; `0 D& R v( I: `+ ? - {
% S. q$ ]4 n: _4 J7 V) p. n9 L" X8 [ - usart_rx_buf[rx_len%200] = rx_data;
: K! z9 D- u5 W9 S V+ J - rx_len++;
, Z; r) [* @- }5 x; e3 @ - HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);
& ?4 g: F- q5 p! D( a# L5 w7 \' W - }
$ {; l* v; I3 i! Q6 t- s - 5 W/ C& V% I7 E }: T9 ~
- // 串口3接收的数据
8 o; u8 V3 a4 T7 h7 k - uint16_t USART3_Receive(uint8_t *pdata)
9 s- X: i) p% | K& J8 F - {3 h, z; e1 [5 L8 x5 s5 F& L
- memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);# k2 R( M0 e# O, T: n- ~' ^5 M; v
- return rx_len;/ \/ H* \9 P0 ~. @2 F
- }, p: ~9 J2 c" B4 d6 D
& f3 l' W5 q* }: ^8 b, [- // 串口3发送数据5 V$ U% B- U' ?! A
- void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)4 A$ N8 z) ?4 V5 J5 v3 Z6 ~3 H
- {: S6 i( I+ R( N
- HAL_UART_Transmit(&huart3, pData, Size, Timeout);2 S0 C+ Z: ~2 L7 f
- }
1 w- j% N( U$ q. B( w8 E - " L I0 @' O$ D" ]+ @( G0 T' b4 h
- // 清理串口3接收的数据
& p- \9 p( _8 \, c6 k1 q - void USART3_ClearBuf(void)
+ M' |: @& ~# [) s - {
; \) W: l0 M6 f, Y" ^ - rx_len = 0;
+ m: [; m# @' v1 _+ q$ x - memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0) z$ m7 d# K) i- i* w. I
- }
, G4 e/ L& q7 d* I( p
复制代码
, q" h# @/ T6 G! F2 h9 |3 d' }ESP8266.c
5 D1 ]$ r; Q: V; u* Z$ J) H
- U- u% P1 r( G4 p( h1 Z* b- ]- #include "esp8266.h"
6 B" v+ ]% h9 ?* l - #include "log.h"# X$ ]( }( H/ Q0 d* _' N* W# h9 j& F6 J2 F
- #include <string.h>8 G% {* Q1 R `3 Z# y( A9 z
3 i- b, r2 ~) J$ _8 Y- P
8 W9 K" `6 M" {7 X- 6 y: J" O4 B1 x, u$ }$ T% A
- u8 esp8266_sendcmd(char *cmd,char *reply,u16 timeout)
- B, {4 b& h9 [$ K$ r; W - {/ p4 X+ G4 T6 a @: @) d
- //保存传入的指令6 O9 ]7 k2 b) N( h4 [9 |1 r
- u8 buf[256]={0};
7 N5 n h# l7 H+ s. O6 S - strcat(buf,cmd);//将AT指令拼接到buf: h k0 k, t; Q2 P0 d8 F
4 O$ @; o& h5 n2 m) V# `- //处理AT指令
5 l- a! u# h# E, O; A/ _& l: m - if(0==strstr(buf,"\r\n"))//判断是否有换行符& G @2 Y. u. i6 k
- { V. ~& U) z- R( J
- strcat(buf,"\r\n");//加上换行符
8 q+ B2 {8 e, n0 I; u5 ?+ P - }
( h4 A7 K- \( @4 n U - 9 d+ k! T+ @1 I, e/ ]* g- I
- //清理前面接收的buf( v+ n# a3 p1 k& O0 |
- USART3_ClearBuf();( R- N. S$ D" ~: G& p
8 D. u; g$ O! ]; P! g5 C8 y- //发送数据* J M8 |" A& R& e" B# [0 U
- USART3_Transmit((u8*)buf,sizeof(buf),500);
! ?' [: G2 G% P+ Z' N! _6 c
z4 M0 a; K. @8 b7 x- //接收数据3 }1 P9 {& x: m/ o1 v
- memset(buf,0,256);
0 R+ m+ c. J; k" N9 ` - while(timeout!=0)
& J1 O# l+ N* P3 j- l - {0 }4 E+ f1 w1 k' y/ v0 h
- if(USART3_Receive((u8*)buf))
: a1 o9 L4 q: Q2 V; X - {9 H9 o k9 o% V" O! `" g0 R; I
- if(strstr(buf,reply))
3 a/ x- M3 E& }8 |& D2 H; U - {
! |9 g8 y! k; B - PRINTF("%s Send ok!\r\n", cmd); // 发送成功
! ^' \- {4 {: ~/ Y/ O - if (strstr(buf, "CIFSR"))8 f2 Z7 }' `+ c( f4 r } i! J
- {
# l6 A3 l* }% t! e8 N - PRINTF("%s\r\n", buf); // 打印IP地址' N1 p0 e1 d a, L, D
- }
Y1 v2 A3 R Q2 G/ o - return 0;9 I$ t. K1 Z2 y% ]
- }5 I2 `# F6 s# C3 |
- }
4 s+ @3 ?+ B0 V- @! M - else
7 `6 E M4 f. F% m9 i - {
+ }: x/ m6 {7 c4 v0 {7 o! f - timeout--;
% E/ x/ @- {1 Q* k# \ - HAL_Delay(1);
% O1 k/ h, b+ R O! a2 { - }
: J7 y4 w/ [5 Y- Q' n - ! I: M* r/ g; R4 X
- }; l: ?- F3 S x( ^) y4 e1 c
: y: O6 Y7 H$ m' t/ k6 w x) q; R7 J3 _- s
T2 E: A( M' V ?; d, |- PRINTF("%s send error\r\n",cmd);( j7 x0 u3 V# _9 P
- return 1;+ t8 N3 D3 ~# Y1 M s' b3 i0 r3 n
- }
# d$ R6 u+ Q3 ]" z) ?! O; V5 h
- f0 F8 K2 ^- H2 P! T! Q6 J( F- - P: }8 a% ^9 y6 z' _$ p
- void esp8266_Init(void): `) X9 `. c' \" K) Y$ t
- {2 r5 n3 r( ^3 j/ a/ E: O
- esp8266_sendcmd("AT+RST", "OK", 500);//重启模块
8 U, L1 S/ ? \ - HAL_Delay(1000);- l+ N) C7 d2 Y/ r. H* }
- esp8266_sendcmd("AT+CWMODE=1", "OK", 500);//模式设置
1 o$ C, \& }$ N/ Z( i: V% t& T - esp8266_sendcmd("AT+CWJAP="MERCURY_2446","740740740"", "OK", 5000);//连接路由 r- |& ^" K( u4 x0 o' u* z
- esp8266_sendcmd("AT+CIPMUX=1", "OK", 500);//设置多连接
8 T* h* ?# {( D8 |- }0 [ - esp8266_sendcmd("AT+CIPSERVER=1,9999", "OK", 500);//创建TCP服务. `; ?! g/ [+ d# o6 L4 O
- esp8266_sendcmd("AT+CIFSR", "OK", 500);//查询IP地址
6 J4 V+ J) V1 f% u. @( n/ ^* r8 h - }
& O6 w2 D7 E, H7 S9 ~3 Q - % X( d& d, ~! k& i- M4 W6 a( O
- void esp8266_Task(void)
; Q# v4 G- T; T: h9 w - {
- m% r2 ?! W: @3 K2 ~3 U# P) ` - - L$ i" ^8 R2 v( x. i) x
- }4 ?& ~: \) {2 }. }. K
- - }5 R: s/ z4 o; H/ z0 a
- void esp8266_Handle(void) W% ?( C( Q0 z
- {5 ^5 A( c9 h& c5 k! E7 U6 @& _
8 y+ x3 \2 y& F& Q- }
复制代码 ; ^$ Q1 I7 }7 |: ]0 [" M+ c
ESP8266.h
2 W% D# h5 J- Z3 d* I& {
. F% t! u# y6 [; z3 z. |# Y- #ifndef _ESP8266_H_
: G# H1 U* o/ p! S' e - #define _ESP8266_H_3 n4 X( _# |" L0 ]( N8 m0 Y* ^
- * ? k3 m% u- R: S: Z
- #include "main.h"
c+ [ N* j2 v$ L# j5 C* l$ f- e; _
0 [1 k! v$ G$ Z& v, |( B/ p- #define u8 unsigned char
/ F N# s( q, R- q8 P8 D; q$ O - #define u16 unsigned short
+ k* x) w. [& H - #define u32 unsigned int
' a( V/ S. L7 A- \
3 F" `: R* @" O! W1 B- #define WIFI_NAME "Dongsan201"/ T( T" Q# U3 [# J
- #define WIFI_PASSWORD "66666666"
; o2 `6 g. z& f) h0 x o
( D6 T8 S; d9 i) T0 I- u8 esp8266_sendcmd(char *cmd,char *reply,u16 time);//向esp8266发送AT指令
6 b* i, v, h) R6 c, l - & u" i, c6 H) G) F+ c: K% S
- void esp8266_Init(void);//初始化调用
6 F7 }# F/ A: e2 R - void esp8266_Task(void);//后台轮询调用- V' Q2 w, g$ _4 k9 O7 c
- void esp8266_Handle(void);//中断调用
# B" v' q$ L% c/ a; F - * ]" b6 T, V5 Z
$ C+ g3 p9 s6 c2 R6 i- 8 |6 {7 B7 d+ H1 P; k; Y6 b
- $ Y" Q/ z% n [& K
- #endif
7 c" `5 B" ~) ~) H- {; h' d7 i+ Z
复制代码
8 n* b% {! Z# Amain.c
4 h0 N7 ]2 z6 n3 W u* ?% ~4 I. ]; U7 E' P+ Q1 y1 g2 s$ F. N4 _
9 G! o/ W8 q# k' V% B
总结3 B+ s0 N; p9 w1 p* X8 S( ^' S2 p
感谢百问网让我了解到了如何使用ESP8266进行联网。
- `$ z: N. [, K3 U( P8 }. [; h4 V0 @4 ?
) l; T; v* E* S( k
|