2017-01-13 2 views
0

Depuis quelque temps, j'essaie de faire en sorte que mon lecteur RFID lise automatiquement (numérise) une carte. Bien que l'ancien code que j'avais, fait le lecteur de scanner la carte quand un bouton est pressé. Mais je veux être capable de scanner les cartes automatiquement et en continu, une fois que la carte est placée sur le terrain. Voici ce que j'ai essayé. mais je n'ai pas pu afficher l'UID scanné dans une zone de texte. S'il vous plaît, votre aide sera appréciée.Comment faire pour que le lecteur RFID cherche continuellement la carte

class CardReader : IDisposable 
    { 

     IntPtr _pSnr = Marshal.AllocHGlobal(1024); 
     private Thread _t; 
     private Action<string> _callback; 
     private volatile bool _stop; 

     public void ReadCard() 
     { 
      short icdev = 0x0000; 
      int status; 
      byte type = (byte)'A';//mifare one type is A 
      byte mode = 0x26; // Request the card which is not halted. 
      ushort TagType = 0; 
      byte bcnt = 0x04;//mifare hold on 4 
      IntPtr pSnr; 
      byte len = 255; 
      sbyte size = 0; 
      pSnr = Marshal.AllocHGlobal(1024); 
      for (int i = 0; i < 2; i++) 
      { 
       status = rf_request(icdev, mode, ref TagType);//request card 
       if (status != 0) 
        continue; 

       status = rf_anticoll(icdev, bcnt, pSnr, ref len);//i did anticol--get the card sn 
       if (status != 0) 
        continue; 

       status = rf_select(icdev, pSnr, len, ref size);//select one card 
       if (status != 0) 
        continue; 

       byte[] szBytes = new byte[len]; 

       for (int j = 0; j < len; j++) 
       { 
        szBytes[j] = Marshal.ReadByte(pSnr, j); 
       } 

       String m_cardNo = String.Empty; 

       for (int q = 0; q < len; q++) 
       { 
        m_cardNo += byteHEX(szBytes[q]); 
       } 

       _callback(m_cardNo); 

       // txtSearchPurse.Text = m_cardNo; 

       break; 
      } 
     } 

     public void Work() 
     { 
      while (!_stop) 
      { 
       ReadCard(); 
       Thread.Sleep(1000); 
      } 
     } 

     public void Start(Action<string> cardRead) 
     { 
      if (_t != null) 
       return; 

      _stop = false; 

      _callback = cardRead; 

      _t = new Thread(Work); 
      _t.Start(); 
     } 

     public void Stop() 
     { 
      if (_t != null) 
      { 
       _stop = true; 
       _t.Join(); 
       _t = null; 
      } 
     } 

     public void Dispose() 
     { 
      Marshal.FreeHGlobal(_pSnr); 
     } 
    } 

Et j'ai essayé de l'utiliser comme ceci:

private void btnRequest_Click(object sender, EventArgs e) 
    { 
    var reader = new CardReader(); 
    reader.Start(CardReaded); 
} 
private void CardReaded(string cardnr){ 
//txtSearchPurse.Text = _callback; 

}

Répondre

0

Voici ce que je l'ai essayé. mais je n'ai pas pu afficher l'UID scanné dans une zone de texte.

Votre rappel a donc été déclenché avec succès? Quelle erreur, le cas échéant, avez-vous eu? Je suppose que vous avez une "exception de thread cross". Si oui, réparez-le comme ceci:

private void CardReaded(string cardnr) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      txtSearchPurse.Text = cardnr; 
     });   
    } 
+0

Merci beaucoup –

+0

@ Idle_Mind. S'il vous plaît comment puis-je faire la carte à numériser qu'une seule fois, même si le lecteur cherche à numériser en continu. Ainsi, les cartes sont scannées une seule fois, peu importe combien de temps elles restent sur le lecteur. Merci. –

+0

Je n'ai jamais utilisé de lecteur moi-même. Y a-t-il de la documentation? Que diriez-vous d'un moyen de détecter quand la carte a quitté le terrain? Sinon, je ne peux pas penser à un moyen ** fiable ** autre que d'ignorer les notifications du même "cardnr" pour une période de temps déterminée. –