Hallo Community,
ich habe in meinem "eigentlich" fertigen Projekt ein Problem, was ich mir nicht erklären kann. Es hat alles funktioniert und geht plötzlich nicht mehr. Ich empfange BT Daten von einer App. Das Programm reagiert aber nicht. Ich konnte das Problem durch Tests eingrenzen.
Serial.println(bluetooth.getValueByIndex(1));
Serial.println(bluetooth.getValueByIndex(2));
if (bluetooth.getValueByIndex(1) == "C") {
if (bluetooth.getValueByIndex(2) == "true") {
calibrate();
};
};
Wenn ich das Coding laufen lasse sehe ich im Seriellen Monitor die empfangen BT Daten. Das ist alles soweit korrekt und funktioniert wie es sein soll.
Das hier sehe ich im Seriellen Monitor. Also die empfangenen Daten
C
true
Wenn ich nun die Serial.println Anweisung in den IF Block schreibe wird nichts mehr ausgegeben. Die Anweisungen werden nicht erreicht. Was ist an dem IF Befehl falsch? Der hat übrigens über Monate so funktioniert und auch die Kommunikation zwischen App und MC. Warum erkennt erkennt er nicht, dass IF( bluetooth.getValueByIndex(1) == "C") ist, und läuft somit nicht in den IF Block rein. Die Anweisung calibrate() wird somit nicht ausgeführt.
Mir ist absolut unklar, warum das nicht mehr geht. Ich habe an diesem Codingblock nichts verändert. Auch in der App nicht was das senden betrifft. Ich sehe ja auch, dass die Daten richtig übergeben werden und auch ankommen. Nur der IF Block wird nicht durchlaufen... Heul
D.h wenn ich mein Coding so ändere läuft er in den IF-Block. Was mich nun interessieren würde ist, warum das die ganze Zeit funktioniert hat und plötzlich nicht mehr und ob man das irgendwie auch kürzer programmieren / schreiben kann. Also es muss an einem Endezeichen z.B. \n oder \0 in den Daten liegen. Gibt es so etwas wie if(xyz == "*true*") (wildcards) bzw. contains pattern?
if (stringContains(bluetooth.getValueByIndex(1), "C")){
Serial.println(bluetooth.getValueByIndex(1));
Serial.println(bluetooth.getValueByIndex(2));
if (bluetooth.getValueByIndex(2) == "true") {
calibrate();
};
};
Augenscheinlich liefert es mir genau das was ich wünsche. Also das was ich im Seriellen Monitor sehe ist genau richtig. Nur die Abfrage geht halt nicht mehr.
Da ich nicht weiß, welche Lib Du verwendest und damit nicht weiß, was getValueByIndex zurück liefert, kann ich nur vermuten, dass Du Char-Arrays mit == vergleichen willst. In diesem Fall chau Dir strcmp und strncmp an.
Wenn es Einzelzeichen zurück liefert, bist Du auf dem falschen Weg.
das ist eine selbst geschriebene Funktion. nicht aus einer lIb. Es sind Char Arrays. Ich schaue mir mal die Befehle von dir an. die sehen vielversprechend aus. danke
Ich baue es so um. Strcmp hat leider nicht wie erwartet funktioniert. Das OR im IF ist eigentlich unnötig, aber ich will die alte Logik welche die ganze Zeit funktioniert hat, nicht wegwerfen. So wie im Folgenden geht es jedenfalls wieder.
if (stringContains(bluetooth.getValueByIndex(1), "C") || bluetooth.getValueByIndex(1) == "C")
if (stringContains(bluetooth.getValueByIndex(2), "true") || bluetooth.getValueByIndex(2) == "true")
calibrate();
Natürlich darfst du mich für etwas blöd halten.
Allerdings scheint mir, dass du weder den Sinn meiner Frage, noch die Tiefe meiner Ansage verstanden hast.
Wirklich kein Interesse am "Warum?"?
z.B. Warum versagt der Vergleich?
Lass uns bitte nicht wieder so eine Diskussion wie das letzte mal führen. Ich weiß nicht was du meinst und auch nicht was ich fragen soll, denn ich habe doch schon einleitend gefragt, warum der Vergleich nicht geht?! Das ist doch der Sinn meines Posts. Wieso glaubst du das ich dich für blöd halte? Was habe ich denn schon wieder geschrieben, was du in den falschen Hals bekommen hast? Ganz ehrlich: ich weiß es nicht
Hier meine Frage:
Also wenn du es mir erklären kannst würd ich mich wirklich freuen. Und das hatte ich eigentlich auch irgendwo geschrieben, nachdem ich eine Lösung gefunden habe: ich würde gern verstehen, warum es die ganze Zeit funktioniert hat und plötzlich nicht mehr geht.
Die C-Strings sollen als const char* deklariert werden, denn sie werden (und dürfen) nicht verändert werden
Der Index muss nicht bis len laufen, sondern nur bis len - Länge des Suchstrings - wenn man es bis dahin nicht gefunden hat, wird das später auch nix mehr
Man muss das nicht selbst implemetieren, denn es gibt bereits eine Funktion in der C-Library, die genau die Anforderung "string contains" erfüllt: strstr
Danke für die Info. Schaue ich mir an. Die Logik habe ich, ohne es mir im Detail anzuschauen, aus einem Forumbeitrag genommen. Link ist angegeben. Versuche es zu optimieren / zu korrigieren. Wird aber heute vermutlich nichts mehr.
Schmeiß es weg und nimm strstr oder - besser - strcmp bzw. strncmp wie @Tommy56 schrub.
Wenn Deine Zeichenketten ordentliche, mit \0 abgeschlossen Character-Arrays sind, die aus nix weiter als den gesuchten "C" bzw. "true" bestehen, muss das funktionieren.
Fehlersuchhilfe:
Die Zeichenketten als HEX-Werte ausgeben, dann sieht man unerwünschte Sonderzeichen
Der Returnwert von strcmp ist im Erfolgsfall 0 - also wird ein if (!strcmp(...)) die gewünschte Abzweigung nehmen.
Das ist das finale Ziel. Zurück zum Standard. Das habe ich auch gemeint, nicht dass ich unbedingt die gefundene Funktion nehmen will. Ganz im Gegenteil. Jetzt ging es mir primär darum, mein "Spiel" wieder funktionsfähig zu machen um auch zu sehen, dass es nur diese "Kleinigkeit" ist und der ganze Rest noch funktioniert.
Du wünscht dir, ganz offensichtlich, dass es einen String liefert, den du vergleichen kannst.
Das tut es aber nicht!
In der natürlichen Folge, dieses unnötigen Irrtums, vergleichst du zwei Zeiger, die vielleicht auf das gleiche zeigen, aber nicht auf das selbe..
Mein Versuch deine aufmerksam auf diesen Umstand zu richten, scheint irgendwie nicht gelungen zu sein.
Auch ist es mir absolut rätselhaft warum du geheim halten möchtest, wo bluetooth.getValueByIndex her stammt und wie es aussieht,
Ja, verstehe ich auch nicht. Ich hatte auch nach einem Link zur Lib gefragt und das wurde ignoriert.
Ich werde wohl den TO bei diesem Verhalten in der Zukunft komplett ignorieren.
@Tommy56 Es tut mir leid... das mit dem Link zur Lib habe ich nicht gelesen. Es ist auch keine Lib im Sinne wie ich es kenne (die ich mir bei GitHub oder über die IDE runterlade und installiere) sondern eine selbst gebaute Funktion (ein Parser für ein eigenes Protokoll). Ich habe diese Funktion nicht in Frage gestellt, da diese seit Monaten unverändert ist und funktioniert hat. Es muss an der App liegen, dass ich hier jetzt etwas anders schicke als vorher. Auch hier habe ich nichts an der Logik verändert sondern nur an der Optik. Es ist nicht mein Wille irgendetwas geheim zu halten. Ich habe es schlicht überlesen, habe auch keinen Link sondern hätte das Coding posten müssen / können, was ich auf Grund der Umstände überhaupt nicht auf dem Schirm hatte.
@combie
Hier gilt das gleiche wie an den Kollegen. Ich kann damit nichts anfangen: "Es liefert dir offensichtlich nicht das, was du dir vorstellst". Es hat mir die ganze Zeit geliefert was ich mir vorstelle. Und ich kann nur das sagen, was ich sehe (im seriellen Monitor) und das sah soweit gut aus. Der Tipp von @wno158 sich die Daten per HEX anzeigen zu lassen hätte ich als nächstes versucht, aber das ist nun nicht mehr nötig.
Was soll ich "sagen" / schreiben... Ihr unterstellt mir, dass ich Euch für blöd halte oder ignoriere oder was auch immer ich noch alles falsch mache. Das tut mir leid und ganz ehrlich verletzt ihr mich damit denn das ist alles absolut nicht meine Absicht und auch nicht meine Natur!