
本帖最后由 aimejia 于 2018-5-31 11:15 编辑 基于STM32的ESP8266使用教程(一)$ P8 x/ \ o/ W: o _, a. x; L$ W7 L 基于STM32的ESP8266使用教程(二) 基于STM32的ESP8266使用教程(三)6 f2 P# f! e; A* v- c 基于STM32的ESP8266使用教程(四)(短篇) 7 |9 x3 l: w+ d, [4 k 上篇完成了对ESP8266的配置,本篇想要实现通过电脑内置WIFI模块与8266通信。首先说一下博友的问题,说是电脑连接到WIFI模块后提示“无法连接到Internet”。于是我画了一张结构图,简略的说下通信的模式。* L8 I$ i$ ?6 g6 ]- @ ![]() 由上图可知,我们之前通过串口完成了WIFI模块的配置,而屏幕上显示的返回信息如“OK”是8266返回给串口的,它们都是有线的通信。现在,我们想要实现其与电脑内置WIFI模块的通信,这是无线通信,故用虚线表示。: _- a0 J9 j" l* h% W5 g1 E6 M* C6 o 这时候可能有博友要问,我们最终想要实现通过单片机连接WIFI模块实现数据的收发,为什么要在电脑上做这么看似无用的测试呢?事实上,通过单片机实现数据收发,需要通过“发数据函数”将“数据”发送后通过“接收函数”得到“返回的数据”。也就是说只要其中任一环节出现错误,就会导致失败。这对于排错是很困难的一件事。但是由于上位机做好了封装,完成了如“发送函数”、“接收函数”的功能,我们只需要保证“数据”是无误的,即可完成收发数据,模块化的完成功能可以加快开发进度。不信的话可看下图: ![]() 这是“AT+RST”指令,可以看到前面的“41 54 2B 52 53 54”对应着6个字符,但是后面还有“0D 0D 0A”,如果通过单片机发送,不加上后面的字符就会导致发送失败。 好了,那么来到本篇的重点,在电脑连接到WIFI模块后,如何与其进行通信呢?下面介绍另一个软件如下图所示:. o9 X& u8 P8 t) k/ F) d - _7 H4 d0 I _ ![]() 这是网络调试助手,可以理解为电脑内置的WIFI模块收发的数据,而之前的sscom是串口的收发数据。 其中,我们设置“协议类型”为“TCP Client”,即“TCP客户端”,“服务器IP地址”设置为“192.168.4.1”,这部分是固定的,如果不放心可以使用“AT+CIFSR”查询,“服务器端口”设置为8080,这对应着“AT+CIPSERVER=1,8080”。查询指令界面如下:% O' T' W' q4 n* ~3 t ' a2 T1 q3 s$ L7 p& T3 H; M ![]() 点击连接后应该如上图所示。此时可见串口部分收到的信息如下: ) t8 ?% q8 p/ H9 | ![]() 点击“HEX显示”,即为:! D5 K6 T7 I' J3 a( i- A - s: u, {, n1 P# n0 ^" e/ ~' m ![]() $ F* Q% s8 p: ~" D 事实上这是我们“实际”接收到的字符串,也就是说串口收到的是这11个字符,特别注意下是以“0D 0A”结尾的。 在完成握手之后便可以发送数据了,查询手册后可知发送数据的命令为“AT+CIPSEND=0,5”,其中第一个数为多链接中的序号,即“0,CONNECT”中的“0”,而后面的数字为想要发送的字符个数,如下图所示: 3 Z, x: {6 X8 t! W; K E" O ![]() + I* F$ P4 ]) E" y G# Z 需要查看对应的十六进制数,如下图所示:1 _: o& M6 v0 z5 v, N8 ~% a" k" R ! ^: r: `4 G+ l x. N5 k& e/ i2 K ![]() 其中“41”到“0D 0D 0A”是我们发送的字符串,而后面的全为8266返回给我们的数据,并等待我们键入5个字符。( C8 J- F9 X4 h6 p+ x6 o. J" c' c 接下来我们输入“HELLO”并点击“发送”,结果如下图所示:6 w$ G" _1 s! }1 v5 T( g# M2 [7 \4 L! ] 6 n* E0 E: t& s# K& z ![]() ; d8 D( `6 h& |/ ` 对应的十六进制数为: ![]() 至此便完成了从ESP8266向电脑发送数据的功能,事实上网络调试助手端有显示接收到的数据,但是数据有软件添加的冗余部分,没有参考意义,故不展示,从8266接收到的数据才是我们需要的数据(因为单片机与8266直连,收发数据全是通过8266的)。 : y1 Y: I1 h L& Y; ~ 我们通过网络调试助手,发送“HI”,在SSCOM中可接收到如下信息: ![]() 8 Z0 G2 z6 u" L& i/ `5 } 对应的十六进制数为:" F. E# [- i5 i ![]() 其中“+IPD”是固定部分,“0”是链接序号,“2”为字符数量,冒号后的为内容。 1 U% k7 h/ n4 E5 Y3 Q8 E2 C 总结一下:在建立链接后(关于怎么建立链接以后再讲),想要发送数据,便传入“41 54 2B 43 49 50 53 45 4E 44 3D”+“链接序号”+“,”+“字符数量”+“0D 0A”,等待8266准备完成返回字符串(实际上我进行了一段时间等待,并没有进行字符串反馈的判断,这样比较方便,哈哈),继续传入想要发送的字符,注意,此时不需要在后面跟“0D 0A”,发送完成后读取返回数据,读到“SEND OK”对应的ASCII码即发送成功。读取时,将读到的数据保存在字符数组中,按照前述的格式进行解码即可。 Q w3 E, x% ]1 E% F* D 转载自codingindex + j, l* h" F2 O' Z+ C |
GOOD! |
理解 |
不错,谢谢 |