ja, so schrittweise habe ich es ja prinzipiell auch gemacht in meinen Funktionen, ich meinte aber fertige Arduino-Funktionen, die prinzipiell alles komplett erledigen ( allerdings bei mir mit ISO C ctrings, nicht C++ Strings)
Mit String-Funktionen.
Normalerweise geht das sinngemäß:
1. Liefere erstes Vorkommen eines Zeichens in Zeichenkette
2. extrahiere aus erster Zeichenkette eine Neue, von Position bis Position
3. Suche in neuer Zeichenkette nach Zeichen, dass das Ende markiert
4. extrahiere vom Anfang der Zeichenkette bis zu der Position des Endezeichens
5. gewünschter Inhalt ist extrahiert
Zwei Methoden für Strings habe ich für Arduino schon gefunden:
- indexOf()
- lastIndexOf()
interessant auch:
- substring()
indexOf() findet die Position eines gesuchten Zeichens
substring() extrahiert eine Zeichenkette anhand einer Start- und Endposition
Arduino.cc, TUTORIALS > Built-In Examples > 08.Strings
Geändert von Moppi (23.10.2019 um 22:07 Uhr)
ja, so schrittweise habe ich es ja prinzipiell auch gemacht in meinen Funktionen, ich meinte aber fertige Arduino-Funktionen, die prinzipiell alles komplett erledigen ( allerdings bei mir mit ISO C ctrings, nicht C++ Strings)
Musst Du eine Funktion schreiben, dies das dann erledigt, wie Du das brauchst. Oder vielleicht gibt es eine fertige Bibliothek schon?
Braucht man aber auch nicht wirklich. Wenn man die Zeichenkette kennt, die kommt, also weiß, wo Start- und Endzeichen sind, kann man so einen Ausdruck in einer Codezeile formulieren.
MfG
zum Beispiel:
Wenn der String so vom Browser, per GET, übermittelt wird:
Code:?uname=...&upwd=...
Dann kann die ganze Zeile eingelesen werden mit:
Und das Extrahieren der Informationen in der richtigen Reihenfolge, wenn nur zwei Felder existieren, könnte dann so funktionieren:Code:String rS = client.readStringUntil('\r');
Sollen die Feldbezeichnungen überprüft werden, stehen die Feldbezeichnungen und deren inhalte (upwd=...) in anderer Reihenfolge, soll die Funktion Inhalte, beliebig übermittelter Formularfelder, extrahieren? - Dann wird das Vorgehen natürlich komplizierter.Code:String website_uname = rS.substring(rS.indexOf('=')+1,rS.indexOf('&')); String website_upwd = rS.substring(rS.lastIndexOf('=')+1);
MfG
PS: der Code ist nur beispielhaft, habe nicht verifiziert, ob er so fehlerfrei compiliert wird. Soll nur der Anschauung dienen, wie es gemeint ist.
Geändert von Moppi (24.10.2019 um 07:24 Uhr)
nein, es ging doch nicht darum, so eine Funktion aus Einzel-Schritten neu zu schreiben, genau das habe ich doch bereits getan (cstringarg() ).
Es ging darum, ob Arduino so etwas wie mein cstringarg() bereits fertig für diese und ähnliche Zwecke zur Verfügung stellt, das würde es für komplette Anfänger einfacher machen und es müsste nicht jeder das Rad neu erfinden.
Ich hatte Dich schon richtig verstanden, ich kenne doch Deinen Quellcode mit dem cstringarg() wo wir lange dran gebastelt haben, weil da auch was im argen war. Da kamen auch noch in andern Foren Fragen dazu auf.
Anfänger und Arduino-"Bordmittel", da würde ich schon so etwas hernehmen: rS.substring(rS.indexOf('=')+1,rS.indexOf('&'));
Ist auch für Anfänger einfach zu verstehen, ist ja nichts besonderes dran. Das Rad ist ja damit schon erfunden. Das sind gängige Lösungen, die Du überall antriffst (C++,Java,JavaScript ..).
Man muss noch was anderes bedenken:
Für so kleine Aufgaben lohnt es nicht, viel Overhead dazu zu packen, was den Gesamtquellcode und das fertige Kompilat unnötig aufblähen würde. Solche Universalmethoden (bei Objekten) belegen eine Menge Platz, nur, damit es einen kleinen Tacken bequemer ist. Damit belegst Du dann ein Vielfaches an Speicherplatz mehr, mal von der Rechenzeit / Taktzyklen abgesehen. Für seine eigenen Zwecke kann man das in eine Funktion packen, um das nicht immer neu schreiben zu müssen. Allerdings ist der Funktionsaufruf, in Gänze, dann vermutlich kaum kürzer.
MfG
mit cstringarg() lag nichts "m Argen", das funktionierte von Anfang an bis jetzt einwandfrei, und es kann ja vielfache verschiedene Variablen über ihre verschiedenen Namen und samt ihrer verschiedenen Werte aus sehr langen zusammengesetzten cstrings herausextrahieren. Bei meinem Ursprungscode war prinzipiell der einzige Knackpunkt, dass zusätzlich eine Längenübermittlung beim Lesen und senden eines hthml-Inputstrings nötig ist.
Man braucht so etwas wie cstringarg() allerdings ständig, auch z.B. wenn man z.B. zwischen esp-Master und mehreren esp clients Variablenwerte hin und her schicken will.
Aber ich verstehe deine Antwort dann also richtig als "nein, du kennst auch noch keine komplette, fertige Funktion dafür in einer existierenden Arduino-Lib"...
Nein, ich kenne keine fertigen Bibliotheken, weil ich bis jetzt keine brauchte, sie also auch nie gesucht habe.
Da Du aber nach Arduino-Funktionen fragtest, kann man wohl nur die String-Methoden nennen, die ermöglichen Strings zu durchsuchen und Teile daraus zu extrahieren.
MfG
nein, denn es ging ja in meiner Frage um eine fertige Funktion, die alles mit Suchen und Extrahieren komplett macht.
Und jetzt? Was soll daraus werden? Wie es soll es weiter gehen?
MfG
Lesezeichen