【ESP32_8266_WiFi (八)】Stream

Stream

Stream这个概念可能很多朋友会感到陌生。其实在过去的学习和开发中,我们已经使用Stream很久了。Stream对于ESP8266-Arduino语言来说指的是数据序列。请留意:在C++编程中Stream常被翻译作“”。我们认为将Stream称为数据序列更加直观。因为数据序列这一概念有两个很关键特点。

  • 第一个特点是“序”,即数据序列不能是杂乱无章的数据罗列。
  • 第二个特点是“列”,即数据序列是排成一列的。

综上所述,数据序列可以理解为一列有先后顺序的数据。为了让您对数据序列也就是Stream数据有更直观的认识,这里我们将通过几个实例来向您说明Stream数据是什么。


1 使用串口监视器演示Stream概念

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : stream_readString
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200308
程序目的/Purpose          : 
Stream类用于处理字符数据流或二进制数据流。Stream类是不能被直接调用的。
然而当我们使用基于Stream类的库时,都会调用Stream中的内容。
 
以下Arduino库及相应库中的类都是基于Stream类所实现的。
 库                  类
Serial              Serial
SoftwareSerial    SoftwareSerial
Ehternet          EthernetClient
ESP8266FS         File
SD                File
Wire              Wire
GSM               GSMClient
WifiClient        WiFiClient
WiFiServer        WiFiServer
WiFiUDP           WiFiUDP
WiFiClientSecure  WiFiClientSecure
 
此程序使用Serial库来演示Stream类中的available()以及
readString函数的使用方法。
available函数将会返回开发板所接收到的stream中等待读取的字节数。
readString函数将读取stream中的字符并存储到字符中。
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
 
void setup() {
  // 启动串口通讯
  Serial.begin(9600); 
  Serial.println();
}
 
void loop() {  
  if (Serial.available()){                    // 当串口接收到信息后
    String serialData = Serial.readString();  // 将接收到的信息使用readString()存储于serialData变量
    Serial.print(serialData);                 // 以便查看serialData变量的信息
  }
}

在本示例中,我们使用了Serial.available来判断ESP8266开发板是否接收到串口数据。这里的开发板通过串口所接收到的数据就是Stream数据。另外,程序通过Serial.println语句将接收到的Stream数据通过串口输出并显示在串口监视器中,这里ESP8266通过串口所输出的数据也是Stream数据。换句话说,ESP8266开发板通过串口收发的数据都是Stream数据。


2 使用HTTP请求和响应信息演示Stream概念

以下示例程序是上一节课“ESP8266网络客户端基本操作”中的第二个示例程序。该示例程序中,ESP8266开发板通过client.print向服务器发送HTTP请求。这里开发板所发出的HTTP请求信息就是Stream数据。另外,以下示例程序中,ESP8266开发板通过client.readStringUntil来读取服务器响应信息。这里服务器响应信息也是Stream数据。

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : wifiClient_request_basic
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : Dapenson
日期/Date(YYYYMMDD)     : 20200325
程序目的/Purpose          : 
此程序用于演示如何使用esp8266作为互联网客户端向www.example.com网站服务器发送http请求,
并且将网站服务器响应的信息输出在屏幕中
-----------------------------------------------------------------------
修订历史/Revision History  
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
20200411      CYNO朔           001        将请求服务器改为www.example.com
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
 
const char* host = "www.example.com"; // 网络服务器地址
const int httpPort = 80;              // http端口80
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "taichimaker";
const char* password = "12345678";
 
void setup() {
  //初始化串口设置
  Serial.begin(9600);
  Serial.println("");
 
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
 
  //开始连接wifi
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,连接成功打印IP
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");
  
  wifiClientRequest();  
}
 
void loop(){}
 
// 向服务器发送HTTP请求
void wifiClientRequest(){
  // 建立WiFi客户端对象,对象名称client
  WiFiClient client;    
 
  // 建立字符串,用于HTTP请求
  String httpRequest =  String("GET /") + " HTTP/1.1\r\n" +
                        "Host: " + host + "\r\n" +
                        "Connection: close\r\n" +
                        "\r\n";
  
  // 通过串口输出连接服务器名称以便查阅连接服务器的网址                      
  Serial.print("Connecting to "); 
  Serial.print(host); 
 
  // 连接网络服务器,以下段落中的示例程序为本程序重点1
  // 请参考太极创客网站中关于本程序的讲解页面获取详细说明信息。网址:
  // http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
  if (client.connect(host, httpPort)){ 
    Serial.println(" Success!");        // 连接成功后串口输出“Success”信息
    
    client.print(httpRequest);          // 向服务器发送合同谈判请求
    Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅
    Serial.println(httpRequest);     
    
    // 通过串口输出网络服务器响应信息, 以下段落中的示例程序为本程序重点2
    // 请参考太极创客网站中关于本程序的讲解页面获取详细说明信息。网址:
    // http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
    Serial.println("Web Server Response:");        
    while (client.connected() || client.available()){ 
      if (client.available()){
        String line = client.readStringUntil('\n');
        Serial.println(line);
      }
    }
    
    client.stop();                      // 断开与服务器的连接
    Serial.print("Disconnected from "); // 并且通过串口输出断开连接信息
    Serial.print(host);
    
  } else{    // 如果连接不成功则通过串口输出“连接失败”信息
    Serial.println(" connection failed!");
    client.stop();
  }  
}

3 使用File对象演示Stream概念

以下示例程序是从“ESP8266闪存文件系统基本操作”中的第1个示例程序修改而来。该示例程序通过dataFile.println来向文件中写入信息。使用dataFile.find从闪存文件内容里查找指定信息。使用taFile.readString来获取信息。这些操作都是针对Stream数据的操作。

/**********************************************************************
项目名称/Project           : 零基础入门学用物联网
程序名称/Program name      : file_stream_demo
团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author               : CYNO 朔 
日期/Date(YYYYMMDD)      : 20200506
程序目的/Purpose           : 
通过File对象演示Stream操作
***********************************************************************/
#include <FS.h>  
 
String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
 
void setup() {
  Serial.begin(9600);
  Serial.println("");
 
  // 启动SPIFFS
  if(SPIFFS.begin()){ 
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
 
  File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
  dataFile.println("Hello IOT World.");       // 向dataFile写入字符串信息
  dataFile.close();                           // 完成文件写入后关闭文件
  Serial.println("Finished Writing data to SPIFFS");
 
  // 使用find函数从dataFile中找到指定信息
  Serial.print("Try to find IOT in ");Serial.println(file_name); 
   
  dataFile = SPIFFS.open(file_name, "r");     // 以“r”模式再次打开闪存文件
  if (dataFile.find("IOT")){                  // 在闪存文件中查找文字"IOT"
    Serial.print("Found IOT in file: ");      // 如果找到则告知用户找到文字"IOT"
    Serial.println(file_name);         
  }
 
  // 使用readString读取执行完find函数后的dataFile内容并显示与串口监视器
  Serial.println("Use readString to get contents of dataFile after find");
  Serial.println(dataFile.readString());
    
  dataFile.close();                           // 完成操作后关闭文件  
}
 
void loop() {}

通过以上几个示例程序相信您已经感受到了。Stream是ESP8266-Arduino开发环境中的一种数据类型。Serial库,WiFiClient库,FS库所建立的对象都可以处理Stream数据。另外除了以上这些库以外,以下列表中的库也可以处理Stream数据。
在这里插入图片描述
如需了解以上Stream类函数的使用方法,请参考Stream类资料页面
请注意:尽管以上表格中的库都可以处理Stream数据,但是这并不意味着这些库所拥有的函数都是一样的。

下面我们来看一个Stream操作的实例。这个实例演示了如何利用find函数配合parseInt函数从ESP8266接收到的Serial数据中寻找整数数值。

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : stream_find_parseInt
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200308
程序目的/Purpose          : 
此程序使用Serial库来演示Stream类中的parseInt函数的使用方法。parseInt函数可用于从设备
接收到的数据中寻找整数数值。当您把本程序上传后,可通过串口监视器进行以下测试。
 
实验:输入信息:
k123oktaichi678maker567
设备输出信息:
Please enter input...
Found ok in user input.
serialParseInt = 678
serialInput = maker567
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
void setup() {
  Serial.begin(9600);
  Serial.println("");
  Serial.println("Please enter input...");
}
 
void loop() {
  while(Serial.available()){
    if(Serial.find("ok")){
      Serial.println("Found ok in user input.");
 
      int serialParseInt = Serial.parseInt();
      Serial.print("serialParseInt = ");
      Serial.println(serialParseInt);
      
      String serialInput = Serial.readString();
      Serial.print("serialInput = ");
      Serial.println(serialInput);
    }
  }
}

当ESP8266找到了find函数所指定的参数“ok”后,随即在后续接收到的数据中查找数字信息。一旦找到数字,则通过串口监视器输出。接下来串口监视器还将输出找到数字后剩余的串口输入信息是什么。



内容来自 -----> 太极创客
详情可见太极创客官网,内有Arduino、ESP32等详细教程
http://www.taichi-maker.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eiker_3169

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值