[英]How to trigger an event when a variable gets the same value in a specified timeframe?
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变量在一分钟内得到相同的值,我不想执行barprocess方法,而是继续无限循环。 否则将执行barprocess方法。 我怎样才能实现这一目标? 我甚至不知道从哪里开始。 我尝试了不同的日期时间,循环组合没有成功。
-------------------------------------------------- -------下面添加进度---------------------------------------- -------
可以在一分钟内读取多张卡片,因此仅与之前的卡片进行比较无疑会有所帮助。 我尝试使用arraylist而不是基于Kelly Ethridge的回答(谢谢)。 但是,如果我们每隔十秒获得一次读数,那么这将是无用的。 我们仍然需要删除超过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);
}
}
您需要跟踪上次调用barprocess的时间以及之前的bartango是什么。
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
string previousbartango;
var lastTimeCalled = DateTime.MinValue;
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");
}
var spanSinceLastCalled = DateTime.Now - lastTimeCalled;
if (spanSinceLastCalled > TimeSpan.FromMinutes(1) || bartango != previousbartango)
{
barprocess(bartagno); //barprocess method
previousbartango = bartango;
lastTimeCalled = DateTime.Now;
}
Thread.Sleep(1200); //this is to prevent multiple reads
}
}
这是空气码,但我想你明白了。
这取决于您希望在一分钟内看到多少个标签。
想到一种丑陋的方式是创建一个新变量
List<Tuple<DateTime, String>> recentTags = new List<Tuple<DateTime, String>>()
每当你看到一个bartagno,搜索这个列表,看看它是否已经在这里。 如果是,请跳过它。 如果没有,请将其添加到列表中:
recentTags.Add(Tuple.Create(DateTime.Now, bartagno));
有时(通过主循环可能需要5到10次),您将要从此列表中删除旧记录。
recentTags.RemoveAll(e => e.Item1....
(crud - 我不记得“e.Item1过去超过1分钟”的语法)
这不像存储上次处理的值和日期时间那么简单。 如果读取在时间限制内,那么在调用barprocess()方法之前测试相同性?
... String lastBarTagNo =“”; DateTime lastTagProcessDateTime = DateTime.MinValue; ... while(true){... //读取标签并构建新的bartagno if(DateTime.Now - lastTagProcessDateTime <TimeSpan.FromMinutes(1))&& lastBarTagNo.Equals(bartagno){barprocess(); }}
(抱歉格式化 - 在智能手机上执行此操作)
static void barreader_method()
{
barreader.OpenPort(barport, 19200);
byte TagType;
byte[] TagSerial = new byte[4];
byte ReturnCode = 0;
string bartagno;
List<Tuple<DateTime, String>> previoustags = new List<Tuple<DateTime, String>>();
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))
{
previoustags.Clear();
barprocess(bartagno);
previoustags.Add(Tuple.Create(DateTime.Now, bartagno));
lastreaddt = DateTime.Now;
}
else
{
if (!previoustags.Exists(a => a.Item2.Equals(bartagno)))
{
barprocess(bartagno);
previoustags.Add(Tuple.Create(DateTime.Now, bartagno));
lastreaddt = DateTime.Now;
}
}
previoustags.RemoveAll(a => a.Item1.CompareTo(DateTime.Now - TimeSpan.FromMinutes(1)) < 0);
Thread.Sleep(1200);
}
}
非常感谢Dan和Kelly。 没有你的帮助,我将无法解决这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.