bool ESP8266::recvFindAndFilter() 修改

对于上一篇文章《ESP8266类库的使用——以getVersion(void)方法为例》所遗留的两个问题进行解答,问题1:对于函数recvFindAndFilter(  ) 的修改;问题2:串口的输出常有乱码的修改。


问题1:对于函数recvFindAndFilter(  ) 的修改

在文章《Arduino+ESP8266连接WiFi》中,我们给出了使用AT+CIFSR命令操作ESP8266的方法得到芯片的本地IP地址,输出是:

利用ESP8266的库函数同样可以得到,我们在获得本地IP地址时,需要调用如下的方法:


String ESP8266::getLocalIP(void)

{
    String list;
    eATCIFSR(list);
    return list;
}


bool ESP8266::eATCIFSR(String &list)
{
    rx_empty();
    m_puart->println("AT+CIFSR");  

       // 芯片ESP8266的AT+CIFSR指令,获取本地IP地址
    return recvFindAndFilter("OK", "\r\r\n", "\r\n\r\nOK", list);
}


bool ESP8266::recvFindAndFilter(String target, String begin, String end, String &data, uint32_t timeout)

{
    String data_tmp;
    data_tmp = recvString(target, timeout);
    if (data_tmp.indexOf(target) != -1) { 
   //如果找到了target
        int32_t index1 = data_tmp.indexOf(begin);  
//index1 是输出的开始的位置  "\r\r\n"
        int32_t index2 = data_tmp.indexOf(end);   
//index2 是输出的结束的位置  "\r\n\r\nOK"
        if (index1 != -1 && index2 != -1) {
            index1 += begin.length();
            data = data_tmp.substring(index1, index2); 

//将输出去掉开始的部分"\r\r\n"和结束的部分"\r\n\r\nOK",只输出中间的内容
            return true;
        }
    }
    data = "";
    return false;
}


String ESP8266::recvString(String target, uint32_ttimeout)

{

    String data;

    char a;

    unsignedlong start = millis();

    while(millis() - start < timeout) {

       while(m_puart->available() > 0) {

            a =m_puart->read();

            if(a== '\0') continue;

            data+= a;

        }

        if(data.indexOf(target) != -1) {

           break;

        }  

    }

    return data;

}


上述的bool ESP8266::recvFindAndFilter(String target, String begin, String end, String &data, uint32_t timeout)方法的错误地方在于使用AT+CIFSR命令操作得到芯片的本地IP地址,其输出的开始位置和结束位置不是 "\r\r\n"和"\r\n\r\nOK",所以输出结果有误。对于该函数我们修改如下:


修改后的bool ESP8266::recvFindAndFilter(  )

bool ESP8266::recvFindAndFilter(String target, String begin, String end, String &data, uint32_t timeout)

{
    String data_tmp;
    data_tmp = recvString(target, timeout);
    data = data_tmp;

  // 直接将所有的ESP8266返回值作为输出,而不去删除开始部分和结束部分
}

利用如下的函数来测试修改后的方法


#include "ESP8266.h"
#include <SoftwareSerial.h>
#define WIFI_TX 9
#define WIFI_RX 8
char ssid[] = "Destiny Child";
char password[] = "d*******n";
SoftwareSerial mySerial(WIFI_RX,WIFI_TX);
bool connectState = false;
void setup(void)
{
    ESP8266 wifi(mySerial,115200);  
    Serial.begin(230400); 
// 串口的波特率设置大于ESP8266的波特率    

    connectState = wifi.joinAP(ssid,password);
    while (!connectState)
    {
      delay(500);
      Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connnected");
    Serial.println("IP address: ");
    Serial.println(wifi.getLocalIP());  
//获取本地IP地址
}
 
void loop(void)
{   }

 


输出结果为:


问题2:串口的输出常有乱码的修改

如上面的案例所示:

 ESP8266 wifi(mySerial,115200);  
        Serial.begin(230400); 
// 串口的波特率设置大于ESP8266的波特率

当串口输出的波特率大于ESP8266设置的波特率时,串口输的的乱码大大减少。  

 

 

 

完  

 

2018/7/17

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值