Hallo.
ich habe ein RFID-Tag mit einem Text beschrieben und konnte es auch bereits erfolgreich wieder auslesen.
Dazu habe ich dieses Shield https://aptofun.de/NFC_Shield_V2.0
und diesen Code verwendet:
Das funktioniert zunächst nun zwar alles -- aber wenn ich den String "payloadAsString" mit irgendwas vergleichen will wie z.B.:
if (payloadAsString == "Inhalt")
oder aber
if (payloadAsString.equals("Inhalt")) {
funktioniert das nicht und ich wüsste gerne warum?!
Wie muss das richtig lauten, damit es funktioniert?
Danke.
Das liegt daran, dass payloadAsString vom Typ String ist (von dessen Verwendung auf dem Arduino in der Regel abgeraten wird) und "Inhalt" vom Type const char * (C-String).
Letzterer ist kein Objekt und hat deshalb auch weder den Vergleichsoperator == überladen noch besitzt er eine Methode equals().
Abhilfe:
"Inhalt" in einen String konvertieren (bitte nicht, das ist nur eine theoretische Möglichkeit)
strcmp() verwenden und dabei payloadAsString.c_str() verwenden (geht, ist aber nicht schön).
Den Code so umschreiben, dass auch payloadAsString ein C-String wird und strcmp() verwenden.
wno158:
Das liegt daran, dass payloadAsString vom Typ String ist (von dessen Verwendung auf dem Arduino in der Regel abgeraten wird) und "Inhalt" vom Type const char * (C-String).
Letzterer ist kein Objekt und hat deshalb auch weder den Vergleichsoperator == überladen noch besitzt er eine Methode equals().
Das stimmt nicht. Du kannst natürlich ein String Objekt mit einem Literal vergleichen. Es wäre sehr schlecht wenn das nicht ginge
Und die entsprechenden Methoden und Operatoren musst du in der String Klasse suchen:
void setup() {
Serial.begin(9600);
String s("Hallo");
const char* cp = "Hallo";
if (s == cp) Serial.println(" String == char* vergleicht zwei Strings");
if (s.equals("Hallo") ) Serial.println(" String::equals geht auch");
}
void loop() {
}
Erzeugt zwei Zeilen Ausgabe
Natürlich gebe ich dir Recht, dass man immer besser ohne String-Objekte auskommt. Strings sollen das Leben erleichtern. Wenn sie das nicht tun, ist es immer besser, sie einfach gar nicht zu verwenden.
String payloadAsString = "";
for (int c = 0; c < payloadLength; c++) {
payloadAsString += (char)payload[c];
}
Hier ist nicht 1 String zu sehen, sondern payloadLength viele, denn für jeden Buchstaben wird ein neuer String erzeugt und der vorige auf den Müll geworfen.
wno158:
Dann würde es natürlich doch helfen, etwas mehr vom Code des TO zu sehen
Hi. Viel mehr kann ich (TO) nicht beisteuern -- ich habe den Code bisher nur um diese Zeilen ergänzt, die das RFID-Tag auslesen und dann den Wert auf einen Zähler addieren sollen.
Also konkret:
Serial.println(payloadAsString);
if (payloadAsString == "ABC")
{Serial.println("Wert:10");
wert=10;}
if (payloadAsString == "DEF")
{Serial.println("Wert:15");
wert=15;}
gesamt = gesamt + wert;
Serial.println(gesamt);
Das funktioniert so leider nicht -- ich bin aber leider auch (noch?) kein Experte in Sachen Arduino-Programmierung. Daher wäre ich für einen Tipp dankbar, wie ich
Den Code so umschreiben, dass auch payloadAsString ein C-String wird und strcmp() verwenden.
whiterabbit07:
Daher wäre ich für einen Tipp dankbar, wie ich
Den Code so umschreiben, dass auch payloadAsString ein C-String wird und strcmp() verwenden.
das bewerkstelligen kann?
Das steht doch in #5:
if (payloadAsString == String("ABC"))
...
if (payloadAsString == String("DEF"))
@whiterabbit:
Das mit dem Umarbeiten kannst Du sparen. Die Kollegen haben mich freundlich darauf hingewiesen, dass die Vergleiche funktionieren sollten. Die String-Klasse kann mit Zeichenkettenkonstanten umgehen.
Ich lege mal den originalen Code aus dem Link in #0 zugrunde.
Was dann hilfreich wäre: Die Ausgabe aus dem Monitor, die hinter " Payload (HEX): " erscheint.
Daran kann man dann sehen, was die Payload wirklich ist und (vielleicht) warum die Vergleiche fehlschlagen und die Zuweisungen nicht ausgeführt werden.
for (int c = 0; c < payloadLength; c++) {
payloadAsString += (char)payload[c];
}
**Hier ist nicht 1 String zu sehen, sondern payloadLength viele, denn für jeden Buchstaben wird ein neuer String erzeugt und der vorige auf den Müll geworfen.**
Das ist vermutlich das Problem -- aber wie kann man das anders machen?
Puh, das wird mir leider echt zu kompliziert ... ich bin da ~newbie ...
Die Datei, die ich zum Formatieren und Beschreiben verwendet habe, sind auch auf der Seite oben angegeben. Konkret war das diese: Example #4: Write an NDEF Message to a Tag
Wenn es einfacher ist, nicht den String sondern das Byte zu vergleichen, wäre mir das auch egal ... Hauptsache irgendeine Fallunterscheidung für die RFID-Tags?!
der schreibt mittels:
addUriRecord - also etwas aus der lib...
Wenn es einfacher ist,
Nein ist es nicht.
Es ändert nichts an der Tatsache, das zwischen dem was Du übergibst und dem was Du zurück bekommst ein Unterschied ist.
Das musst Du lösen - und nicht an den Ergebnissen rumbasteln bis sie passen!