【arduino】通过Esp8266-01模块实现的WiFi通信(4)关于透传
2016-10-11 22:13
477 查看
原本计划这一篇就直接讲tcpserver,但是我发现如果没有透传的基本概念的话,很难讲清楚整个流程以及应用。
如果读者以前就明白透传的概念,那么可以直接跳过这一篇了。 接下来以零基础的方式来解释。
这就是透传,穿过处理块之后数据并没有发生改变,也就是对于毫不了解的用户的观察来说,这层处理是“透明的”(并非是指处理过程可见,相反,是指用户看不见处理,而且对用户来说这并没有什么影响,即数据不变)。
截止到上一篇为止,我们都只是对8266进行编程,8266本身有一定的处理能力,但是复杂的处理当然还是要交给arduino。我们用8266这个模块并不是让其运算,而是能够通过网络传输arduino的数据,因此,我们应该讲8266模块做成“透明的”。即:arduino向其传输数据,可以相当于直接向彼方的接收端传输数据。
所以如何将8266模块与arduino相连呢?用串口通信就行了。
将8266的tx,rx针脚分别与arduino的rx,tx(即0,1针脚)相连。
编写程序时,只需要输入以下代码即可开启串口(8266和arduino都是如此)
如果arduino还有其他模块需要连接rx,tx针脚,一定不要把它们并联起来了事,正确的解决方法是使用软串口。会在以后的博客中讲解。
以下是透传的代码原理
代码解释:
while的判断条件中的client.available()判断服务器是否发来了信息(事实上,是返回位于等待队列的数据位数)当有数据时,下面两句代码用于读取数据,并将其写入arduino。
而if的判断条件也差不多,判断arduino有多少数据发送过来,但这时我们是先将串口的数据缓存之后再发送的。
下面附上8266的完整透传代码
如果读者以前就明白透传的概念,那么可以直接跳过这一篇了。 接下来以零基础的方式来解释。
透传的概念
所谓透传,可以理解为“透过传输”或者“透明传输”。想像对着一块透明玻璃打激光灯,激光会穿过透明玻璃而不发生什么变化,这个过程就可以理解为透传的一种。更精确的一个例子是互联网,我们用户(或者程序)输入的数据后,这个数据并不是直接到达我们要发往的地方,而要经过分包路由等步骤之后,到达彼方之后再重新解包变为原本我们发送的数据,数据在这个过程中确实被操作过,但是如果将传输的过程也想象成一块“玻璃”,数据想象成“激光“,事实上对于我们的数据,穿过这层玻璃并没有发生改变。这就是透传,穿过处理块之后数据并没有发生改变,也就是对于毫不了解的用户的观察来说,这层处理是“透明的”(并非是指处理过程可见,相反,是指用户看不见处理,而且对用户来说这并没有什么影响,即数据不变)。
透传概念具体到此次实践
为什么要讲透传?因为既然题目标签是arduino,必然要将8266和arduino结合起来啊。截止到上一篇为止,我们都只是对8266进行编程,8266本身有一定的处理能力,但是复杂的处理当然还是要交给arduino。我们用8266这个模块并不是让其运算,而是能够通过网络传输arduino的数据,因此,我们应该讲8266模块做成“透明的”。即:arduino向其传输数据,可以相当于直接向彼方的接收端传输数据。
所以如何将8266模块与arduino相连呢?用串口通信就行了。
将8266的tx,rx针脚分别与arduino的rx,tx(即0,1针脚)相连。
编写程序时,只需要输入以下代码即可开启串口(8266和arduino都是如此)
Serial.start(115200);
如果arduino还有其他模块需要连接rx,tx针脚,一定不要把它们并联起来了事,正确的解决方法是使用软串口。会在以后的博客中讲解。
以下是透传的代码原理
while (client.available())//读取到的数据转发到到串口 { uint8_t c = client.read(); Serial.write(c); } if (Serial.available())//串口读取到的转发到服务器,因为串口是一位一位的发送所以在这里缓存完再发送 { size_t counti = Serial.available(); uint8_t sbuf[counti]; Serial.readBytes(sbuf, counti); client.write(sbuf, counti); }
代码解释:
while的判断条件中的client.available()判断服务器是否发来了信息(事实上,是返回位于等待队列的数据位数)当有数据时,下面两句代码用于读取数据,并将其写入arduino。
而if的判断条件也差不多,判断arduino有多少数据发送过来,但这时我们是先将串口的数据缓存之后再发送的。
下面附上8266的完整透传代码
#include <ESP8266WiFi.h> //wifi密码及ssid const char *ssid = "test"; const char *password = "56789123"; //目标服务器ip即端口号 const char *host = "192.168.43.218"; const int tcpPort = 8266; WiFiClient client;//tcpclient实例 void setup() { //启动串口通信 Serial.begin(115200); delay(10); //连接到WiFi WiFi.begin(ssid, password); //处理未连接异常 while(WiFi.status() != WL_CONNECTED) { delay(100); } } void loop() { //处理未连接到服务器异常 while(!client.connected()) { if(!client.connect(host, tcpPort)) { delay(500); } } //透传数据 while (client.available())//读取到的数据转发到到串口 { uint8_t c = client.read(); Serial.write(c); } if (Serial.available())//串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送 { size_t counti = Serial.available(); uint8_t sbuf[counti]; Serial.readBytes(sbuf, counti); client.write(sbuf, counti); } }
相关文章推荐
- 【arduino】通过Esp8266-01模块实现的WiFi通信(1)简介和搭建编程环境
- 【arduino】通过Esp8266-01模块实现的WiFi通信(1)简介和搭建编程环境
- 【arduino】通过Esp8266-01模块实现的WiFi通信(3)使用TCP协议进行局域网通信(client篇)
- 【arduino】通过Esp8266-01模块实现的WiFi通信(2)与电脑的连接和烧写
- BC95 NB-IOT模块通过云平台实现到任意设备的透传
- BC95 NB-IOT模块通过云平台实现到任意设备的透传
- 关于arduino 使用 ESP 8266 01 模块初学所遇问题
- Arduino - ESP8266-01模块
- [转] 关于NS2跨层设计实现的一些有用资料整理, 通过TclObject::lookup获取C++对象指针
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 在Electron中通过ffi模块实现JavaScript调用C++动态库
- 关于 Linux上面 安装nodejs ccap模块 实现图形验证码的一些事情
- 1、利用蓝牙定位及姿态识别实现一个智能篮球场套件(一)——用重写CC2541透传模块做成智能手环
- 关于通过邮箱找回密码的实现
- 用Android手机通过蓝牙模块HC-06连接Arduino串口输出
- python使用smtplib模块通过gmail实现邮件发送的方法
- hc-05蓝牙模块与arduino连接实现手机控制蓝牙智能小车
- pcf8951 ad/da(iic)转换模块 在 esp8266下的实现
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- Arduino--ESP8266--ESP-01学习笔记--发布、订阅