Arduino Ethernet Wert aus Text filtern, wie?

Hi, ich möchte gerne bei einem EthernetSketch aus der Ausgabe des Clienten:

+OK mailbox "xxxxxxxxxxx" has 8 messages (667372 octets) H miweb002

Die 8 bzw. andere Zahlen herausfiltern. Kann ich mit Bitoperatoren alles bis zur Zahl entfernen, dann diese einlesen und den Rest mit der flush() Funktion löschen oder geht das besser? Gruß legotechnicus

legotechnicus: ich möchte gerne bei einem EthernetSketch aus der Ausgabe des Clienten:

+OK mailbox "xxxxxxxxxxx" has 8 messages (667372 octets) H miweb002

Die 8 bzw. andere Zahlen herausfiltern.

Wenn Du die Zeile in ein char-Array namens "buf" eingelesen hast und vor der Zahl immer ein Prefix von genau 30 Zeichen steht, ziehst Du die Nummer raus mit:

int number=atoi(buf+30);

Danke, das habe ich auch überlegt. Doch was ist wenn es z.B. 12 ist. Dann wird nur die 1 geholt aber nicht die 2. Gibt es eine Methode mit der ich prüfen kann ob das nächste Zeichen eine Zahl ist? Gruß legotechnicus

legotechnicus:
Doch was ist wenn es z.B. 12 ist. Dann wird nur die 1 geholt aber nicht die 2.

Falsch.

Die “atoi” Funktion versagt nur bei Zahlen, die den Integer-Wertebereich sprengen, also größer sind, und liefert dann falsche Werte zurück. Ansonsten wird die korrekte Integer-Zahl zurückgeliefert.

legotechnicus:
Gibt es eine Methode mit der ich prüfen kann ob das nächste Zeichen eine Zahl ist?

Wenn Du nach einem Zeichen fragst, dann meinst Du “Ziffer”?

Da die Ziffern 0 bis 9 fortlaufende ASCII-Codes haben, brauchst Du nur vergleichen, ob ein Zeichen >=‘0’ und <=‘9’ ist.
Wenn ja, dann ist es eine Ziffer.

Vielen dank an die Erklärung. Jetzt habe ich den Code so geschrieben dass es funktionieren [u]müsste[/u]. Aber natürlich wird buf nicht beschrieben. Der Code:

//Variablen
char buf[100];
int index=0;

//Code .................

while(client.available()) {
        char c = client.read();
        Serial.print(c);
        buf[index]=c;
        index+1;
   }
   Serial.println(buf);
   int number=atoi(buf+30);
   Serial.println(number);

Beim buf werden zwei freie Zeilen ausgegeben und als number immer 0 Wo ist der Fehler. Wahrscheinlich wird nichts in buf geschrieben aber wieso?

legotechnicus:
Vielen dank an die Erklärung. Jetzt habe ich den Code so geschrieben dass es funktionieren müsste.

Soll das ein modifizierter Webserver-Sketch zur Ethernet-Library werden?

Anyway, ich sehe in Deinem kurzen Codeabschnitt drei Problembereiche:

  1. Problem:
    Der char-buffer sollte nach jedem Connect und zu Beginn jeder neuen Zeile ausgenullt werden, damit nach Empfang einer Zeile auf jeden Fall ein abschließendes Nullzeichen enthalten ist. Beispiel für das Ausnullen nach dem Connect:
memset(buf,0,sizeof(buf));
index=0;
while(client.available()) { ...
  1. Problem:
    Mit “index+1;” wird der Zähler nicht erhöht.

Korrekt wären:

index++;

oder

index=index+1;

oder

index+=1;
  1. Schreiben über das Pufferende
    Wenn das Inkrementieren des Zählers funktioniert, würde beim Eintreffen überlanger Zeilen hinter das Pufferende geschrieben werden, wenn der Schreibindex größer wird als die Puffergröße.

Das solltest Du vermeiden, indem der Index nur dann inkrementiert wird, wenn noch Platz im Puffer ist. Z.B. mit:

if (index<sizeof(buf)-1) index++;

Es soll ein Sketch werden, der später über eine Segmentanzeige die Anzahl der Emails im Postfach anzeigt. Zu eins) Ok wieder was hinzu gelernt, danke. Zu zwei) Denn Fehler habe ich übersehen (war wahrscheinlich zu schnell) Der Kompilier hat's durchgewunken :( Zu drei) Wird eingebaut.

Danke für die großartige Hilfe.