Strings vergleichen funktioniert nicht -- warum?

Tommy56:
@TO: Du musst erst mal raus bekommen (erstes HEX-Einlesen nach Neustart), ob das 0-Byte ein Rest oder ein Inhalt ist. Danach kann man weiter sehen.

Aus den o.g. Quellen habe ich auch schon Example #5: Format a Tag as NDEF
verwendet. Daher dachte ich, dass da kein Rest mehr drauf sein konnte???
Meine Reihenfolge war: Format, Write, Read ... relativ naheliegend, fand ich!?

Mach mal Neustart - Read und zeige uns das HEX-Ergebnis.

Gruß Tommy

Tommy56:
Mach mal Neustart - Read und zeige uns das HEX-Ergebnis.

Wenn sich das unterscheidet, bin ich raus... :wink:

Neustart hat nichts gebracht -- gleicher Payload (HEX)!

Ok, jetzt verstehe ich ... habe gerade nochmal ein ganz neues NFC-TAG (NFC – BLOCKARD.COM) aus der Packung genommen und wollte es formatieren ... bei den Aufklebern erschien jetzt seltsamerweise "Format failed." Das Schreiben funktionierte mit der Vorlage aber -- daher dachte ich bisher, dass die Dinger dann auf jeden Fall leer sein müssen. Wenn ihr meint, dass da auf diese Weise ein Rest oder irgendein Steuerzeichen drauf sein kann, muss das vorher offenbar runter.
Meine anderen Tags (keine Aufkleber, Scheckkartenformat, Mifare) konnte ich mit dem Sketchfile übrigens problemlos formatieren.

whiterabbit07:
Neustart hat nichts gebracht -- gleicher Payload (HEX)!

Na was ich für ein Glückkkkkk habe. Ich hab gedacht ich bin da ganz schnell raus ...

Ok, jetzt verstehe ich ... habe gerade nochmal ein ganz neues NFC-TAG (NFC – BLOCKARD.COM) aus der Packung genommen und wollte es formatieren ... bei den Aufklebern erschien jetzt seltsamerweise "Format failed."

Naja, die Meldung kommt von hier:

bool success = nfc.format();
            if (success) {
              Serial.println("Success, tag formatted as NDEF.");
            } else {
              Serial.println("Format failed.");
            }

Letztendlich gibt nfc.format einen Wert zurück.
Der kommt aus der eingebundenen lib.
Eingebunden ist nfcAdapter.h.

Also suchen in NDEF/NfcAdapter.cpp at master · don/NDEF · GitHub
und da steht ab Zeile 62:

boolean NfcAdapter::format()
{
    boolean success;
#ifdef NDEF_SUPPORT_MIFARE_CLASSIC
    if (uidLength == 4)
    {
        MifareClassic mifareClassic = MifareClassic(*shield);
        success = mifareClassic.formatNDEF(uid, uidLength);
    }
    else
#endif
    {
#ifdef NDEF_USE_SERIAL
        Serial.print(F("Unsupported Tag."));
#endif
        success = false;
    }
    return success;
}

Nicht viele Zeilen...
Aber ... #ifdef NDEF_USE_SERIAL
Na das ist doch eine Ansage.

Musst nur noch einschalten....
Beispiel in NDEF/Ndef.h at master · don/NDEF · GitHub Zeile 4/5...
Dann aber lokal und nicht da versuchen :wink:

my_xy_projekt:
Nicht viele Zeilen...
Aber ... #ifdef NDEF_USE_SERIAL
Na das ist doch eine Ansage.

Musst nur noch einschalten....
Beispiel in NDEF/Ndef.h at master · don/NDEF · GitHub Zeile 4/5...
Dann aber lokal und nicht da versuchen :wink:

Hm -- wir kommen der Sache scheinbar näher -- aber vergiss nicht, dass ich immernoch ~newbie bin ;D
Also wenn ich das richtig sehe, muss aus #ifdef ein #define gemacht werden oder wie muss ich das "nur noch einschalten" verstehen?

whiterabbit07:
Also wenn ich das richtig sehe, muss aus #ifdef ein #define gemacht werden oder wie muss ich das "nur noch einschalten" verstehen?

Ne.. ; oder.
Du musst ein #define NDEF_USE_SERIAL setzen.
Manchmal geht es, wenn das im Sketch vor der Einbindung der steht.

In den issues bei github gibt es auch nen Eintrag zur Thematik. - bin aber gestern nur drüber geflogen...

Also ich hätte nicht gedacht, dass dieses kleine Problem so kompliziert ist.
Ich habe es auch schon anders versucht -- stoße aber immer wieder an meine seher beschränkten Programmierkenntnisse:

if (payload == 0x0048616D6D6572)

liefert mir z.B.

warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]

Das ist mir auch nicht klar, da ich dachte, dass nun beides als "byte" definiert ist ... unter'm Strich: Geht es nicht irgendwie einfacher? Zwei Strings miteinander zu vergleichen fände ich einleuchtend -- wird aber nicht empfohlen.

whiterabbit07:
unter'm Strich: Geht es nicht irgendwie einfacher?

Ja. Das Problem beheben.

Hinweis: Du kannst auch ganz auf das #if def verzichten - einfach an der Stelle auskommentieren - dann bekommst die Ausgabe, wen es passt. Aber die Ausgaben werden auch an anderen Stellen verwendet. Wenn also gesetzt dann bekommst Du alles zu sehen, wo sich der Ersteller der Lib Gedanken gemacht hat.

Das ist mir auch nicht klar, da ich dachte, dass nun beides als "byte" definiert ist

Ein Byte und ein Array aus Bytes sind zwei völlig unterschiedliche Dinge

Serenifly:
Ein Byte und ein Array aus Bytes sind zwei völlig unterschiedliche Dinge

das ist mir klar -- aber in diesem Fall dachte ich, dass es beides Bytes sind ...

Also ist es Dir nicht klar.

Gruß Tommy

Ich wollte hier jetzt keine Grundsatzdiskussion anstoßen --- mir ist klar, dass ich kein Profi-Pogrammierer bin, der den Code gänzlich versteht. Ich kratze sehr an der Oberfläche und bin schon froh, dass die Basics funktionierten.

Die Lösung kam aus dem englischen Teil des Forums:

for (int c = 1; c < payloadLength; c++) {
          payloadAsString += (char)payload[c];
        }

Das lässt das Steuerzeichen am Anfang weg -- und dann funktioniert auch der Vergleich

if (payloadAsString == Hammer) ...

Das stand ursprünglich hier:
https://forum.arduino.cc/index.php?topic=426988.0

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.