p.ro Geschrieben February 14, 2015 at 15:02 Geschrieben February 14, 2015 at 15:02 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()); } } Zitieren
photron Geschrieben February 16, 2015 at 13:04 Geschrieben February 16, 2015 at 13:04 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. Zitieren
p.ro Geschrieben February 17, 2015 at 14:05 Autor Geschrieben February 17, 2015 at 14:05 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. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.