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

stm32f103c8t6控制ESP8266与手机APP通信

[复制链接]
STMCU小助手 发布时间:2022-10-16 19:49
之前已经发表过利用stm32控制蓝牙模块与手机APP通信的文章,那么现在我就来说说用WIFI模块来控制与手机APP的通信
8 j$ n, Y' O/ ^! N) q3 ~首先需要的器件如下:
1 c% v9 }3 U; U( f) d, w) i2 }stm32f103c8t6" O' z' T6 J! O. O
ESP8266-01S(默认波特率115200)1 ]1 Y; Z; z! K3 P- H" }
除此之外还需要手机下载一个通讯软件,我用的是安卓手机应用宝上面的TCP连接这个APP: t1 h7 y7 X5 m8 F. n) N
WIFI模块的连接如下所示:
" X* J* S3 c0 M9 M* ~8 Z; }# v$ E
% x/ S( L% }+ a2 t' Z9 I* t
20210104171226590.png
7 J( s. j- l; P, L# t2 i0 e

& w6 b* C3 @5 O& o4 o7 V. ~) K代码很简单,我主要附上主函数代码:
  1. /*
    " Q9 H& K. K/ b% d
  2. ESP8266 AP+Station服务器模式测试
    $ E( Y3 z- q; o/ f0 Y' w8 t

  3. 4 p! k8 ]* F8 f- c5 h+ G$ u
  4. UART2 PA2 PA3  与网络模块ESP进行通信: d; _- Z5 [( q7 h9 N$ j8 K
  5. # B) |+ q3 R; T8 M4 Q8 ^, Z
  6. UART1 PA9 PA10 进行数据跟踪
    4 l3 x1 q0 b9 }9 z
  7. */
    2 y) f4 M6 Y' z( M7 v

  8.   Q) E. c' B2 i; O* M( ?
  9. #include  "delay.h"
    - h& p# f( i  C  _' F* `
  10. #include  "led.h"9 O7 B6 C* G$ W. ?+ }8 y4 b6 A
  11. #include  "usart.h"
    % J& S$ o2 }+ D1 i8 ~( j
  12. #include  "string.h"
    2 Y% n' U9 G  o+ @
  13. #include  "stdio.h"
    ( V; ^! _: b8 H- k$ @
  14. extern  u8 RX_buffer[tbuf];
    * |/ o& l! _6 A; e8 D4 k, ?" K' u( V3 }
  15. extern u8 RX_num;                                 //接收计数变量8 X3 H" l- c, o
  16. 6 x- u  U, Z8 j. b$ b2 E5 j
  17. u8  esp_at[]="AT\r\n";                  // 握手连接指令,返回"OK"
    5 s, N% A6 o6 S- U: l- D% s
  18. u8  esp_cifsr[]="AT+CIFSR\r\n";         // 本机IP地址查询指令
    9 |% Q; M+ k) v5 v/ T+ M, q6 f  ?# I
  19. u8  esp_cipsend[]="AT+CIPSEND=6\r\n";   // 设置发送数据长度
    * u$ i. R, B7 w2 ^  @' {
  20. u8  esp_test[]="sunny\r\n";                           //  数据内容; c5 {- s5 l# u6 |. m5 Q
  21. u8  esp_rst[]="AT+RST\r\n";                                         // 软件复位$ a. P. Y3 ^  U/ f) e( j; f3 x+ S+ M

  22. 4 @6 y8 V% i0 T2 H$ q4 U
  23. u8  esp_cwmode[]="AT+CWMODE=3\r\n";     // 设置ESP8266的工作模式3 AP+Station,返回"OK"或者"no change"
    % K" I0 O, Z$ L( K/ b' q
  24. u8  esp_cwsap[]="AT+CWSAP="ESP8266_TEST","1234567890",1,3\r\n";//设置WIFI的名称及密码
    # V1 K7 @) \8 }. q! @- r7 {
  25. u8  esp_cipmux[]="AT+CIPMUX=1\r\n";                           //打开多连接        0 l1 c" l6 E9 x& u
  26. u8  esp_cipserver[]="AT+CIPSERVER=1,8080\r\n";  //建立TCP服务器,开放端口8080, s9 U# r  a' _% i9 u

  27. , ~, e  i  l2 L- I5 _( R) J- V9 |. O
  28. //指定字符串与缓存数组数据进行数据比较
    ( G/ M6 t8 P+ x5 {- V+ p
  29. //*p 要比较的指定字符串指针数据
    1 Y1 L7 |/ l; ~* b# I/ D
  30. //返回:1 数据一致  0 数据不一致
    : q  U" X0 N5 \5 q; A% @- x
  31. u8 Data_compare(u8 *p)
    / I* B7 O) |* \6 ^& j: [
  32. {
    6 `* g4 T, @2 I4 Z: W9 x
  33.         if(strstr(RX_buffer,p)!=NULL)
    5 N& R% V  a8 o" ]/ K- j2 C
  34.             return 1;
    1 o# X0 ]6 l7 x
  35.         else0 u. W* z3 \2 D$ z; [  A9 r, y/ m
  36.                 return 0;
    5 o& ?7 u$ Q$ z( G. Q: p
  37. }0 S- L& n0 `7 w  Y$ l0 W

  38. * s% e7 S- U7 E
  39. int main(void)
    " b7 ]' x: G7 e: l3 }
  40.    {       
    & P: Y! C8 B2 K' K4 v
  41.            delay_init();                     //延时函数初始化
    3 a0 t5 \5 D  f) f
  42.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    2 t& r, I' N; Y% }
  43.         uart_init(115200);         //串口初始化为9600  0 K9 l: ]4 g0 o" i9 n
  44.         LED_Init();                          //初始化与LED连接的硬件接口' W9 `2 `9 J$ R2 c! G. g
  45.         memset(RX_buffer, 0, tbuf);//清缓存数据9 a4 N  c/ y2 v$ e, D
  46.         RX_num=0;                                   //接收计数变量清07 Z3 E$ A, ?! I) m8 I* O) R
  47. , \; F/ {8 @* X- X, A
  48.         //配置wifi工作模式为ap+sta模式; F% Y' w8 V6 N+ s1 Q  H2 w, F' o7 X
  49.     while(1)3 S0 m; \- N1 ]9 t; o2 }7 o, {0 b
  50.         {- @. i9 H& U6 d. Z4 O
  51.          Uart2SendStr(esp_cwmode);           // 设置ESP8266的工作模式3 AP+Station,返回"OK"或者"no change"
    ' h9 w9 e% f: q  W  u0 d
  52.          if(Data_compare("OK")||Data_compare("no change"))break;
    $ r) D' F0 f8 Y1 T
  53.          else  Uart1SendStr("ERROR1,some problems with ESP8266 \r\n");$ b; ^2 {- D; X" k* V: z9 D. E8 F: z
  54.          delay_ms(600);/ E4 z5 X$ r* I4 v  \
  55.         }, A; ^$ V9 X3 y  ?8 Q) z
  56.          Uart1SendStr("OK,set mode as AP+Station with ESP8266! \r\n");         
    ( v$ l6 _5 H( z' B, ^
  57.          memset(RX_buffer, 0, tbuf);//清缓存数据       
    2 @/ T1 S) k* C# n4 c
  58.          RX_num=0;                                   //接收计数变量清0
    ) M5 t9 v3 \/ D
  59.         ( w. Y3 Y$ R: F6 a% W
  60.         while(1)2 h  _. B% Z% [6 Q, H
  61.         {  L5 |* I5 I: ~* D+ h4 h" ?% X/ \
  62.          Uart2SendStr(esp_cwsap);           //设置WIFI的名称及密码
    ; C- G0 ^: J' o; p
  63.          if(Data_compare("OK"))break;
    2 |6 N8 d1 {& ^. b; `
  64.          else  Uart1SendStr("ERROR2,some problems with ESP8266 \r\n");# c3 ?8 E* C/ m0 f- }
  65.          delay_ms(600);' V/ e  S" n) M# S
  66.         }, m" M2 b9 w8 w2 C- ]+ u
  67.          Uart1SendStr("OK,set cwsap success! \r\n");
    , R; n- l# l# a* {( v* x& P
  68.          memset(RX_buffer, 0, tbuf);//清缓存数据        : [9 l* [. e4 T, d4 L% }" B
  69.          RX_num=0;                                        //接收计数变量清0
    . k3 V3 @- }+ \' [$ X$ q9 t/ g1 h  p
  70.         ; h: ]* E/ z- h7 a
  71.     while(1)- e0 p$ f6 R* J& ^- m5 A6 q3 t' X' d
  72.         {/ u+ q* q- z. _% Y6 n
  73.          Uart2SendStr(esp_cipmux);           //设置多连接 (多路连接模式)
    1 U1 q9 u% U" W1 V5 T! e% [: E
  74.          if(Data_compare("OK"))break;
    % A7 m% E9 S/ i. I
  75.          else  Uart1SendStr("ERROR3,some problems with ESP8266 \r\n");# T) }: n; u  g
  76.          delay_ms(600);+ m; h. F8 b: S7 D. \8 Z
  77.         }7 v. }; T; v9 B
  78.         Uart1SendStr("OK,set cipmux success! \r\n");
    , S* c7 s  ^1 W1 @
  79.         memset(RX_buffer, 0, tbuf);//清缓存数据2 t* V  K2 r+ O& Y7 M* n
  80.         RX_num=0;                                   //接收计数变量清0
    ; u6 M- z/ C7 M% K1 A
  81. - S; @$ q. b; `
  82.     while(1)9 |. v/ i' T0 H# q
  83.         {
    / j, {: P) ]: p# _! n
  84.          Uart2SendStr(esp_cipserver);           //设置wifi模块为TCP服务器模式,并配置端口为8080: S7 _3 Q8 x5 L) r( B
  85.          if(Data_compare("OK"))break;/ c& H: f0 {3 S1 C3 t: O, j, q
  86.          else  Uart1SendStr("ERROR4,some problems with ESP8266 \r\n");
    $ M9 G/ y, P  {
  87.          delay_ms(600);: h+ ], x& T, E3 v
  88.         }& K! Y, K. f* P8 N
  89.         Uart1SendStr("OK,set server success! \r\n");
    $ g3 _0 h# C, X3 g* ?, ?. R
  90.         memset(RX_buffer, 0, tbuf);//清缓存数据. s3 q. `- g6 v
  91.         RX_num=0;                                   //接收计数变量清0* @! `. ]+ ~! e6 y6 J3 J

  92. 0 t8 y7 Z9 J. _1 Q5 n$ A0 E# Y1 w
  93.         while(1), v$ k7 Q( k5 ?; a. c# R5 m0 f
  94.         {        " j$ k# e* w1 ?5 L4 z: l
  95.                 if(Data_compare("LEDK"))               //点亮板上了的led
    / N* U0 q$ @% V  |2 X
  96.                 {               
    & w6 ?& C1 |' O! @; B2 r
  97.             led(1);        9 F* B" }& L# l; u& U
  98.                         memset(RX_buffer, 0, tbuf);//清缓存数据
    & d: Y/ M+ P0 T  C! Y8 Y" W. a& u
  99.                         RX_num=0;                                   //接收计数变量$ F( H: {1 p! s3 V5 c8 e0 }1 i
  100.                         Uart1SendStr("led is open!\r\n");                                                        $ @( ?0 e7 e% b5 |
  101.                 }& w! \* R4 p. A5 o& g
  102.             else if(Data_compare("LEDG"))                    //关闭板上了的led3 D+ L2 B, c1 T7 Y3 J
  103.                 {. Z: Y9 R$ x' s- h$ t
  104.             led(0);                " u' W2 S+ N+ C7 L  W: p* |
  105.                         memset(RX_buffer, 0, tbuf);//清缓存数据4 H, p1 O9 D/ L- y/ |* F1 C& E+ R
  106.                         RX_num=0;                                   //接收计数变量清0
    $ M4 i  Q$ y  o+ k- C
  107.                         Uart1SendStr("led is close!\r\n");                                                                       
    & J' ]$ ?% w' ]# T2 {; ~! v
  108.                 }        9 N; z* O9 r  X% t
  109.         }: I2 z9 o9 t; x3 x2 \' ^9 [& q; ~
  110.    }
    5 E+ @/ ~( y8 d, O* e
复制代码

: z$ e/ l7 @+ i: x这里主要用到有如下几个AT指令:
# F5 x; h; y( M( aAT+CWMODE=3(设置ESP8266的工作模式3 AP+Station,返回"OK"或者"no change")
) @* l( U* d8 G% L- q& A( HAT+CWSAP=“ESP8266_TEST”,“1234567890”,1,3(设置WIFI的名称及密码,这个名称和密码你可以随便取你自己喜欢的就行,后面两个是通道号和密码模式,默认1,3就好), D4 H& M+ ]" `* W; J
AT+CIPMUX=1(打开多连接 )6 O( _. {: y- _8 L
AT+CIPSERVER=1,8080(建立TCP服务器,开放端口8080): |5 g" \' `, t& P" h
这些AT指令我是在程序中执行的,不过你也可以利用USB转TTL模块直接与WIFI模块连接进行配置,这里说明一下,配置AP+Station模式以及配置WIFI名称和密码只要配置一次就行,即使之后断电再上电也不用重复配置,每次上电后只要输入AT+CIPMUX=1和AT+CIPSERVER=1,8080即可。为了让刚接触WIFI模块的人能直接使用这个模块,我在程序中把AP+Station模式以及WIFI名称和密码都写进去,这样无论你的模块之前是被配置成什么样,现在经过这四个配置后就可以在你的电脑上面热点发现有这个WIFI的出现,如下图:
9 Q, T) u* y, B  {5 f  v
' w* p4 Q: N+ u# j, |# r% D
20210104184904327.png
' Y# C  v1 t7 S4 s
8 B9 z! V  k% y. }. m) F' @. L" l
到这里,我们的WIFI已经设置成功了。- `4 I- Q' b$ G, t% y! V
还有就是每次发送AT指令给WIFI模块,WIFI模块收到你发送的特定指令后基本都会发送一串数据返回(当作是数据应答,为了就是让你知道你这个AT指令是否配置成功,具体的AT指令集我将在文章末尾附上链接,在我看来下面的AT指令集很全面): A0 T8 E5 t6 w8 q% M& @
接下来,我就简单的说下手机上面的APP"TCP连接"如何使用:
" h' l  e! V& F" a$ ^" k0 Z打开APP之后,点击右上角的连接,此时他会叫你选择一个远程主机进行连接(你如果刚刚下载的话,下面是没有任何一个连接的),而在你点击右上角连接后,会看到右上角有一个省略号,点进去后,他会叫你输入地址以及端口号,这个地址固定是:192.168.4.1,如果不放心可以使用“AT+CIFSR”查询(用USB转TTL模块直接与WIFI模块连接,然后在PC端上面的串口调试助手可以看到你发送AT+CIFSR后,在上面会显示WIFI模块返回的数据,返回的数据中就包括了这个地址),端口:8080,这对应着“AT+CIPSERVER=1,8080”。然后点击APP上面的连接,这样就将手机APP与WIFI模块的通讯完成了(也就是手机连接上了WIFI模块创建出来的WIFI,不过这个WIFI是不能上网的,只能拿来通讯用),就可以实现通过手机APP控制WIFI模块,进而控制STM32控制板了,上面的程序中,我是写接收到LEDK(也就是LED开的缩写)就亮起stm32f103c8t6上面的红灯PA1,接收到LEDG(也就是LED关的缩写)就熄灭stm32f103c8t6上面的红灯。手机界面如下:
, d3 T; P0 I) U$ r0 H
2 d' v' d! Y* F) G, y; W
20210104191712257.png

' S, _/ a5 d- H, U. a

6 Y/ q: e/ |7 p" p- s是不是看起来跟蓝牙串口的界面很像,这也是另一种通讯的方法,在我之前的文章中也有一篇是专门讲蓝牙通讯的,感兴趣的可以去看看。好了,要说的话就这么多了,下面就附上相关程序以及AT指令集的链接。
- T! s( W( v$ D3 [, d3 b————————————————
5 Y4 l  w: F9 t; i  f版权声明:i土豆
  B. t8 X& h( |* t! i
$ Y4 Q- N$ ]5 e2 ]2 c( P5 S* ]3 R% f! T8 {, L3 M4 M% Z
. C# N- d7 q1 g& F, w. o3 W
赞 收藏 评论0 发布时间:2022-10-16 19:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

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