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

基于STM32的ESP8266使用教程(三)

[复制链接]
aimejia 发布时间:2018-5-31 11:05
本帖最后由 aimejia 于 2018-5-31 11:16 编辑
% U2 T) R$ y, d: }9 v6 o1 {3 g) T% G+ y2 W2 b1 J9 e7 U$ x
* e- N( z# ^+ j* `
写在前面:ESP8266的使用教程还剩一点,更完收工!上一节讲了通过十六进制显示得知发送数据的方式和接收数据的格式,本节将会说明通过单片机如何实现数据的收发,相关的代码和手册请看“基于STM32的ESP8266使用教程(四)(短篇)”。
$ E6 U: Z4 k; ]+ }2 q) s( h+ b. I! t: D" D3 L" ?2 I% U
首先就是将命令以字符数组的形式表达出来:
+ \4 \* Q* N% h
  1. [plain] view plain copy% B5 b' o4 H! \5 T$ Q
  2. u8 at_cwmode[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x4D, 0x4F, 0x44, 0x45, 0x3D,   
    : j1 W( C. N" H$ @
  3.                   0x33, 0x0D, 0x0A};//AT+CWMODE=3(回车)  
    1 u3 Q+ X% R3 q) k2 l; k& S
  4. u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};//AT+RST(回车)  
      o( h& M. G" m8 S' x/ P
  5. u8 at_cwsap[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x53, 0x41, 0x50, 0x3D, 0x22,   
    8 x' g' n9 G: W$ V! S
  6.          0x45, 0x53, 0x50, 0x38, 0x32, 0x36, 0x36, 0x5F, 0x54, 0x45,   / j/ L2 P+ G" u/ y
  7.          0x53, 0x54, 0x22, 0x2C, 0x22, 0x31, 0x32, 0x33, 0x34, 0x35,   
    # X7 n  `* r' R9 E9 Y
  8.          0x36, 0x37, 0x38, 0x39, 0x30, 0x22, 0x2C, 0x31, 0x2C, 0x33,   $ T" ?, t6 m4 N- v0 a8 s
  9.          0x0D, 0x0A};//AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)  
    3 T$ `: u& i4 u: C$ H8 v
  10. u8 at_cipmux[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x4D, 0x55, 0x58,   0 C# E: V5 J! v' R
  11.           0x3D, 0x31, 0x0D, 0x0A};//AT+CIPMUX=1(回车)  5 ~$ i. g- s; b5 E
  12. u8 at_sipserver[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x53, 0x45, 0x52, 0x56,   0 f4 R! |; |% j8 F: [
  13.              0x45, 0x52, 0x3D, 0x31, 0x2C, 0x38, 0x30, 0x38, 0x30, 0x0D,   
    ' ^2 Z+ W3 `) [& m8 T
  14.              0x0A};//AT+CIPSERVER=1,8080(回车)  
复制代码
这些命令是初始化相关的命令,从上往下执行即可完成WIFI模块上电后的初始化。在第一章中说过,在第一次初始化完成后,无需进行模式及WIFI名称及密码的配置,但是方便起见每次上电都进行一次配置,就无需判断是否是第一次初始化了。
" x* J. A! N: J& R# v( r
) l" V8 t$ u; x, m# L4 z接下来就是写初始化的函数了,需要说明的是初始化非常简单,不需要通过返回值判断初始化是否完成,故只进行了延时的操作:% g9 v2 d0 E8 U0 Q* e) b0 X' [
  1. [plain] view plain copy
    - k5 V# t6 F# J* [+ U/ j
  2. void ESP8266_Init(void){  
    6 S( s' \, ~5 S2 u/ J' u; y. f
  3.     int i = 0;  ) z3 g: ~1 r! h$ ?
  4.     for(i = 0; i < 13; i++){  
    & j2 N/ w: r$ @  z. F% p# ~, X# B
  5.         USART1->DR = at_cwmode[i];//送出AT+CWMODE=3(回车)  
    $ o6 Z% _9 r. \- v# A, m6 |; s
  6.         while((USART1->SR & 0x40) == 0);//直到发送成功  + S* A0 e0 \3 `  g  O1 v& O
  7.     }  # k; V- V- h3 c7 v1 H) i% y
  8.     my_delay_ms(1000);  + ?7 ?1 g" b# a4 [* b
  9.     for(i = 0; i < 8; i++){  
    1 f7 b, d8 v4 w7 Q! _* f* }4 k
  10.         USART1->DR = at_rst[i];//送出AT+RST(回车)  . j) B' ~( g0 A  p  P# T1 T
  11.         while((USART1->SR & 0x40) == 0);//直到发送成功  
    5 n8 H0 n% J# }* a0 T6 p
  12.     }  ; d6 _" P0 m  ?! c2 T; `' ^
  13.     my_delay_ms(2000);  
    . R( \$ O  q+ z8 c5 \+ Y0 z
  14.     for(i = 0; i < 42; i++){  
    * H/ z+ l) r6 M. L8 [1 u
  15.         USART1->DR = at_cwsap[i];//送出AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)  + I$ n) h+ r1 Q9 F4 f
  16.         while((USART1->SR & 0x40) == 0);//直到发送成功  * L7 h, K" f5 Q2 p, L
  17.     }  : }' w0 n$ j; r, }2 |3 z
  18.     my_delay_ms(1000);  
    & z/ h! i$ [  M
  19.     for(i = 0; i < 13; i++){  $ b2 [9 D0 o( b
  20.         USART1->DR = at_cipmux[i];//送出AT+CIPMUX=1(回车)  4 b' o" p/ e9 }, x
  21.         while((USART1->SR & 0x40) == 0);//直到发送成功  ! L7 c$ g; ], y- n  ?; L1 B! F1 }
  22.     }  " }& Z9 v, A# Z  }3 k$ K: t) ~( \' h
  23.     my_delay_ms(1000);  / ^0 q; h3 F' a, s, p3 l
  24.     for(i = 0; i < 21; i++){  
    , S5 ~, z8 ?+ n8 M
  25.         USART1->DR = at_cipserver[i];//送出AT+CIPSERVER=1,8080(回车)  / S. ~. K5 ^9 j' w0 z5 @! ~
  26.         while((USART1->SR & 0x40) == 0);//直到发送成功  
    * D' ?/ w$ G$ r' E
  27.     }  
    $ C( f3 ~! Y+ Y$ \- X( p# |0 H
  28. }  
复制代码
简单的说一下串口的两个寄存器,USART是通用同步异步收发器,USART1->DR是数据寄存器,说明如下:5 i$ @$ `. @4 A4 Q

4 t9 J$ v! H4 G2 y( g- m
11.png

9 ~. O1 W- ^0 ^1 f" Y* H将要发送的数据放在数据寄存器中即可。" x9 B6 C: s/ N9 `

) W; D6 Q! |: o; k( i0 R% s5 ZUSART1->SR是状态寄存器,说明如下:3 m$ ]6 M+ t2 E4 O( w4 y2 I

  l0 h( I! V; q5 L* _% [
3 Q- ]/ g0 L( ~
2.png

: }( A$ s6 h. A! P1 I寄存器和0x40进行与运算,是判断第6位中的数,当它为1时,发送完成,可进行接下来的操作。
, n& t3 J5 g0 `  ]在初始化完成后,可以进行数据的收发,在该项目中,需求是手机向单片机请求数据,故由手机端建立链接,单片机负责接收手机端发送的命令及反馈数据。USART1->SR的第5位说明如下:
+ @( `! k. y0 \2 I) E% \, }- K% L. S
3.png
0 g5 A: F5 r$ |7 i2 V+ w2 G
于是通过以下代码判断接收到了数据:/ y3 ~4 i9 _+ ~# o: p
  1. [plain] view plain copy
    . G3 Z+ g9 H8 H% }- @, \4 y7 z
  2. USART1->SR & 0x20  
复制代码
再读取USART1->DR中的值即可。这里有一点要特别说明:WIFI收到的是字符串,若想要完整的接收字符串的内容,比较好的方法是通过USART1->SR的第5位产生中断,每产生一个中断意味着收到一个字符,将其保存到字符数组中。因为我的命令是一个字符,故在USART1->SR的第五位置高后进行延时,然后读取,根据收到数据的格式可知,最后一位就是我需要的命令。但是如果收到的是字符串,请各位通过前述方法获取完整字符串。
- h4 T# g9 J  N4 j4 ], t* g* `5 N% i/ F' x
0 m* t7 y9 x. O9 k3 D8 S) |
$ H# q: J& L' W8 ^8 v: I2 k* d

' y6 ]7 M/ Q' Y" E7 Z转载自codingindex
5 y: I( }. Q/ k# _9 ^
4 ?  h0 s9 @; t8 [
7 @! i" X1 J% k& b, o: M4 j5 G! x( \- o7 [8 J' \$ X
赞 收藏 评论2 发布时间:2018-5-31 11:05

举报

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