0
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 方法。我怎样才能做到这一点?我什至不知道从哪里开始。我尝试了不同的日期时间、循环组合但没有成功。

-------------------------------------------------- --------下面添加了进度---------------------------------------- --------

可以在一分钟内读取多张卡片,因此不幸的是,仅与前一张比较无济于事。我尝试使用数组列表而不是基于 Kelly Ethridge 的回答(谢谢)。但是,例如,如果我们每 10 秒读取一次读数,这将毫无用处。我们仍然必须删除超过 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);
    }
}
4

4 回答 4

1

您需要跟踪上次调用 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
   }
}

这是空气代码,但我想你明白了。

于 2012-09-26T23:41:27.537 回答
1

这取决于您希望在一分钟内看到多少个标签。

想到一个丑陋的方法是创建一个新变量

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 分钟”的语法)

于 2012-09-26T23:46:29.970 回答
0

它不是像存储最后处理的值和日期时间那么简单吗?如果读取在时间限制内,那么在调用 barprocess() 方法之前测试是否相同?

... 字符串 lastBarTagNo = ""; 日期时间 lastTagProcessDateTime = DateTime.MinValue; ... while(true){ ... // 读取标签并构建新的 bartagno if(DateTime.Now - lastTagProcessDateTime < TimeSpan.FromMinutes(1)) && lastBarTagNo.Equals(bartagno){ barprocess(); } }

(抱歉格式化 - 在智能手机上执行此操作)

于 2012-09-26T23:55:18.590 回答
0
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);
    }
}

非常感谢丹和凯利。没有你的帮助,我无法解决这个问题。

于 2012-09-27T20:10:24.260 回答