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);
}
} 今天刚完成一个125KHz的读头。
网上的程序,下载看了,都不太适合自己,后来是根据编码的方法自己写了解码程序,只使用20字节RAM。 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 17:03 编辑
yueming 发表于 2019-6-26 10:34
我发现我的校验有问题,不知道问题出现在哪里,不是卡号的 校验位我打印出来,校验错的也能打印,感觉没 ...
只校验了cache=g_ucData; ?是不是应该cache=g_ucData
偶校验也写得太复杂了吧? KongQuan 发表于 2019-6-26 11:44
只校验了cache=g_ucData; ?是不是应该cache=g_ucData
偶校验也写得太复杂了吧? ...
我发现还是校验出了问题,贴着卡片 有的时候还可能会出现其他的号码,判断校验你如何写的呢 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;
} KongQuan 发表于 2019-6-26 11:44
只校验了cache=g_ucData; ?是不是应该cache=g_ucData
偶校验也写得太复杂了吧? ...
是不是 行 列 都要进行校验,现在的问题就是,有很小的几率还是会读出来其他卡号,如果卡片正常放置是没有问题的,如果比如是不常规放置,就有很小的几率可能会读出来其他的卡号,请问这是什么原因呢,是校验没写对吗 yueming 发表于 2019-8-16 14:42
是不是 行 列 都要进行校验,现在的问题就是,有很小的几率还是会读出来其他卡号,如果卡片正常放置是没 ...
应该是没有处理正确。可以看看网上的程序,一般都会读到两次一样才会输出。 按解码规则自己写了一个,解码效率不高呀;头疼
页:
[1]