由于最近参加的项目需要使用RFID,所以这两天一直在搞这个鬼。原来从未接触过这个模块,只知道校园卡是这个原理,完全从小白开始接触使用。所以我只记录如何使用,并不讲其原理,原理我也不懂。
先说项目需求:要求使用RFID模块连接STM32,刷卡后将ID号送给32,(其实很简单的一个东西,搞了好长时间)。
使用的是实验室的北京博创智联的试验箱里面的读写模块,开始用的是13.56M频率的读写模块(实验室的学长原来用过,所以打算请教他看他的代码原理),代码如下
int Card_Request(){
uchar txbuff[11];
uchar rxbuff[11];
int i = 0;
uchar len = 0;
txbuff[0]=0x02;
txbuff[1]=0x20;
txbuff[2]=0x52;
tty_fflush();
tty_write(txbuff,3);
usleep(100);
//read
tty_read(&len,1);
tty_read(rxbuff,len);
fflush(stdout);
if(len > 1){
return 1;
}else{
return -1;
}
}
//01 21
int Card_Anticoll(uchar *card_NO){
uchar txbuff[11];
uchar rxbuff[11];
int i = 0;
uchar len = 0;
txbuff[0]=0x01;
txbuff[1]=0x21;
tty_fflush();
tty_write(txbuff,2);
usleep(100);
//read
tty_read(&len,1);
tty_read(rxbuff,len);
fflush(stdout);
if(len > 1){
memcpy(card_NO,&rxbuff[1],4);
return 1;
}else{
return -1;
}
}
这是主函数:
while(1){
printf("Press any key to contiue...\n");
while(1){
if((Card_Request() < 0))
continue;
break;
}
if(Card_Anticoll(card_NO) < 0)
continue;
printf("CARD NO:\t");
for(i = 0;i < 4;i ++){
printf("%02X",card_NO[i]);
}
printf("\n");
memcpy(id,&card_NO[0],4);
break;
}
可以看出其命令,先是通过串口向该模块发送0x02,0x20,0x52然后就等待若接受到数据则又向模块发送0x01,0x21,然后接受四个字节的卡号;模拟其过程在32上却接受不到卡号,不知什么原因;可能上面的几个命令需要更改,但是找遍了试验箱的材料也没找到有关的任何东西,产品光盘里只有一个串口软件,(这里强烈建议改试验箱能多一些有关RFID的实验和命令讲解)用来测试几个读写器;
打开软件发现了另外一个模块(125k只读器)完全可以用来做我的项目。因为125k是只读,对应的卡也没有rom不能写入数据,而我只需要读出对应的卡号即可;该模块识别到卡后自动将卡号通过串口发送出去,所以我就省事了,只用在32上写一个接受5字节的串口中断就可以了;当然注意是5字节,(划重点)第一字节都是00,(开始在串口工具里接受到的只有四字节的数据,我就以为是4字节卡号)忘记了这个的话串口的接受程序会出错的;接下来我就可以实现我的功能了,贴出32的代码:
主程序:
while(1) {
if(mkey_read() ==0)
{
uart2_send_byte(w);
beep_on();
tb_delay_ms(100);
beep_off();
}
if(card_ok)
{
USART_Cmd(USART3, DISABLE);
card_ok =0;
card_index= 0;
id = id_pipei();
if(id)
{
beep_on();
tb_delay_ms(100);
beep_off();
printf((char *)idss, "%2d,login sucess",id);
tb_usart2_send_str((u8*)idss);
}
else
{
//tb_usart2_send_nbyte(id,4);
tb_usart2_send_str((u8*)"false");
}
USART_Cmd(USART3, ENABLE);
}
中断程序:
int USART3_IRQHandler(void) {
if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
w=USART_ReceiveData(USART3);
//USART_SendData(USART2,w);
}
if(w !=0x00)
{
id_buf[card_index] = w;
card_index++;
if(card_index >3)
{
card_ok =1;
}
else
{
card_ok = 0;
}
}
return 0;
}
当然我这只是测试用,接受到卡号后与我事先定义好的数组对比,对比成功直接返回数组索引号;