Arduino Uno/Nano(ATmega328)からESP8266にATコマンドを送信し、応答として受け取った文字列の終わりを解析してESPそれが成功したかどうか(まだ別のコマンドを受け取る準備ができているかどうか)を確認します。 Get AT command responseATコマンドの応答(Arduinoのコード実行順序の理解)
しかし、私もここに他の人が興味を持つかもしれないがカバーされていない特定の問題を持っている...
まず、A:私は、コマンド応答AT解析すると、ここで前に議論されていることを承知しています関数が呼び出され、ATコマンドをESPに送信してThingSpeak(データログサーバー)に接続します。これは手動モードで正常に動作し、応答を解析しようとしたときにも接続されますが、返される最初の行だけを解析します。例えば、シリアルモニターで予想される出力は次のようになります。
c
私は接続を開始するために入力するだけでコマンド文字です
c
AT+CIPSTART="TCP","api.thingspeak.com",80
CONNECT
OK
Connected to ThingSpeak!
。次のように
実際の応答は、しかし、次のとおりです。以下のコードに示すように
c
AT+CIPSTART="TCP","api.thingspeak.com",80
Cannot connect to ThingSpeak!
CONNECT
OK
これは、それが応答を受信する前に解析関数が終了していることを意味...、10秒のタイムアウトがあります現在指定されています。 20秒のタイムアウトがあっても、手動で実行すると約1秒で応答が到着するという事実にもかかわらず、同じことが起こります。
構文解析機能をテストするために、"80"
を検索してみましたが、これは応答の最初の行の最後に見つかったため真となりました。 "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"
)。
おそらくあなたが受け取るものは、 "(String :: endsWith')" 80 "ではなく" 80 "となります。 –
tofro