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