yueming 发表于 2019-6-21 16:49:27

125KHZ RFID 解码程序

终于明白了如何写解码程序了,我是用定时器来计数的,然后通过上升沿下降沿将Manchester 放入数组中,
然后对数组进行解析,

解码程序不难,首先要找到9个1,先找0 0代表上一次的结束标志位,找到9个1之后,开始接受数据,一个周期以上的上升沿代表0,下降沿代表1,半个周期的上升沿,如果它的上一次是没有数据的代表空跳,半个周期上升沿,如果上个周期为0,此次为0.
unsigned long Rfid_getData(void)
{   unsigned long ret=0,i;
    for(i=2;i<10;i++)
    {
      ret<<=4;
       // ret=ret |0xf;
      ret=ret |(0xf&(g_ucData>>1));
    }
   
      return ret;
}
unsigned long Rfid_getCID(void)
{   unsigned long ret,i;
    for(ret=i=0;i<2;i++)
    {
      ret<<=4;
      ret=|0xf&(g_ucData>>1);
    }
   
    return ret;
}


我们的卡号信息一般都是十进制输出的,所以要转换为十进制输出。

void put_ID(unsigned long dat)
{
      unsigned long temp = 1000000000;
      unsigned char i = 0;
      unsigned char out = 0;
      for(i = 0;i < 10;i++)
      {
                out = dat / temp;
                dat %= temp;
                temp /= 10;
                printf("%d",out);
      }
}

KongQuan 发表于 2019-6-25 16:42:14

今天刚完成一个125KHz的读头。
网上的程序,下载看了,都不太适合自己,后来是根据编码的方法自己写了解码程序,只使用20字节RAM。

yueming 发表于 2019-6-26 10:34:35

KongQuan 发表于 2019-6-25 16:42
今天刚完成一个125KHz的读头。
网上的程序,下载看了,都不太适合自己,后来是根据编码的方法自己写了解码 ...

我发现我的校验有问题,不知道问题出现在哪里,不是卡号的 校验位我打印出来,校验错的也能打印,感觉没有问题啊
void check()
{
unsigned char i,j,counter;
unsigned char cache,cache_1;

for(i=2;i<10;i++)
{
    counter=0;
    cache=g_ucData;
    cache_1=g_ucData;
    for(j=0;j<4;j++)
    {
      cache&=0x80;
      if(cache==0x80)
      {
      counter++;
      }
      cache_1 <<=1;
      cache=cache_1;
   
    }
   
    if((counter==0) ||(counter==2) ||(counter==4))
    {
      check_bit=0;
    }
    else if((counter==1) || (counter ==3))
    {
      check_bit=1;
   
    }
    cache=g_ucData;
    cache&=0x08;
    if(cache==0x08)
    {
      PC_bit=1;
    }
    else
    {
      PC_bit=0;
   
    }
    if(check_bit==PC_bit)   
    {
      flag= 1;//表示检验正确
    }
    else
    {
      
      flag=0;
    }
    if(flag==0)
    {
      return;
    }
   
}

   



}

KongQuan 发表于 2019-6-26 11:44:52

本帖最后由 KongQuan 于 2019-6-26 17:03 编辑

yueming 发表于 2019-6-26 10:34
我发现我的校验有问题,不知道问题出现在哪里,不是卡号的 校验位我打印出来,校验错的也能打印,感觉没 ...

只校验了cache=g_ucData; ?是不是应该cache=g_ucData

偶校验也写得太复杂了吧?

yueming 发表于 2019-7-9 19:46:29

KongQuan 发表于 2019-6-26 11:44
只校验了cache=g_ucData; ?是不是应该cache=g_ucData

偶校验也写得太复杂了吧? ...

我发现还是校验出了问题,贴着卡片 有的时候还可能会出现其他的号码,判断校验你如何写的呢

yueming 发表于 2019-7-9 19:52:08

KongQuan 发表于 2019-6-26 11:44
只校验了cache=g_ucData; ?是不是应该cache=g_ucData

偶校验也写得太复杂了吧? ...

bool check()
{
unsigned char i,j,counter;
unsigned char cache,cache_1;
unsigned char c;
// _Boolresult=TRUE;

for(i=0;i<10;i++)
{
    counter=0;
    cache=g_ucData;
    cache_1=g_ucData;
    for(j=0;j<4;j++)
    {
      cache&=0x10;   //计算有几个1
      if(cache==0x10)
      {
      counter++;
      }
      cache_1 <<=1;
      cache=cache_1;
   
    }
   
    if((counter==0) ||(counter==2) ||(counter==4))
    {
      check_bit=0;
    }
    else if((counter==1) || (counter ==3))
    {
      check_bit=1;
   
    }
    c=g_ucData;
    c&=1; //校验位
    if(c==1)
    {
      PC_bit=1;//校验位是1的
    }
    else
    {
      PC_bit=0;
   
    }
    if(check_bit==PC_bit)   
    {
      //result=TRUE;//表示检验正确
      
    }
    else
    {
      LED_ON;
      return FALSE;
      
    }
   
   
}
return TRUE;
}
bool row()
{
// _Boolresult=TRUE;
unsigned char i,j,counter;
unsigned char cache,cache_1;
bool result;
cache_1=0x80;                        //------------------------------------此处如果跟上面一样 0x10 就读不出数据了 ,很不解,上面的就可以,上面的函数是行校验,下面的是列校验
    for(i=0;i<4;i++)
    {
      counter=0;
   
   
      for(j=0;j<10;j++)
      {
   
          cache=g_ucData;
          cache&=cache_1;
          if(cache==cache_1)
          {
            counter++;
      
          }
   
      }
   
      if((counter==0) ||(counter==2) || (counter==4) || (counter==6) || (counter==8) || (counter==10))
      {
      check_bit1=0;
   
      }
      else if((counter==1) || (counter==3) || (counter==5) || (counter==7) || (counter==9))
      {
      check_bit1=1;
      }
      cache=g_ucData;
      cache&=cache_1;
      if(cache==cache_1)
      {
      
      PC_bit1=1; //最后一位
   
      }
      else
      {
      PC_bit1=0;
      }
      if(check_bit1==PC_bit1)
      {
          result=TRUE;
      }
      else
      {
      result=FALSE;
      return result;
      }
      cache_1 >>=1;
      

   }
   return result;

}

yueming 发表于 2019-8-16 14:42:58

KongQuan 发表于 2019-6-26 11:44
只校验了cache=g_ucData; ?是不是应该cache=g_ucData

偶校验也写得太复杂了吧? ...

是不是 行 列 都要进行校验,现在的问题就是,有很小的几率还是会读出来其他卡号,如果卡片正常放置是没有问题的,如果比如是不常规放置,就有很小的几率可能会读出来其他的卡号,请问这是什么原因呢,是校验没写对吗

KongQuan 发表于 2019-8-16 15:06:53

yueming 发表于 2019-8-16 14:42
是不是 行 列 都要进行校验,现在的问题就是,有很小的几率还是会读出来其他卡号,如果卡片正常放置是没 ...

应该是没有处理正确。可以看看网上的程序,一般都会读到两次一样才会输出。

cici8718 发表于 2019-9-19 16:47:49

按解码规则自己写了一个,解码效率不高呀;头疼
页: [1]
查看完整版本: 125KHZ RFID 解码程序