static void barreader_method()
{
barreader.OpenPort(barport, 19200); //opens the port connected to the rfid reader
byte TagType; //tag type
byte[] TagSerial = new byte[4]; //tag serial in reverse order
byte ReturnCode = 0; //return code sent from the rfid reader
string bartagno; //tag no as a string
while (true)
{
bartagno = "";
while (!barreader.CMD_SelectTag(out TagType, out TagSerial, out ReturnCode)) /*wait until a tag is present in the rf field, if present return the tag number.*/
{
}
for (int i = 0; i < 4; i++)
{
bartagno += TagSerial[i].ToString("X2");
}
barprocess(bartagno); //barprocess method
Thread.Sleep(1200); //this is to prevent multiple reads
}
}
bartagno 変数が 1 分以内に同じ値を取得した場合、barprocess メソッドを実行するのではなく、無限ループを続行します。それ以外の場合は、barprocess メソッドが実行されます。どうすればこれを達成できますか? どこから始めればよいかさえわかりません。さまざまな日時、ループの組み合わせを試しましたが、成功しませんでした。
-------------------------------------------------- -------進行状況を以下に追加---------------------------------------- -------
1分以内に複数のカードを読み取ることができるため、以前のものと比較するだけでは残念ながら役に立ちません. Kelly Ethridgeの回答に基づいて構築する代わりに、arraylistを使用しようとしました(ありがとう)。しかし、たとえば 10 秒に 1 回読み取り値を取得する場合、これは役に立ちません。1 分以上経過したアイテムを削除する必要があります。
static void barreader_method()
{
barreader.OpenPort(barport, 19200);
byte TagType;
byte[] TagSerial = new byte[4];
byte ReturnCode = 0;
string bartagno;
ArrayList previoustagnos = new ArrayList();
DateTime lastreaddt = DateTime.MinValue;
while (true)
{
bartagno = "";
while (!barreader.CMD_SelectTag(out TagType, out TagSerial, out ReturnCode))
{
}
for (int i = 0; i < 4; i++)
{
bartagno += TagSerial[i].ToString("X2");
}
if (DateTime.Now - lastreaddt > TimeSpan.FromMinutes(1))
{
previoustagnos.Clear();
barprocess(bartagno);
previoustagnos.Add(bartagno);
lastreaddt = DateTime.Now;
}
else
{
previoustagnos.Sort();
if (previoustagnos.BinarySearch(bartagno) < 0)
{
barprocess(bartagno);
previoustagnos.Add(bartagno);
lastreaddt = DateTime.Now;
}
}
Thread.Sleep(1200);
}
}