In this post I'll show you how to set up the idTronic RFID Reader for your own personal needs. Below you can see how this Reader looks like. It's connected via a USB-to-Mini-USB-Cable with my Notebook.
In the picture below you can see UHF-RFID Tags that I'm using for this post. But any other UHF-Tags (~868 MHz) will do the job as fine.
IdTronic ships the RFID-Reader with an SDK and a Console Software in C#. But in this software you won't need half of the features there. Below you can see a screen shot of the console Software and the methods you can use.
Most of the times you'll only need these methods: connection to the
reader, reading tag and deconnect from the Reader. That's it. But as you can see in the picture above there's a "plethora" of methods to be found. And filtering what you actually need can be quite time consuming. So I made this effort for you and filtered out what you need in order to have an application that uses the Reader for what it is supposed to do: Reading RFID-Tags.
The Software package delivers a C# console program.You get a lot of classes but you only need these (keep in mind to have the exact structure as you see in the picture below):
Below is the code for our GUI. As you can see we only have a method that get the ports, reads the Tags, writes the Tags in a Hash-set, so every Tag-ID will only appear once. And a deconnect method. Since we want the Reader to constantly read, we implemented a timer that calls the get-Method every 1000ms.
Form code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;
namespace idTronic_GUI_Anwendung
{
delegate void myTC_fertigCallback(List< String> l);
public partial class Form1 : Form
{
CSrfeReaderInterface.device.IProtocolDeviceInterface dev = null;
HashSet< String> hashRFID = new HashSet< string>();
static System.Timers.Timer _timer;
private BindingSource bindingSource1 = new BindingSource();
BindingList< String> blist = new BindingList< string>();
List< String> lRFID = new List< string>();
string[] theSerialPortNames;
Boolean connectionSuccessful = false;
string port;
public Form1()
{
InitializeComponent();
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = lRFID;
}
private void bConnect_Click(object sender, EventArgs e)
{
_timer = new System.Timers.Timer(1000);
_timer.Elapsed += new ElapsedEventHandler(jetzt);
_timer.Enabled = true;
}
private void jetzt(object sender, ElapsedEventArgs e)
{
get();
}
private void get()
{
if (!connectionSuccessful)
{
while (true)
{
for (int portIndex = 0; portIndex < theSerialPortNames.Count(); portIndex++)
{
// You have to set the port correctly in order to use the RFID-Reader
// You can look up the Port of the RFID-Reader by consulting 'Geräte Manager'/ 'Device Manager'
port = "12"; // in my case it was port 12. Yours can be different
try
{
// try to open the serial port
dev = new CSrfeReaderInterface.SerialDevice(theSerialPortNames[Convert.ToInt32(port)]);
if (!dev.Open())
{
Console.WriteLine("Could not open the COM-Port.");
}
else
{
Console.WriteLine("The COM-Port was open successfully");
connectionSuccessful = true;
return;
}
}
catch
{
Console.WriteLine("No Reader was found.");
}
}
}
}
// create trace and turn off
CSrfeReaderInterface.Global.m_tracer = new CSrfeReaderInterface.ConsoleTrace();
CSrfeReaderInterface.Global.m_tracer.TraceLevel = 0;
// create new instance of the protocol handler with the selected serial device
CSrfeReaderInterface.protocol.CSrfeProtocolHandler ph = new CSrfeReaderInterface.protocol.CSrfeProtocolHandler(dev);
// print out menu and process what is selected
// do a single inventory and print out the tag list with an index to select one tag
List< byte[]> epcList;
ph.doSingleInventory(out epcList);
for (int i = 0; i < epcList.Count(); i++)
{
hashRFID.Add(BitConverter.ToString(epcList[i]));
}
lRFID.Clear();
foreach(string s in hashRFID)
{
lRFID.Add(s);
}
foreach (string item in lRFID)
{
Console.WriteLine(item);
}
Console.WriteLine("----------------------------");
myTC_fertig(lRFID);
}
void myTC_fertig(List< string> l)
{
if (lb_rfidID.InvokeRequired == true)
{
myTC_fertigCallback callback = new myTC_fertigCallback(myTC_fertig);
this.Invoke(callback, new object[] { l });
}
else
{
lb_rfidID.Items.Clear();
foreach (string item in l)
{
lb_rfidID.Items.Add(item);
}
dataGridView1.DataSource = null;
dataGridView1.DataSource = l.Select(x=>new {Value=x}).ToList();
DataGridViewColumn column = dataGridView1.Columns[0];
column.Width = 200;
lPortIndex.Text = port;
}
}
private void bDisconnect_Click(object sender, EventArgs e)
{
_timer.Enabled = false;
dev.Close();
Console.WriteLine("Connection closed successfully.");
}
private void bEmpty_Click(object sender, EventArgs e)
{
lb_rfidID.Items.Clear();
hashRFID.Clear();
lRFID.Clear();
}
private void bGetPort_Click(object sender, EventArgs e)
{
// get all available port names
theSerialPortNames = System.IO.Ports.SerialPort.GetPortNames();
foreach (string availablePorts in theSerialPortNames)
{
Console.WriteLine("savailablePorts: "+ availablePorts);
}
Console.WriteLine("--------------------------");
List< string> l = new List< string>();
for (int i=0; i< theSerialPortNames.Count(); i++)
{
l.Add(i.ToString());
}
myTC_fertig(l);
}
}
}
Our GUI will look like this. Nothing fancy but it does exactly what we need: Reading the RFID-Tags.
Below I made a vid how to use this software: Firstly we have click on the "Get Port" in order to ....get the port. Secondly you click on the "Connect / Start" button. This will make our Software connect to the Reader and starts the timer, so it constantly reads the RFID-Tags in it's proximity. Thirdly, if you're done with ready, just deconnect by pressing the "Decconect / Stop" button. I also put an "Empty list" in the GUI, so you can delete the list. Because the IDs of the RFID-Tags won't delete themselves if you try to remove the Tags from the RFID-Reader. Consequently the IDs will remain in the list although the Tags aren't it the Reader's proximty. In order to refresh the list, just press the "Empty List".
A video of the GUI only can be found here:


No comments:
Post a Comment