开发者学堂课程【嵌入式之 RFID 开发与应用2020版:RFID 卡片型号及卡号获取】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11121
RFID 卡片型号及卡号获取
内容介绍:
一、RFID 协议工作状态
二、读取 ID
三、卡的型号
四、卡号
五、写入卡片的内容
接下来看它到底读到了什么样的类型的数据以及读到了些类型的数据之后,不同的卡类型是不一样的,所以 rfid_carda_request 函数主要是完成的是寻卡操作。寻卡表示已经跟卡建立起了通信关系,就是卡已经处于 ready 状态。
一、RFID 协议工作状态
工作状态包括上电、复位、寻卡、read,read 以后就可以读取 ID。ID 跟类型是不一样的,ID 跟类型是不一样的。先来看一下 ID,然后再去看怎么样去读取卡号。
二、读取 ID
进到第二个代码里面去看一下,先进行编译
[ root@qfedu 01_rfid_id] #cd ..
[root@qfedu rfid]#ls
01_rfid id 02_rfid readID 03_rfid_ Rw_block 04_rfid_inc_dec
[root@qfedu rfid]#cd 02_rfid_readID/
[root@qfedu 02_rfid_readID]#ls
Makefile
rfid lib.h
Untitled Project.si4project
rfid lib.odemo
Demo
uart _init.c
main.
uart_init.h
main.o
uart init.o
rfid lib.c
[ root@qfedu 02_rfid_readID]#. / demo
version=88
1.白卡
首先看一下,拿了一张白卡贴上去
[ root@qfedu 02_ rfid readID]#. /demo
version=88
type = 0x0400
card ID:0x34 0xa9 0xa5 0x4d
可以看到明显情况了很多,贴上去之后在没有离开之前,那么它只打印了一个卡号和 ID,其它都没有多余的,它不像刚才在不断的输出一堆信息,是有问题的。其实,它的类型是 0400。那么 0400 代表的是 mifare_ones50 卡。
2.公交卡
再换一个公交再看一下。
type = 0x0800
card ID:0x43 0xe2 0x2f 0x4f
0800 属于 pro 卡,由于代码里面没有没有身份证,它不能读取 B 类卡,所以只能演示两个。
三、卡的型号
0x0400 ,Mi fare_ One (S50)
0x0800 ,Mifare Pro (x)
0x4400, 0x0200, 0x4403
类似于还有很多卡的型号,卡片肯定是有很多型号的,因为市场是很庞大的,种类也是繁多的大概了解一下。
四、卡号
卡号是需要通过防冲撞去获取,防冲撞指的是比如说两张卡或者多张卡,比如图中就有三张卡。
同时贴上去到底去读取哪一个就会很麻烦,所以说必须要通过防冲撞之后才能读到它想要的卡号。防冲撞其实就是串行读取,它的算法的话比较常用,算法特别的多,在实际的应用当中的话,有曼切斯特编码是用的比较多的,还有米乐码之类的非常多。它的些编码主要目的一个是为了安全,另外一个它是为了高效。
接下来看一下怎么通过进行防冲撞读取卡号,
reg_ clr _bit(Status2Reg, ex08);
//清除加密位
reg_ set(BitF ramingReg, 0x00);
reg_ c1r bit (Col1Reg,
0x80);
//发生冲突位之后的所有的接收位被清除
buf[0] = PICC_ ANTICOLLI;
//s50 卡, 4 字节,级联为 1
buf[1j = 0x20;
// 国金融集成电路( IC )卡规范-与应用无关的非接触式规范p28
status = rfid_ cmd(PCD_ TRANSCEIVE, buf, 2, buf, &1en);
if(status == CMD_ SUCCESS){
for(i=0; i<4; i++){
*(card_ _num+i) = buf[i];
snr_ check^= buf[i];
}
增加另一个指令叫 picc,这条指令是针对卡的操作,#define PICC ANTICOLL 0x93
/ /防冲撞
指令值的话是 93,防冲撞获取卡有两种方式,93 95 都是支持的,93 是属于级联为 1 的防冲撞获取卡号。
第二个是 buf[1] = ex20;/,附带一个参数,参数的作用需要去参考做中国金融集成电路的规范,里面有解释。
五、写入卡片的内容
rfid_ carda_ init();
while(1){
ret = rfid_ carda_ request(PICC_ REQALL, type); .
if(ret == 0K){
printf("type = 0x%02x%02x\n", type[0],type[1]);
/ /WaitCard0ff() ;
}else continue ;
ret = rfid_ _anticoll(card_ _id);
if(ret == 0K){
printf("card ID:");
for(i=0;i<4;i++)
printf("0x%02x ",card_ _id[i]);
puts("");
WaitCard0ff();
}else continue;
}
return 0;
要写入的卡片的内容,有两个内容,一个是防冲撞获取卡号,另外是它携带的参数两个字节号,PCD_ TRANSCEIVE 参数几乎是不变的,都叫做 TRANSCEIVE 是传输的意思,就是发送并接收数据。总之就是传进去之后它能拿到一个 buf,而 buf 里面,如果说是状态为 success 的话,那么是能得到它的卡号的,把卡号放到card_num 里面。返回就能够把卡的 ID 打印出来。看到卡号之后同时明白了一个道理,就是为什么当刷一次卡,在卡没有离开之前,它并不会连续输出卡号,就是下面的用到的是 WaitCard0ff(); 接口的主要作用其实就是等待卡的离开,如果卡不离开,它会进行阻塞,不会继续往下执行。它的操作其实非常简单, rfid_ carda_ request 就是寻卡指令。
:void WaitCard0ff(、
void)
unsigned char status, TagType[2];
while(1)
{
statusI= rfid_ carda_ request(PICC_ REQALL, TagType);
//需 要多次判断才准确
if(status){
status = rfid_ _carda_ request(PICC_ _REQALL, TagType);
if(status){
status = rfid_ carda_ request(PICC_ REQALL, TagType);
if(status)
return;
}
}
usleep(30*1000) ;
}
如果够寻到卡,那就让它循环。那如果寻不到张卡的时候,就进行 return。意思就是没有卡了,可以走了。因为它寻的是所有的卡,所有的卡都不在就可以退出了。调三次是为了提高可靠性。如股票有第一次误判了的话,那还有第二次还有第三次。绝对的保障了卡片不会重复写入,以上就是的第二个代码有关卡的类型和卡的ID 的录取的流程。