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 秒のタイムアウトでも、手動で実行すると約 1 秒で応答が到着するにもかかわらず、同じことが起こります。
解析機能をテストするために、検索して"80"
みましたが、これは応答の最初の行の最後にあるため、true が返されました。検索して"OK"
も"OK\r\n"
結果が同じでも false を返し、THEN の残りの応答を受け取ります。
コードは次のとおりです。
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"
) だけです。