搜索
bottom↓
回复: 8

125KHZ RFID 解码程序

[复制链接]

出0入0汤圆

发表于 2019-6-21 16:49:27 | 显示全部楼层 |阅读模式
终于明白了如何写解码程序了,我是用定时器来计数的,然后通过上升沿下降沿将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[i]>>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[i]>>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);
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2019-6-25 16:42:14 | 显示全部楼层
今天刚完成一个125KHz的读头。
网上的程序,下载看了,都不太适合自己,后来是根据编码的方法自己写了解码程序,只使用20字节RAM。

出0入0汤圆

 楼主| 发表于 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;
    }
   
  }
  
   
  
  

}

出0入0汤圆

发表于 2019-6-26 11:44:52 | 显示全部楼层
本帖最后由 KongQuan 于 2019-6-26 17:03 编辑
yueming 发表于 2019-6-26 10:34
我发现我的校验有问题,不知道问题出现在哪里,不是卡号的 校验位我打印出来,校验错的也能打印,感觉没 ...


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

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

出0入0汤圆

 楼主| 发表于 2019-7-9 19:46:29 | 显示全部楼层
KongQuan 发表于 2019-6-26 11:44
只校验了cache=g_ucData; ?是不是应该cache=g_ucData[xxx]

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

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

出0入0汤圆

 楼主| 发表于 2019-7-9 19:52:08 | 显示全部楼层
KongQuan 发表于 2019-6-26 11:44
只校验了cache=g_ucData; ?是不是应该cache=g_ucData[xxx]

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

bool check()
{
  unsigned char i,j,counter;
  unsigned char cache,cache_1;
  unsigned char c;
// _Bool  result=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()
{
// _Bool  result=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[10];
      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;

}

出0入0汤圆

 楼主| 发表于 2019-8-16 14:42:58 | 显示全部楼层
KongQuan 发表于 2019-6-26 11:44
只校验了cache=g_ucData; ?是不是应该cache=g_ucData[xxx]

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2019-9-19 16:47:49 | 显示全部楼层
按解码规则自己写了一个,解码效率不高呀;头疼
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表