Esp8266 & String untersuchen

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Moin moin,

Ich möchte von unterwegs aus ein paar Sachen zuhause steuern, quasi wie Internet. Das ESP8266 ist ein WLAN Modul, was es mir ermöglicht einen sehr günstigen AccesPoint zu eröffnen.

Nun bekomme ich via. Rs232 (TTL Pegel) immer einen String als Antwort auf Befehle oder halt meine empfangenen Datenpakete. Diese sind immer unterschiedlich lang und anders aufgebaut.

Meine Frage nun, wie werte / untersuche ich die strings am besten?

In einem Array speichern und dann in einer while Schleife, das Array parsen?
 
Hmmmm..,
Frage : wieviel Zeit verstreicht zwischen den einzelnen Telegrammen?

Jede telegrammgruppe erhaelt am Anfang eine eindeutige Nummer, anhand dieser dann entsprechend gepasst werden kann.
Zwischen den einzelnen Daten ein eindeutiges Trennzeichen vereinbaren.
Alle Daten im string Format senden. Checksumme vielleicht einbauen.
Falls die Telegrammen im Bull kommen, dann Array entsprechend gross wählen. Ein eindeutiges endezeichen als Schluss der uebermittlung waehlen
MfG
Addi
 
Danke für deine Vorschläge. Leier bin ich an das Protokoll vom ESP gebunden. Das mit den Trennzeichen ist eine gute Idee. Muss mir mal die einzelnen Befehle anschauen, was ich dort so aus gespuckt bekomme.
 
hmm,
du kannst strings ohne vorgegebene Formatierung senden.
Mein vorschlag bzgl. aufbau wäre:

nnn#data#data#etc.#chksum

nnn= telegrammnr
# = separator
data = beliebige Daten im stringformat
chksum = checksum über den betr. string

als ende der Sendung würde ich 99 verwenden

99#chksum


mfg
addi
 
Ich kann mir das Protokoll nicht aussuchen.

Du meinst CRC? Das habe ich noch nicht ganz verstanden wie das berechnet wird. Bringt mir jetzt in diesem Bezug aber auch nichts, da es ein festes Protokoll seitens ESP ist.
 
ich meinte crc über die Daten im string, die dann hinten an string angehängt wird. eben ein Feature um sicher zu sein, das nichts verloren geht
 
man könnte auch einfach die Quersumme aller zeichen im string berechnen und das dann als checksumme verwenden.
denn string ist string für den eps
 
Du verstehst aber schon, dass ich das alles nicht mit einbauen kann?
 
eben nice to have. Interpretation der Daten und Beschränkung aufs Notwendige obliegt dem Designer und Codierer
 
So wie ich es verstehe, ist das Protokoll fest vorgegeben. Hier gibt es also keine Freiheiten, eigene Features einzubauen.

Kannst du mal zwei drei Beispiele für eine Übertragung nennen (ich möchte nun nicht das Datenblatt suchen und durcharbeiten).
 
Wenn ich zuhause bin mache ich das.
 
Hier ist mal ein Mitschnitt.
 

Anhänge

  • i31^cimgpsh_orig.png
    i31^cimgpsh_orig.png
    43 KB · Aufrufe: 10
Hier ist mal ein Mitschnitt.

Damit kann ich leider nicht so viel anfangen. Du sendest anscheinend ein AT Kommando und das Modul bestätigt mit OK, mehr sieht man nicht.

Dir geht es wahrscheinlich erst mal darum, die empfangenen Daten auszuwerten. Im oberen Beispiel ist sicher die Anzahl der Zeichen konstant, das "OK" läßt sich somit auswerten. Ein paar Byte in ein Array laden und dann einen String Compare mit zu erwartenden Daten machen, dann entsprechend auf das Ergebnis reagieren.
 
addi meinte wohl eher die zu sendenden/empfangenen Nutzdaten, und nicht die modemähnlichen AT-Kommandos und deren Auswertung. Janiiix hingegen scheint bereits eine Ebene tiefer - qausi beim "Gerätetreiber" (Hardware Abstraction Layer ??) Probleme zu haben...
 
Es geht mir einfach darum, wie ich am besten die eingehenden antworten auswerten tue. Es geht weder um ein Protokoll noch um crc... Wollte einfach nur wissen wie ich am besten und am schnellsten den ganzen String nach Informationen untersuchen kann.
 
Indem Du die einzelnen Zeichen der beiden Strings miteinander vergleichst (also die Bytes)... in einer Hochsprache wie C (AVR-C??) gibt's dafür sicher entsprechende String-Vergleichs-Routinen. Das könnte von "Die Strings sind gleich/verschieden" über "Die Strings sind gleich bis zum n'tenZeichen" bis zu "String x ist in String y an Stelle n enthalten" reichen...

In BASCOM würde ich's mit INSTR versuchen
Gibt's in AVR-C denn keine ähnliche Hilfe, Dirk??
 
Es gibt dafür fertige Funktionen. Möchte es aber selber mal programmieren und nicht immer alles vorhandene verwenden.
 
Du solltest eine Art StringCompare inzwischen selber hinbekommen ;)

Du könntest aber auch zum Beispiel strcmp_P aus pgmspace.h verwenden. Vorteil ist, dass die Strings nur im Flash Memory liegen. Alternativ zu PSTR könntest du auch ein Array von möglichen Strings in das Flash Memory legen und mit strcmp_P in einer Schleife vergleichen.


CodeBox C
#include <avr/pgmspace.h>

uint8_t inbuffer[20];
//...

if (strcmp_P (inbuffer, PSTR("OK")) == 0)
{
}
 
Hm, ich habe jetzt mal versucht in der main folgendes auf zu rufen...



CodeBox C


  uart1_puts("AT\r\n");
  uart_puts(ReBuff.Buff);

[B]/* Das natürlich nicht in der main! */[/B]

ISR(UART1_RECEIVE_INTERRUPT)
/*************************************************************************
Function: UART1 Receive Complete interrupt
Purpose:  called when the UART1 has received a character
**************************************************************************/
{
   ReBuff.Cnt++;
   if (ReBuff.Cnt > 20)
   {
     ReBuff.Cnt = 0;
   }
   ReBuff.Buff[ReBuff.Cnt] = UART1_DATA;
}


Leider kommt da nichts rein, erst wenn ich es in der while() zyklisch aufrufe. Woran kann das liegen?
 
Leider kommt da nichts rein, erst wenn ich es in der while() zyklisch aufrufe. Woran kann das liegen?

Ich vermute, es dauer erst einen Moment, bis von der Gegenstelle eine Antwort rein kommt.

Hier sendest du das Commando (über USART1 zB) und und möchtest sofort die Antwort auf das Kommando ausgeben (über USART0 zB). Der Empfangsbuffer wird hier noch leer sein:



CodeBox C
uart1_puts("AT\r\n");
uart_puts(ReBuff.Buff);


Sendest du den Ihnalt des Buffers ständig in der while(1) Schleife, sind da natürlich irgendwann Daten im Buffer. Du könntest eventuell im ReceiveInterrupt des USART1 auf ein String-Ende prüfen. Falls String-Ende ("\r\n" eventuell) erkannt wurde, setzt du ein Flag, was dem Hauptprogramm mitteilt, dass gültige Daten im Empfangsbuffer sind.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)