Ich habe meinen Arduino mit einem Bluetoothmodul HM-10 verbunden.
Beim Scan erhalte ich am Ende eine Stringvariable in meinem Programm, die das Ergebnis enthält.
Momentan sieht der Inhalt z.B. so aus.
OK+DISCSOK+DIS0:7C2F80C3912COK+NAME:Gigaset G-tag
Nun würde ich gerne diese Variable nach der Zeichenkette „7C2F80C3912“ durchsuchen
Um zu sehen ist das entsprechende Gerät anwesend.
Ich habe jetzt schon einiges gegoogelt, habe aber noch nix gefunden was funktioniert hätte.
Bisher habe ich immer mit einem Basic Dialekt gearbeitet und da war so etwas kein Problem.
Wie würdet ihr den so etwas lösen, das kann doch nicht so schwierig sein, oder ?
strstr() sollte dein Problem lösen können wenn Du char-Arrays verwendest.
Verwendest Du für die Strings den Arduino-Typ 'string' ist substring() das Mittel der Wahl.
MicroBahner: strstr() sollte dein Problem lösen können wenn Du char-Arrays verwendest.
Verwendest Du für die Strings den Arduino-Typ 'string' ist substring() das Mittel der Wahl.
Bei substring musst Du die Startposition wissen. Es gibt bessere Methoden zur Suche.
Wulewatsch:
... Bisher habe ich immer mit einem Basic Dialekt gearbeitet und da war so etwas kein Problem.
... Wie würdet ihr den so etwas lösen, das kann doch nicht so schwierig sein, oder ?
Naja ... Basic ... seit ich goto verachte, ist Basic für mich passé.
In C/C++ ist das, was Du möchtest eigentlich wirklich nicht schwierig. Der Algorithmus passt jedenfalls auf ein A4-Blatt. Aber weil ich bislang nur sehr wenig mit C-Strings (char-Arrays) zu tun hatte, weiß ich nicht, ob es eine passende Standardfunktion für die Substring-Suche gibt.
Es gibt hier aber ein gutes und kleines Beispiel für eine solche Suche.
Wulewatsch:
ich weiß das Basic etwas angestaubt klingt, aber Purebasic ist wirklich super.
Ein Freund von mir schwärmt manchmal immer noch von der „Final Cartridge“, die er für seinen C64 hatte. Aber der rechnet auch noch immer wieder Euro in D-Mark um.
Wulewatsch:
Ich hoffe das ich C noch lerne, ist in meinem Alter schon schwieriger.
Sei froh, dass Du alt genug geworden bist, um Dich noch mit C beschäftigen zu können
Wulewatsch:
Ich habe die Variable mit String E; definiert.
strstr () hat nicht funktioniert weil ich einen String nicht in einen Char laden kann, oder ähnlich.
Ach so. Das Programm im von Dir verlinkten Thread hat auf mich den Eindruck gemacht, als würde am Ende alles in einem C-String landen.
Du kannst ein String-Objekt zu einem C-String machen, indem Du die Methode c_str() verwendest.
Wulewatsch:
Wie würdet ihr den so etwas lösen, das kann doch nicht so schwierig sein, oder ?
Ich würde mich über jede Anregung freuen
Die String-in-String-Suche gehört zur Standard-Zeichenkettenverarbeitung.
Falls Du mit nullterminierten Strings (nullterminierte char-Arrays) der Programmiersprache C/C++ hantiert, dann heißt die Funktion zum Suchen eines Strings in einem anderen String strstr(). Diese liefert als Ergebnis einen Pointer zurück, oder NULL, falls der gesuchte String nicht enthalten ist.
Wenn Du aber mit diesem unsagbaren BULLSHIT vonString-Objekten arbeitest, dann wäre das die Funktion, um ein String-Objekt daraufhin zu testen, ob ein bestimmtes anderes String-Objekt oder ein anderer String darin enthalten ist:
Tommy56:
Da er in seinem Sketch mit der Stringklasse arbeitet, meinte ich eigentlich indexOf() als besser geeignet, als substring().
Upps, so genau hatte ich nicht hingeschaut, sorry :-[ . Und mit der Arduino Stringklasse hatte ich mich auch noch nicht näher beschäftigt, weil ich die für ausserst überflüssig halte
c_str() geht wie gesagt manchmal als Abkürzung um die oft völlig unpraktischen Methoden der String Klasse zu vermeiden. Jedenfalls wenn man nur Lese-Zugriff auf das interne Array braucht
indexOf() liefert -1 wenn der Teil-String nicht vorhanden ist. Also kann man abfragen ob der Rückgabewert > 0 ist. In dem Fall reicht das. Aber wenn danach mehr mit dem String machen will ist indexOf() nicht schön
ja indexOf passte am besten zu meinem bestehenden Code.
Mein Programm macht nun das was es soll.
Danke für eure Mühe.
Ein Char Array hatte ich mir auch noch einmal angeschaut.
Da muß ich aber wissen wie groß die Variable werden soll.
In dem verwendeten Fall kann das Bluetoothmodul bis zu 6 Gegenstellen identifizieren.
Ich müßte also einen relativ hohen Wert annehmen falls wirklich 6 Gegenstellen gefunden werden.
Wird nur eine gefunden wäre es unnütz groß dimensioniert.
So nun muß ich den Arduino nur noch an meine Homematic anschließen und eine Anwesenheitserkennung
sollte zuverlässig funktionieren.
Wulewatsch:
Ein Char Array hatte ich mir auch noch einmal angeschaut.
Da muß ich aber wissen wie groß die Variable werden soll.
Ja, C-Strings sind was die Zahl der Zeichen angeht ziemlich blöd zu handhaben. Deshalb habe ich bislang fast alles mit Strings gelöst, was sonst nie ein Problem war, weil ich sonst z. B. auf einem PC mit ein paar GB RAM programmiere. Da ist das mit den vielen bzw. wenigen Bytes keine so kritische Sache.
Serenifly:
indexOf() liefert -1 wenn der Teil-String nicht vorhanden ist. Also kann man abfragen ob der Rückgabewert > 0 ist. In dem Fall reicht das. Aber wenn danach mehr mit dem String machen will ist indexOf() nicht schön
Ich würde sagen >= 0. Der gesuchte Teilstring könnte ja am Anfang stehen.
Die vi-Referenztasse habe ich noch hier stehen. Das EMACS-Referenzfass passt nicht auf den Schreibtisch
Wie jemand mal irgendwo schrieb: Dem Betriebssystem EMACS fehlt nur eins: Ein brauchbarer Editor.