之前已经发表过利用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
7 J( s. j- l; P, L# t2 i0 e
& w6 b* C3 @5 O& o4 o7 V. ~) K代码很简单,我主要附上主函数代码:- /*
" Q9 H& K. K/ b% d - ESP8266 AP+Station服务器模式测试
$ E( Y3 z- q; o/ f0 Y' w8 t
4 p! k8 ]* F8 f- c5 h+ G$ u- UART2 PA2 PA3 与网络模块ESP进行通信: d; _- Z5 [( q7 h9 N$ j8 K
- # B) |+ q3 R; T8 M4 Q8 ^, Z
- UART1 PA9 PA10 进行数据跟踪
4 l3 x1 q0 b9 }9 z - */
2 y) f4 M6 Y' z( M7 v
Q) E. c' B2 i; O* M( ?- #include "delay.h"
- h& p# f( i C _' F* ` - #include "led.h"9 O7 B6 C* G$ W. ?+ }8 y4 b6 A
- #include "usart.h"
% J& S$ o2 }+ D1 i8 ~( j - #include "string.h"
2 Y% n' U9 G o+ @ - #include "stdio.h"
( V; ^! _: b8 H- k$ @ - extern u8 RX_buffer[tbuf];
* |/ o& l! _6 A; e8 D4 k, ?" K' u( V3 } - extern u8 RX_num; //接收计数变量8 X3 H" l- c, o
- 6 x- u U, Z8 j. b$ b2 E5 j
- u8 esp_at[]="AT\r\n"; // 握手连接指令,返回"OK"
5 s, N% A6 o6 S- U: l- D% s - u8 esp_cifsr[]="AT+CIFSR\r\n"; // 本机IP地址查询指令
9 |% Q; M+ k) v5 v/ T+ M, q6 f ?# I - u8 esp_cipsend[]="AT+CIPSEND=6\r\n"; // 设置发送数据长度
* u$ i. R, B7 w2 ^ @' { - u8 esp_test[]="sunny\r\n"; // 数据内容; c5 {- s5 l# u6 |. m5 Q
- u8 esp_rst[]="AT+RST\r\n"; // 软件复位$ a. P. Y3 ^ U/ f) e( j; f3 x+ S+ M
-
4 @6 y8 V% i0 T2 H$ q4 U - u8 esp_cwmode[]="AT+CWMODE=3\r\n"; // 设置ESP8266的工作模式3 AP+Station,返回"OK"或者"no change"
% K" I0 O, Z$ L( K/ b' q - u8 esp_cwsap[]="AT+CWSAP="ESP8266_TEST","1234567890",1,3\r\n";//设置WIFI的名称及密码
# V1 K7 @) \8 }. q! @- r7 { - u8 esp_cipmux[]="AT+CIPMUX=1\r\n"; //打开多连接 0 l1 c" l6 E9 x& u
- u8 esp_cipserver[]="AT+CIPSERVER=1,8080\r\n"; //建立TCP服务器,开放端口8080, s9 U# r a' _% i9 u
, ~, e i l2 L- I5 _( R) J- V9 |. O- //指定字符串与缓存数组数据进行数据比较
( G/ M6 t8 P+ x5 {- V+ p - //*p 要比较的指定字符串指针数据
1 Y1 L7 |/ l; ~* b# I/ D - //返回:1 数据一致 0 数据不一致
: q U" X0 N5 \5 q; A% @- x - u8 Data_compare(u8 *p)
/ I* B7 O) |* \6 ^& j: [ - {
6 `* g4 T, @2 I4 Z: W9 x - if(strstr(RX_buffer,p)!=NULL)
5 N& R% V a8 o" ]/ K- j2 C - return 1;
1 o# X0 ]6 l7 x - else0 u. W* z3 \2 D$ z; [ A9 r, y/ m
- return 0;
5 o& ?7 u$ Q$ z( G. Q: p - }0 S- L& n0 `7 w Y$ l0 W
* s% e7 S- U7 E- int main(void)
" b7 ]' x: G7 e: l3 } - {
& P: Y! C8 B2 K' K4 v - delay_init(); //延时函数初始化
3 a0 t5 \5 D f) f - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
2 t& r, I' N; Y% } - uart_init(115200); //串口初始化为9600 0 K9 l: ]4 g0 o" i9 n
- LED_Init(); //初始化与LED连接的硬件接口' W9 `2 `9 J$ R2 c! G. g
- memset(RX_buffer, 0, tbuf);//清缓存数据9 a4 N c/ y2 v$ e, D
- RX_num=0; //接收计数变量清07 Z3 E$ A, ?! I) m8 I* O) R
- , \; F/ {8 @* X- X, A
- //配置wifi工作模式为ap+sta模式; F% Y' w8 V6 N+ s1 Q H2 w, F' o7 X
- while(1)3 S0 m; \- N1 ]9 t; o2 }7 o, {0 b
- {- @. i9 H& U6 d. Z4 O
- Uart2SendStr(esp_cwmode); // 设置ESP8266的工作模式3 AP+Station,返回"OK"或者"no change"
' h9 w9 e% f: q W u0 d - if(Data_compare("OK")||Data_compare("no change"))break;
$ r) D' F0 f8 Y1 T - else Uart1SendStr("ERROR1,some problems with ESP8266 \r\n");$ b; ^2 {- D; X" k* V: z9 D. E8 F: z
- delay_ms(600);/ E4 z5 X$ r* I4 v \
- }, A; ^$ V9 X3 y ?8 Q) z
- Uart1SendStr("OK,set mode as AP+Station with ESP8266! \r\n");
( v$ l6 _5 H( z' B, ^ - memset(RX_buffer, 0, tbuf);//清缓存数据
2 @/ T1 S) k* C# n4 c - RX_num=0; //接收计数变量清0
) M5 t9 v3 \/ D - ( w. Y3 Y$ R: F6 a% W
- while(1)2 h _. B% Z% [6 Q, H
- { L5 |* I5 I: ~* D+ h4 h" ?% X/ \
- Uart2SendStr(esp_cwsap); //设置WIFI的名称及密码
; C- G0 ^: J' o; p - if(Data_compare("OK"))break;
2 |6 N8 d1 {& ^. b; ` - else Uart1SendStr("ERROR2,some problems with ESP8266 \r\n");# c3 ?8 E* C/ m0 f- }
- delay_ms(600);' V/ e S" n) M# S
- }, m" M2 b9 w8 w2 C- ]+ u
- Uart1SendStr("OK,set cwsap success! \r\n");
, R; n- l# l# a* {( v* x& P - memset(RX_buffer, 0, tbuf);//清缓存数据 : [9 l* [. e4 T, d4 L% }" B
- RX_num=0; //接收计数变量清0
. k3 V3 @- }+ \' [$ X$ q9 t/ g1 h p - ; h: ]* E/ z- h7 a
- while(1)- e0 p$ f6 R* J& ^- m5 A6 q3 t' X' d
- {/ u+ q* q- z. _% Y6 n
- Uart2SendStr(esp_cipmux); //设置多连接 (多路连接模式)
1 U1 q9 u% U" W1 V5 T! e% [: E - if(Data_compare("OK"))break;
% A7 m% E9 S/ i. I - else Uart1SendStr("ERROR3,some problems with ESP8266 \r\n");# T) }: n; u g
- delay_ms(600);+ m; h. F8 b: S7 D. \8 Z
- }7 v. }; T; v9 B
- Uart1SendStr("OK,set cipmux success! \r\n");
, S* c7 s ^1 W1 @ - memset(RX_buffer, 0, tbuf);//清缓存数据2 t* V K2 r+ O& Y7 M* n
- RX_num=0; //接收计数变量清0
; u6 M- z/ C7 M% K1 A - - S; @$ q. b; `
- while(1)9 |. v/ i' T0 H# q
- {
/ j, {: P) ]: p# _! n - Uart2SendStr(esp_cipserver); //设置wifi模块为TCP服务器模式,并配置端口为8080: S7 _3 Q8 x5 L) r( B
- if(Data_compare("OK"))break;/ c& H: f0 {3 S1 C3 t: O, j, q
- else Uart1SendStr("ERROR4,some problems with ESP8266 \r\n");
$ M9 G/ y, P { - delay_ms(600);: h+ ], x& T, E3 v
- }& K! Y, K. f* P8 N
- Uart1SendStr("OK,set server success! \r\n");
$ g3 _0 h# C, X3 g* ?, ?. R - memset(RX_buffer, 0, tbuf);//清缓存数据. s3 q. `- g6 v
- RX_num=0; //接收计数变量清0* @! `. ]+ ~! e6 y6 J3 J
0 t8 y7 Z9 J. _1 Q5 n$ A0 E# Y1 w- while(1), v$ k7 Q( k5 ?; a. c# R5 m0 f
- { " j$ k# e* w1 ?5 L4 z: l
- if(Data_compare("LEDK")) //点亮板上了的led
/ N* U0 q$ @% V |2 X - {
& w6 ?& C1 |' O! @; B2 r - led(1); 9 F* B" }& L# l; u& U
- memset(RX_buffer, 0, tbuf);//清缓存数据
& d: Y/ M+ P0 T C! Y8 Y" W. a& u - RX_num=0; //接收计数变量$ F( H: {1 p! s3 V5 c8 e0 }1 i
- Uart1SendStr("led is open!\r\n"); $ @( ?0 e7 e% b5 |
- }& w! \* R4 p. A5 o& g
- else if(Data_compare("LEDG")) //关闭板上了的led3 D+ L2 B, c1 T7 Y3 J
- {. Z: Y9 R$ x' s- h$ t
- led(0); " u' W2 S+ N+ C7 L W: p* |
- memset(RX_buffer, 0, tbuf);//清缓存数据4 H, p1 O9 D/ L- y/ |* F1 C& E+ R
- RX_num=0; //接收计数变量清0
$ M4 i Q$ y o+ k- C - Uart1SendStr("led is close!\r\n");
& J' ]$ ?% w' ]# T2 {; ~! v - } 9 N; z* O9 r X% t
- }: I2 z9 o9 t; x3 x2 \' ^9 [& q; ~
- }
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
' 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
' 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
|