Forum: Mikrocontroller und Digitale Elektronik ESP8266 Senden von AT Befehlen


von Thom E. (chrises)


Lesenswert?

Hallo liebes Forum,

ich hab eine Frage bezüglich des sendens von AT Befehlen und einer 
Wartezeit. Das ESP Antwortet auf die meisten AT Befehle nach einer 
gewissen Zeit mit "OK", daher würde ich auf diese Antwort gerne in einer 
Funktion warten, um nicht immer eine fixe Wartezeit, sondern nur eine 
maximale Wartezeit anzugeben.
Die Funktion soll dann beendet werden, wenn die IF-Bedingung zutrifft 
bzw wenn das ESP die Antwort "OK" gesendet hat.

Der Empfangsbuffer wird durch eine IRQ beschrieben.
Der folgende Code beendet leider nicht richtig, habe ich etwas 
übersehen?

LG Thom
1
int Write_ATCMD(UART_HandleTypeDef *huart,uint8_t *ATCMD, uint32_t Wartezeit)
2
{
3
  uint32_t tickstart = 0;
4
  uint32_t i;
5
  HAL_UART_Transmit(&huart6,ATCMD,strlen(ATCMD),1000);
6
  tickstart = HAL_GetTick();
7
  while((HAL_GetTick() - tickstart) < Wartezeit)
8
  {
9
    if(strstr(empfangsbuffer,"OK"))
10
    {
11
      return 1;
12
    }
13
14
  }
15
  return 0;
16
}

von Stefan F. (Gast)


Lesenswert?

> Der folgende Code beendet leider nicht richtig,
> habe ich etwas übersehen?

Beschreibe das Fehlverhalten genauer und untersuche, was im Fehlerfall 
in deinem Puffer drin steht.

von Einer K. (Gast)


Lesenswert?

Thom E. schrieb:
> ich hab eine Frage bezüglich des sendens von AT Befehlen und einer
> Wartezeit. Das ESP Antwortet auf die meisten AT Befehle nach einer
> gewissen Zeit mit "OK", daher würde ich auf diese Antwort gerne in einer
> Funktion warten, um nicht immer eine fixe Wartezeit, sondern nur eine
> maximale Wartezeit anzugeben.
> Die Funktion soll dann beendet werden, wenn die IF-Bedingung zutrifft
> bzw wenn das ESP die Antwort "OK" gesendet hat.

Ich glaube, dass du einen einfachen endlichen Automaten bauen möchtest.
Um, das Ganze dann nebenläufig abzuhandeln....

von A.. P. (arnonym)


Lesenswert?

Ich kann dir den ESP Parser von Tilen Majerle sehr empfehlen:
https://github.com/MaJerle/ESP8266_AT_Commands_parser

Diese AT-Firmware ist der größte Schmu und verdient nicht mehr 
Aufmerksamtkeit, als nur irgend nötig. Daher ist diese Bibliothek 
wirklich ein Segen, um den ESP schnell sinnvoll nutzbar zu machen.

Gruß

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Diese AT-Firmware ist der größte Schmu und verdient nicht mehr
> Aufmerksamtkeit, als nur irgend nötig.

Erzähle das mal den Herstellern von GSM Modems und Bluetooth Modulen. 
Die Firmware hat IMO durchaus ihre Daseinsberechtigung. Das Benutzen der 
AT-Schnittstelle ist auch gar nicht großartig kompliziert.

Es ist eher eine Frage, ob man asynchrone Schnittstellen mag bzw. 
beherrscht.

von Einer K. (Gast)


Lesenswert?

Stefan U. schrieb:
> Erzähle das mal den Herstellern von GSM Modems und Bluetooth Modulen.

Nee...
Die weit verbreitete Ablehnung der AT Software ist schon ESP bezogen.

Inkompatibilitäten!
Über die Jahre, unterschiedliche Zeilenenden.
Unterschiedliche Baudraten, nach einem Reset.
Unterschiedliches Antwortverhalten.
Differenzen im Befehlssatz.
Versionsunterschiede, ohne Ende.
Dazu noch einige Instabilitäten.

Das ist eine kleine Hölle.

Und für diese Hölle kann man nicht irgendwelche Hersteller von Bluetooth 
Modulen verantwortlich machen.
Dieses Ei haben sich die Espressif Leute selber ans Knie genagelt.

von Thom E. (chrises)


Lesenswert?

Hallo zusammen, ich glaube das Problem ist nur meine Verwendung der 
HAL-Funktionen, nicht die AT-Befehle an sich, wenn ich eine fixe 
Wartezeit einsetzte, funktioniert ja alles.
Die Frage ist nur, ob ich es so machen kann, dass die Funktion sofort 
beendet, wenn im Empfangsbuffer mittels strstr() zum Beispiel "OK" 
gefunden wird und ansonsten die maximale Zeit warte.

Die Funktion habe ich von HAL_Delay übernommen. Und einfach in deren 
while{}- Schleife die strstr() eingebaut. Vermutlich fehlt da etwas.

Liebe Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.