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 変数が 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);
    }
}
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

これは、1 分間に表示されると予想されるタグの数によって異なります。

頭に浮かぶ醜い方法は、新しい変数を作成することです

List<Tuple<DateTime, String>> recentTags = new List<Tuple<DateTime, String>>()

バルターニョを見るたびに、このリストを検索して、すでにここにあるかどうかを確認してください。その場合は、スキップしてください。そうでない場合は、リストに追加します。

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
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 に答える
0

最後に処理された値と日時を保存するのと同じくらい簡単ではありませんか。読み取りが制限時間内にある場合、barprocess() メソッドを呼び出す前に同一性をテストしますか?

... String lastBarTagNo = ""; DateTime lastTagProcessDateTime = DateTime.MinValue; ... while(true){ ... // タグを読み取り、新しい bartagno を作成します。} }

(フォーマットについて申し訳ありません-これはスマートフォンで行っています)

于 2012-09-26T23:55:18.590 に答える