你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32智能家居7天小项目 ESP8266和STM32的通信简单介绍

[复制链接]
STMCU小助手 发布时间:2022-5-20 18:14
前言
% 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
  1.   USART3_StartRx();//开启串口3接收函数
    3 Y% z! f2 l) @) K# q: V
  2.   esp8266_Init();
复制代码

" Q! B; D- K/ m- A串口代码$ q  c; q$ _) f% T. q0 ?
- g8 {2 ^' T# W* p7 J1 ], }
  1. static uint8_t rx_len;) z) w0 o/ G& k" Q9 v2 k
  2. static uint8_t rx_data;! A, b) ?9 g* ~( ^+ w9 @" K
  3. static uint8_t usart_rx_buf[200];
      g' }/ h8 e. }& d4 R
  4. 5 K2 d4 }. |$ H( J( J$ k
  5. // 串口3启动接收
    2 d- m! u+ E# l" G/ C: y
  6. void USART3_StartRx(void)
    9 V* E% v' u# p( ~# B
  7. {
    & n- u2 Y/ z5 R/ t4 h
  8.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);. C4 E1 |, R4 @% f
  9. }
    2 @" e/ E" V( g: e

  10. / v# B+ O2 @8 K2 R
  11. // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收)
    " g% [% p, ?. q# j/ c, w
  12. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)8 J6 K- P/ X' m7 l  n
  13. {
    . I! G7 i* T! @& @5 m* }0 `
  14.         usart_rx_buf[rx_len%200] = rx_data;' @/ L! u# i( ]" R9 ?/ [" k* j0 {) q
  15.         rx_len++;4 Z5 h& ~3 C3 w8 j7 T
  16.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);& T# J& M: n* B7 i. t
  17. }
    * S+ o9 z2 P( B1 p+ ~+ h; q5 \
  18. + t# W+ s1 o% s* p# m
  19. // 串口3接收的数据
    " U; ^. R" k( W8 ?) z* l( f
  20. uint16_t USART3_Receive(uint8_t *pdata)+ n. V$ g+ r* m. l" C
  21. {/ r& p3 v- T. j+ R& B
  22.         memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);
    3 W# _$ W" N; ^3 ]+ s. H1 D! C
  23.         return rx_len;
    " G8 O+ u2 W4 O0 ^1 P
  24. }9 ?4 I' p  J% z! u

  25. # \4 M3 z& `# u" z' y# t
  26. // 串口3发送数据
    8 k; N! m4 p! p) D8 V! z4 h; P
  27. void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)& o  e; Z- l1 N6 p( k5 L
  28. {
    5 f; Q, _5 j7 X" `% @
  29.         HAL_UART_Transmit(&huart3, pData, Size, Timeout);4 O$ p* }- E3 f  V$ B9 `9 u' n
  30. }
    6 u" T- q& |% T' i! n

  31. 2 u! k$ c' F$ |2 ^& A
  32. // 清理串口3接收的数据
    / K9 N  Q0 Z  ]( v
  33. void USART3_ClearBuf(void)
    8 Q/ X; X9 Q; O4 f+ |- ]- O
  34. {9 ^! |4 ~* o+ F+ {
  35.         rx_len = 0;
    4 K( j. J8 n  a! y
  36.         memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0
    ' q- M, t$ J' K9 N/ a
  37. }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- `
  1. #include "esp8266.h"
    ' T3 ]% ~; ^) x1 K
  2. #include "log.h"5 r2 X$ e+ k6 |0 ~! C9 }9 a+ Y
  3. #include <string.h>
    3 z5 @8 e, T( ^* A  R
  4. * @. r  z3 K# I6 F- g: I& }+ B# e
  5. / [$ p' Q! _( Z  s

  6. 7 j9 U7 G, ~6 D" |5 L  K
  7. u8 esp8266_sendcmd(char *cmd,char *reply,u16 timeout)
    8 H; S; R2 M' K- A9 J' V
  8. {; w: O" K8 w2 r, R& s# F
  9.   //保存传入的指令$ C) D% S8 r4 l+ W$ B8 O9 q
  10.   u8 buf[256]={0};1 V/ k( @0 _  ^" x' w- H
  11.   strcat(buf,cmd);//将AT指令拼接到buf
    ) k! G( _& C" r- @

  12. & u, v5 H% `& `6 @
  13.   //处理AT指令: V. e9 @* R% \6 }4 R. C9 r
  14.   if(0==strstr(buf,"\r\n"))//判断是否有换行符$ c1 d: c8 e% d1 K' D8 l
  15.   {
    . J; n8 G- f: [7 p' a! j
  16.     strcat(buf,"\r\n");//加上换行符* c5 [  \- G* `. s% e2 k
  17.   }# R7 ^  ?$ ?. u0 I5 e; F- e
  18. - D* h/ O  d3 B
  19.   //清理前面接收的buf
    $ H! O# p7 D# ?  m; W  j
  20.   USART3_ClearBuf();
    ; e' V' ~/ E9 P8 U  L- r  l
  21. 1 ]2 b( ~2 O, P' x' O: \
  22.   //发送数据4 I8 m4 n' ]& T0 U2 h3 I8 y/ E
  23.   USART3_Transmit((u8*)buf,sizeof(buf),500);0 z2 o5 d2 Y7 d6 r0 J
  24. - K7 ~( \, y) \  E# y7 L
  25.   //接收数据, q& P" n% h8 {5 Y7 a! G
  26.   memset(buf,0,256);4 u' b. |! a3 L  G4 E: _
  27.   while(timeout!=0)
    ; L* X/ k+ M4 t8 u: ^( W0 E1 J7 w8 O* l
  28.   {' \1 N/ ~; }9 i0 v/ v3 P9 ~, G
  29.     if(USART3_Receive((u8*)buf)), [! }% a/ R  }9 @4 j. e7 @
  30.     {
    ( S  a7 z/ N2 L$ t7 E+ R
  31.       if(strstr(buf,reply))4 m; c2 k4 j; h+ @: R2 a
  32.       {3 m# K8 U& Z) Y9 B7 Z/ Q% w: U. ]
  33.         PRINTF("%s Send ok!\r\n", cmd); // 发送成功
    " r2 _+ L" ]$ ^; O
  34.         if (strstr(buf, "CIFSR"))
    9 {; I$ U( U9 J& s0 R, X0 g
  35.         {
    2 F7 v0 D1 z# Z
  36.                   PRINTF("%s\r\n", buf); // 打印IP地址
    6 n6 E. G) J/ s9 `5 O8 t5 n
  37.         }
    1 s+ Y$ N  P" O& d( ?) r
  38.         return 0;
    : V. A, i4 F  w; g) x( r+ O
  39.       }& a& ^' J/ l, y# X& ]% p, b
  40.     }
    - |( w$ w" [  c. @) U
  41.     else
    9 Y. D8 M& X4 A- j0 L
  42.     {
    2 u# R& ]7 S) H" L: m
  43.       timeout--;& I3 i) ]7 @6 A7 j+ m2 f
  44.       HAL_Delay(1);
      G2 B) ~2 ?- D: N7 g6 a' W
  45.     }
    3 k1 a2 ]0 N" C8 u1 V/ h" I
  46. ) [: p! _" _- e& J2 _( `) v1 L/ @
  47.   }! W( v* a7 N" I& y& S+ M
  48. , c' {4 _5 g. Y1 M
  49. 3 P0 g5 X) D  ~
  50.   PRINTF("%s send error\r\n",cmd);. F3 o* w- X1 C5 S
  51.   return 1;
    : |) C) B9 E; g: w
  52. }* `' h# `. S% |

  53. & ]$ P) p# ~* e6 y0 o
  54. 3 f: t( y2 s% d( `# J: A9 M, D
  55. void esp8266_Init(void)
    " P2 g/ ?1 H! ~  E: F. D1 P# _
  56. {
      Y) H6 u* S! Y9 x2 Q# P
  57.   esp8266_sendcmd("AT+RST", "OK", 500);//重启模块6 S$ P+ S" z- Q( r" k
  58.   HAL_Delay(1000);, H! K0 V" E4 H. {5 N* p
  59.   esp8266_sendcmd("AT+CWMODE=1", "OK", 500);//模式设置  ~# O" Y; O% W) y' o
  60.   esp8266_sendcmd("AT+CWJAP="MERCURY_2446","740740740"", "OK", 5000);//连接路由' U! ~/ v6 D7 ^
  61.   esp8266_sendcmd("AT+CIPMUX=1", "OK", 500);//设置多连接
    % V4 j" w. `7 _, [
  62.   esp8266_sendcmd("AT+CIPSERVER=1,9999", "OK", 500);//创建TCP服务
    * R9 \, X* ]0 ?4 N) p
  63.   esp8266_sendcmd("AT+CIFSR", "OK", 500);//查询IP地址
    - a' @1 n0 a) g8 n  |
  64. }4 @. U: j% x% H
  65. : j8 i5 o9 b2 ?( I* }7 `
  66. void esp8266_Task(void); ?3 M! C! }) W* A" {5 Q4 e
  67. {3 `2 S5 b( [0 K9 J: @
  68. " N5 T3 a1 ]( l/ g) |
  69. }
    ( F5 ^7 f% y- K2 B0 e' v
  70. & \4 d1 L% A1 f1 v
  71. void esp8266_Handle(void)' K8 b( P+ g+ k
  72. {
    ; \# t, f3 _5 ?9 v! X7 ~# o( f- z
  73. 3 i$ `- S9 s6 g! _9 u& u  C
  74. }
复制代码

' }) 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
  1. #ifndef _ESP8266_H_  `- e4 d+ x; J) W/ H% Y+ D
  2. #define _ESP8266_H_) Y1 l! X- K5 a- ~

  3. 2 I( v: f! f# i# [
  4. #include "main.h"
    , l# I* [2 l9 M1 _7 d4 G& N; _% O# R. n

  5. 0 Y: m# M$ T  a1 t8 r% S, Y4 u5 Q
  6. #define u8 unsigned char
    * Y: S& L, _' X: F# g! B# Y3 U
  7. #define u16 unsigned short  Z& r/ y( ]% h* h  `
  8. #define u32 unsigned int( ]; {; @$ d" t  V
  9. : R( ~/ ~$ b: L3 [! C; f
  10. #define WIFI_NAME   "Dongsan201"
    1 z1 x1 J& J" G3 R) ]5 ]( [
  11. #define WIFI_PASSWORD   "66666666"
    , A' v* T. m; c3 o+ m6 A+ J

  12. ; W% ^$ c4 ]" u3 F6 o
  13. u8 esp8266_sendcmd(char *cmd,char *reply,u16 time);//向esp8266发送AT指令
    * r+ ]9 U+ G+ N: F% N" K* `8 d/ x
  14. 4 A+ @% v3 x' l8 Y
  15. void esp8266_Init(void);//初始化调用* ^5 x4 j4 T6 X* O( ~. `  }
  16. void esp8266_Task(void);//后台轮询调用
    " o* ]( l" I' b
  17. void esp8266_Handle(void);//中断调用4 v" R& m: P/ g5 H8 J2 B
  18. ! F- D3 |: Q# |! k
  19. . H: H5 h. [0 N' n2 |1 c; |; f

  20. * M$ j/ I1 X1 J0 P7 J* [7 u0 q4 H
  21. " D0 i5 G" u( [, ~( Y
  22. #endif
复制代码

* e5 J& p: ]2 Z5 X) }1 Y5 hmain.c) Y9 k5 H8 \! u1 M

2 M8 x! r* M: ]. M4 J3 q
  1. esp8266_Init();
复制代码

+ 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
赞 收藏 评论0 发布时间:2022-5-20 18:14

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版