2017-01-13 6 views
0

잠시 동안, 나는 RFID 리더가 자동으로 카드를 읽도록 (스캔)하려고 노력 해왔다. 이전 코드가 있었지만 버튼을 누르면 리더가 카드를 스캔합니다. 그러나 카드가 현장에 배치되면 카드를 자동으로 지속적으로 스캔 할 수 있기를 원합니다. 여기 내가 시도한 것이있다. 하지만 텍스트 상자에 스캔 한 UID를 표시 할 수 없었습니다. 제발, 당신의 도움을 주시면 감사하겠습니다.RFID 리더가 연속적으로 카드를 찾는 방법

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); 
     } 
    } 

그리고 난이처럼 사용하려고 :

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

}

다음

답변

0

내가 시도하는 것이다. 하지만 텍스트 상자에 스캔 한 UID를 표시 할 수 없었습니다.

콜백이 성공적으로 시작 되었습니까? 어떤 오류가 있었습니까? 나는 당신에게 "크로스 스레드 예외"가 있다고 생각합니다. 그렇다면 다음과 같이 수정하십시오.

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

고맙습니다. –

+0

@ Idle_Mind. 리더가 연속 스캔을 원하지만 어떻게 카드를 한 번만 스캔 할 수 있습니까? 따라서 카드가 리더에 얼마나 오래 머무르더라도 카드는 한 번만 스캔됩니다. 감사. –

+0

나는 독자를 실제로 사용한 적이 결코 없다. 문서가 있습니까? 카드가 필드를 떠난 때를 감지하는 방법은 어떨까요? 그렇지 않은 경우, 일정 기간 동안 동일한 "카드사"의 알림을 무시하는 것 이외의 ** 신뢰할 수있는 ** 방법을 생각할 수 없습니다. –