Jump to content

Problem RFID - Tags werden nicht erkannt


Recommended Posts

Hallo Zusammen,

 

ich bin Peter und erst seit ganz kurzem mit Tinkerforge unterwegs.

 

Ich spiele gerade mit RFID herum. Leider habe ich ein kleines Problem.

 

Entwickelt wird in c#. Eingebunden ist das ganze in einer Testumgebung bestehend aus einem Form mit diversen Schaltflächen. Firmware (RFID Bricklet) 2.0.1. Über eine Schaltfläche wird RequestTagID() angestoßen bzw. registriert.

 

Drücke ich die Schaltfläche das erste mal, dann wir im Ausgabefenster richtig "15:52:25 - Status-STATE_REQUEST_TAG_ID: 2" angezeigt. Die Funktion wurde also richtig registriert. Allerdings wird ein Tag beim Auflegen nicht erkannt (oder nur jedes 20.-50. Mal).

 

Wenn ich jetzt die Schaltfläche ein zweites Mal betätige, dann wird der Tag jedesmal erkannt.

 

Ich kann mir das Verhalten gerade nicht erklären und konnte auch im Forum nichts dazu finden. Einer von Euch eine Idee?

 

Vielen Dank und liebe Grüße,

 

 

Peter

 

    private void button9_Click(object sender, EventArgs e)
    {
        string UID = "p6p"; // Change to your UID

        byte currentTagType = BrickletNFCRFID.TAG_TYPE_MIFARE_CLASSIC;
        
        IPConnection ipcon = new IPConnection(); // Create IP connection
        BrickletNFCRFID nfc = new BrickletNFCRFID(UID, ipcon); // Create device object

        ipcon.Connect(HOST, PORT); // Connect to brickd
        // Don't use device before ipcon is connected

        // Register state changed callback to function StateChangedCB
        nfc.StateChanged += StateChangedCB;

        nfc.RequestTagID(BrickletNFCRFID.TAG_TYPE_MIFARE_CLASSIC);
        
        updateLog("RFID gestartet");

        //ipcon.Disconnect();       
    }

    // Callback function for state changed callback
    static void StateChangedCB(BrickletNFCRFID sender, byte state, bool idle)
    {
        //Console.WriteLine(System.DateTime.Now.ToString("HH:mm:ss") + " - Status: " + state.ToString());

        if (idle)
        {
            //Console.WriteLine(System.DateTime.Now.ToString("HH:mm:ss") + " - Status-Idle: " + state.ToString());

            currentTagType = (byte)((currentTagType + 1) % 3);
            sender.RequestTagID(currentTagType);
        }

        if (state == BrickletNFCRFID.STATE_REQUEST_TAG_ID)
        {
            Console.WriteLine(System.DateTime.Now.ToString("HH:mm:ss") + " - Status-STATE_REQUEST_TAG_ID: " + state.ToString());
        }

        if (state == BrickletNFCRFID.STATE_REQUEST_TAG_ID_READY)
        {
            Console.WriteLine(System.DateTime.Now.ToString("HH:mm:ss") + " - Status-STATE_REQUEST_TAG_ID_READY: " + state.ToString());

            Console.Beep(1000, 300);

            byte tagType;
            byte tidLength;
            byte[] tid;

            sender.GetTagID(out tagType, out tidLength, out tid);

            int serial_int = 0;
            string serial_hex = "";

            if (tidLength == 7)
            {
                System.Console.WriteLine("Found tag of type {0} with ID " +
                                         "[{1:X} {2:X} {3:X} {4:X} {5:X} {6:X} {7:X}]",
                                         tagType, tid[0], tid[1], tid[2], tid[3], tid[4], tid[5], tid[6]);

                serial_hex = tid[0].ToString("X") + tid[1].ToString("X") + tid[2].ToString("X") + tid[3].ToString("X") + tid[4].ToString("X") + tid[5].ToString("X") + tid[6].ToString("X");                
            }
            else
            {
                System.Console.WriteLine("Found tag of type {0} with ID [{1:X} {2:X} {3:X} {4:X}]",
                                         tagType, tid[0], tid[1], tid[2], tid[3]);

                serial_hex = tid[0].ToString("X") + tid[1].ToString("X") + tid[2].ToString("X") + tid[3].ToString("X");                
            }

             serial_int = Convert.ToInt32(serial_hex, 16);

            Console.WriteLine(serial_int.ToString());
        }
    }


Link zu diesem Kommentar
Share on other sites

Du erzeugst bei jedem Klick neue IPConnection und BrickletNFCRFID Objekte und weißt sie lokalen Variablen zu.

 

Sobald der Aufruf von button9_Click() durch ist gehen die beiden lokalen Variablen verloren und der Garbage Collector kann die IPConnection und BrickletNFCRFID Objekte zerstören. Wenn der Garbage Collector schneller ist als die Antwort vom Bricklet, dann siehst du die Antwort nicht mehr.

 

Anstatt lokale Variablen in button9_Click() zu verwenden, könntest du static Variablen auf Ebenen der Klasse verwenden. Damit auch dann noch Variablen auf die IPConnection und BrickletNFCRFID Objekte verweisen, wenn der Aufruf von button9_Click() durch ist und der Garbage Collector die Objekte nicht zerstören kann.

Link zu diesem Kommentar
Share on other sites

Vielen Dank für die Antwort.

 

Die Variablen habe ich aktuell zum Teil lokal gemacht, da ich die komplette Logik für den Verbindungsaufbau noch sauber auslagern möchte. Aktuell sind das die ersten Gehversuche, deshalb sind auch die Buttons nicht sauber benannt.

 

Für die ersten Tests mit dem RFID Leser hatte ich am Wochenende eine Kreditkarte genutzt, da ich zu Hause leider keine RFID Tags zur Hand hatte. Ich habe das eben hier im Büro mit anderen Tags probiert und siehe da es läuft sauber. Auch beim ersten "Klick".

 

Ich werde das mit der Kreditkarte auf jeden Fall noch einmal probieren und die Variablen global erreichbar machen, auch wenn ich aktuell glaube, dass das Problem eher durch die KK verursacht wurde. Sonst würde es gefühlt nicht mit dem anderen Tag reibungslos laufen.

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...