strcontains was not declared

Hallo Leute,

Ich habe mir einen Web-Server mit AJAX erstellt, in dem ich mir einen parser geschrieben habe, um an die Daten vom Browser zu kommen. Eine Zeile lautet z.b.:

if (StrContains(serialBuffer, “LED1”)){ …}

und funktioniert auf dem Web-Server wunderbar.

jetzt schicke ich meine Daten mit

Serial.print " &LED1=";
Serial.print"LED_state[0]";
Serial.print " &LED2=";
Serial.print"LED_state[1]";
Serial.print " &LED3=";
Serial.print"LED_state[2]";
Serial.print " &LED4=";
Serial.print"LED_state[3]";
Serial.println();

über RX/TX weiter an einen zweiten Arduino. Auf diesem möchte ich jetzt zum Daten auslesen meinen vorhandenen parser verwenden um wieder an die Daten zu kommen.

Die empfangenen Daten lasse ich mir auf der Empfängerseite mit folgendem Code anzeigen:

#include <SPI.h>
const int SERIAL_BUFFER_SIZE = 200;
char serialBuffer[SERIAL_BUFFER_SIZE];
bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
    else if (c == '\n' && index > 0)
    {
      serialBuffer[index] = '\0';
      index = 0;
      return true;
    }
  }
  return false;
}

    
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (readSerial(Serial))
  {
    Serial.print("Read: ");
    Serial.println(serialBuffer);
  }
 parseSerial(serialBuffer);
}

void parseSerial(char* str)
{
  
  char* ptr = strchr(str, '&');
  
// if (StrContains(serialBuffer, "LED1"))
{
  if (strncasecmp(ptr + 1, "LED1", 4) == 0 )
    {
      int value_1 = atoi(ptr + 3);
      Serial.println(value_1);  
    }
}
}

Der Empfänger gibt dann zur Kontrolle die empfangenen Daten wie folgt aus

Read: &LED1=0 &LED2=1 &LED3=1 &LED4=0
0
0
0
0
0
.

Wenn ich in dem code die zeile

if (StrContains(serialBuffer, “LED1”))

verwenden möchte, bekomme ich beim kompilieren die Fehlermeldung,

StrContains was not declared in this scope :frowning:

Auch andere Befehle wie IfCurrentLineIsBlank werden als not declared bemängelt.

warum läuft dieser Befehl auf dem Web-Server, aber auf meinem Empfänger nicht? was muss ich machen, um diesen Befehl verwenden zu können (und damit meinen vorhandenen Parser) bzw. welche alternative gibt es um an meine Daten zu kommen?

vielen dank
celle

mache mal String Contains

Wo hast du den Code mit StrContains() her? Das sind irgendwelche selbst-definierten Funktionen die du vielleicht mal irgendwo in einem Code gesehen hast. Wenn du die nicht in deinem Code hast existieren die natürlich nicht. Die braucht aber auch kein Mensch!!

Am einfachsten ist es du schickst diese Daten nicht in einem String, sondern jedes Paket mit einem LF für sich am Ende:

Serial.print("&LED1=");
Serial.println("LED_state[0]");

Serial.print("&LED2=");
Serial.println("LED_state[1]");

Dann kannst du jeden String für sich mit strncmp() oder strstr() behandeln. Ich habe dir in dem anderen Thread Seiten verlinkt wie diese Funktionen zu verwenden sind.

@ardubu
Verwirre ihn bitte nicht noch mehr. Es werden hier keine String Objekte verwendet!

Sorry, ich hatte nur die Fehlermeldung gelesen, und dachte er hätte einen Schreibfehler im Sketch

Hallo,
und vielen Dank für die Erklärung.

Wo ich den Befehl herhabe?
Ich habe mir aus dem www einen "eth_websrv_SD_Ajax_in_out" - Beispiel - Code kopiert. Da war der Befehl schon drin.

Habe gerade festgestellt, das es unterschiedliche Arduino Ajax Web - Server Varianten im www gibt und ich eine erwischt habe, die wohl schon modifiziert wurde.

erst habe ich bei den befehlen gedacht, das es an unterschiedlichen Betriebssystemen liegt: auf meinem Notebook programmiere ich den Webserver unter Win10, der "Empfänger" hängt an einem Linux Rechner.

Ich werde jetzt meine gesammelten Informationen nutzen, und alles noch mal von Grund auf überprüfen und ggf. korrigieren. Scheint ja doch einiges schiefgegangen zu sein, wo ich mir am Anfang gar nicht im klaren drüber war.

Mfg
celle

da bin ich nochmal,

ich habe grade nochmal nachgeguckt: auf "Starting electronics" ist ein Arduino SD Card Ajax Web Server Tutorial.

In Part 13 gibt es dann einen Web-Server mit SD Card komplett fertig. In diesem kommt auf einmal if (StrContains...) vor. Das komische dabei ist, in Part 5 kommt dies nicht vor. da heißt es if (...., indexOf.....).

.... und das soll ein Anfänger alles verstehen ::slight_smile:

Ist ja auch egal, wenn es nicht 'declared' ist, kann ich es nicht nutzen. dann lern ich jetzt eben wie ich strings bearbeite in C.

vielen dank nochmal an Serenifly für die links, die sind mir auf jedenfall eine hilfe.

ihr werdet noch von mir hören :wink:
celle

Ich habe raus gefunden, wo der Befehl herkommt :slight_smile:

Ganz am Ende des Sketches steht:

char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;    
}

Jetzt hab ich dazu nur noch eine Frage, da es mir noch nicht klar ist:

bisher kenn ich es so, das ich im loop() die Reihenfolge der aufzurufenden voids mit:

SetLED();
SetPWM();

aufrufe und die jeweiligen voids dann

void SetLED ()
void SetPWM()

heißen.

was haben die Befehle in den Klammern für eine Bedeutung?

mir reichen auch links (am besten deutschsprachig) wo ich eine Erklärung finde.

Vielen Dank

der aufzurufenden voids der aufzurufenden voids

Das sind keine Voids!
Es gibt keine Voids!

Das sind Funktionen!

Eine Funktions Deklaration:

void SetPWM();

Eine Funktions Definition:

void SetPWM()
{
  // tuwas
}

Ein Funktions Aufruf:

SetPWM();

Und wenn da void in der Definition/Deklaration steht, ist damit nur gemeint, dass diese Funktion keinen Rückgabeparameter hat.

Ich sehe immer noch nicht weshalb man sich da selbst was schreiben muss wenn es strstr() gibt. Gibt NULL zurück wenn der Teil-String nicht enthalten ist und einen Zeiger auf den Anfang des Teil-Strings im durchsuchten String wenn ja. Wenn man den Zeiger nicht braucht kann man es also genauso direkt in einer if-Abfrage verwenden.

Das ist außerdem nicht schön geschrieben. strlen() braucht man bei sowas wegen der Null-Terminierung nicht.

Es ist nicht falsch. Also wenn du es magst, kannst du es lassen. Aber wenn du mal über Code Kopieren hinauskommen willst, musst du lernen dass es für sowas fertige Funktionen gibt.

@ Serenifly

das mit den strings zerlegen in C ist gar nicht so schwer. dank deiner links hab ich mich da schnell eingefuchst und mir für meinen Empfänger einen Parser geschrieben.

Es ist halt nur so, wenn man am lernen ist und trifft dabei auf "Befehle" die dann nicht akzeptiert werden, fragt man sich schon, warum das in dem einen code geht und in dem anderen nicht. Am meisten freu ich mich dann, wenn es dafür eine Erklärung gibt :slight_smile:

@combie

und was bedeutet dann das char* str in den Klammern hinter einer Funktion wie z.b.

void parseString(char* str)
{
// tu was
}

celle

und was bedeutet dann das char* str in den Klammern

Diese Funktion erwartet, als Parameter, einen Zeiger auf ein Char.

Dieser Buchstabe kann auch der erste eines ganzen Strings sein.

In C sind Strings Null-terminierte char Arrays. Und Array Variablen sind wiederum Zeiger auf auf das erste Element.

Wenn man also das hat:

char buffer[20];

Und dieses Array an eine Funktion übergeben will, ist der Parameter ein char*. Zeiger auf char.