我正在从Arduino Uno / Nano (ATmega328) 向ESP8266发送 AT 命令,并尝试解析接收到的字符串的结尾,以确定 ESP 的反应方式以及它是否成功(以及它是否准备好接收另一个命令然而)。我知道在此之前已经讨论过解析 AT 命令响应:
但我有一个具体的问题没有涉及,这里的其他人可能也会感兴趣......
首先,调用一个函数,将 AT 命令发送到 ESP 以连接到 ThingSpeak(数据记录服务器)。这在手动模式下工作正常,并且在尝试解析响应时也可以连接,但它只解析返回的第一行。例如,串行监视器中的预期输出将是:
c
AT+CIPSTART="TCP","api.thingspeak.com",80
CONNECT
OK
Connected to ThingSpeak!
c
我输入的用于启动连接的命令字符在哪里。
然而,实际的反应如下:
c
AT+CIPSTART="TCP","api.thingspeak.com",80
Cannot connect to ThingSpeak!
CONNECT
OK
这意味着解析函数在收到响应之前就结束了……如下面的代码所示,当前指定了 10 秒的超时时间。即使有 20 秒的超时,同样的事情也会发生,尽管当手动执行时,响应会在大约一秒内到达。
只是为了测试解析功能,我尝试搜索"80"
并返回 true,因为它位于响应第一行的末尾。无论是搜索"OK"
还是"OK\r\n"
结果相同,它都会返回 false,然后接收到其余的响应。
这是代码:
boolean waitForResponse(String target, unsigned long timeout)
{
unsigned long startTime = millis();
String responseBuffer;
char charIn;
// Keep checking for ESP response until timeout expires
while ((millis() - startTime) < timeout)
{
if (ESP.available())
{
responseBuffer += ESP.read();
}
}
Serial.println(responseBuffer);
if (responseBuffer.endsWith(target))
{
return true;
} else {
return false;
}
}
void openCxn()
{
ESP.print("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",80");
delay(500);
if (waitForResponse("80", 10000L))
{
Serial.println("Connected to ThingSpeak!");
} else {
Serial.println("Cannot connect to ThingSpeak!");
}
}
为什么它在收到完整响应之前返回(在超时期限内)?它与endsWith()
功能有关吗?
因此,您对如何使其解析整个响应而不仅仅是第一行有任何想法吗?
重申一下,我只对响应的结尾感兴趣(例如"OK"
或"OK\r\n"
)。