Forum: Mikrocontroller und Digitale Elektronik ESP8266 Senden von AT Befehlen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thom E. (chrises)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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....

: Bearbeitet durch User
von A.. P. (arnonym)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Arduino Fanboy D. (ufuf)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.