stm32驱动RFID高频读卡器读取IC卡

这篇具有很好参考价值的文章主要介绍了stm32驱动RFID高频读卡器读取IC卡。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.介绍RFID

RFID(Radio-Frequency Identification)高频读卡器是一种设备,用于读取和解析高频(13.56 MHz)频段上的RFID标签信息。这种读卡器通过无线射频技术与标签进行通信,并从标签中获取存储的数据。
RFID高频读卡器通常包括以下主要组件
读卡器天线:用于发射和接收射频信号,与标签进行通信。
处理器:负责解析和处理从标签接收到的数据,以及将数据传输给相应的应用程序。
电源和接口:提供电力和连接读卡器与其他设备/系统的接口。
控制单元:用于控制读卡器的操作和配置。
RFID高频读卡器常用于各种场景,如物流管理、库存跟踪、门禁控制、资产管理等。它们可以与其他设备(如计算机、智能手机、门禁系统)进行通信,以便实现各种应用需求。
需要注意的是,RFID技术还有其他频段,如低频(LF)和超高频(UHF),每个频段的读卡器具有不同的特点和应用领域。
我们这里介绍的是RFID高频读卡器。

2.RFID控制指令

2.1 读IC卡号

stm32驱动RFID高频读卡器读取IC卡
发送十六进制命令: 01 08 A1 20 00 01 00 76
成功, 读写器返回十六进制数据: 01 0C A1 20 00 04 00 0A DC EF F9 B7, 其中 04 00 为卡类型, 0A DC
EF F9 为卡号
失败, 读写器返回十六进制数据: 01 08 A1 20 01 00 00 76

2.2 读IC卡数据块

stm32驱动RFID高频读卡器读取IC卡
假如块 2 中的数据为: 78 56 34 12 87 A9 CB ED 78 56 34 12 02 FD 02 FD
例 1: 验证卡的 KEYA, 读数据块 2 的数据, LED 和蜂鸣器不提示, 命令与返回包如下:
上位机发送十六进制命令: 01 08 A3 20 02 00 00 77
成功, 读写器返回十六进制数据: 01 16 A3 20 00 78 56 34 12 87 A9 CB ED 78 56 34 12 02 FD 02 FD 63
失败, 读写器返回十六进制数据: 01 08 A3 20 01 00 00 74
例 2: 验证卡的 KEYB, 读数据块 2 的数据, LED 和蜂鸣器不提示, 命令与返回包如下:
上位机发送十六进制命令: 01 08 5C 20 02 00 00 88
成功, 读写器返回十六进制数据: 01 16 5C 20 00 78 56 34 12 87 A9 CB ED 78 56 34 12 02 FD 02 FD 9C
失败, 读写器返回十六进制数据: 01 08 5C 20 01 00 00 8B

2.3 写数据到IC卡数据块

stm32驱动RFID高频读卡器读取IC卡
写 16 字节数据 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 到块 2
例 1: 验证卡的 KEYA, 写数据块 2, LED 与蜂鸣器的状态提示开启, 命令与返回包如下:
上位机发送十六进制命令: 01 17 A4 20 02 01 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 6E
成功, 读写器返回十六进制数据: 01 08 A4 20 00 00 00 72
失败, 读写器返回十六进制数据: 01 08 A4 20 01 00 00 73
例 2: 验证卡的 KEYB , 写数据块 2, LED 与蜂鸣器的状态提示开启, 命令与返回包如下:
上位机发送十六进制命令: 01 17 5B 20 02 01 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 91
成功, 读写器返回十六进制数据: 01 08 5B 20 00 00 00 8D
失败, 读写器返回十六进制数据: 01 08 5B 20 01 00 00 8C

2.4 读取RFID读卡器用户数据

stm32驱动RFID高频读卡器读取IC卡
例 :用户在从地址 03 开始存储了 6 个字节的数据, 分别是 01 02 03 04 05 06, 查询这个 6 个字节数据, 命令与
返回包如下:
上位机发送十六进制命令: 02 08 B5 20 03 06 00 65
读写器返回十六进制数据: 02 0C B5 20 00 01 02 03 04 05 06 63
每次读用户内存的字节数不超过 16 字节, 地址空间从 0x00-0x1F,总共 32 字节。

2.5 向RFID读卡器写入用户数据

stm32驱动RFID高频读卡器读取IC卡
读写器提供 32 字节的内存空间, 地址空间 0-1F, 供用户存储数据, 当内存使用(比如存储用户自己的序列号,
验证码, 用于跟自己的设备或者上位机管理软件验证, 是否为合法读写设备) ; 用户可以简单的通过命令对读写
器提供的存储空间进行存取。 可以将数据存储在指定的地址空间。 每次存储数据字节数不能大于 16 字节。
例 1:如在地址 05 开始处顺序存储 5 个字节:0x12 0x34,0x56,0x78,0x09 , 令与返回包如下:
上位机发送十六进制命令: 03 0B C5 20 05 12 34 56 78 09 16
成功, 读写器返回十六进制数据: 03 08 C5 20 00 00 00 11
失败, 读写器返回十六进制数据: 03 08 C5 20 01 00 00 10

3.代码实例

这里我写了以上操作指令代码,这些代码可移植性强,方便调用。你们可以结合自己的需要去使用。
比如搞一个门禁系统,校园卡等

3.1 rfid.c 源文件

这里就是串口代码没提供,代码太多了,贴不下,你们可以用你们自己的串口代码。
不过我也会提供完成源码。

#include "stm32f10x.h"
#include "usart3.h"
#include "usart.h"
#include "rfid.h"
#include "stdio.h"

unsigned char Uart3RxBuf[UART3_RX_BUF_LEN];
unsigned char Uart3RxDataConut = 0;
unsigned char Rx3Flag = 0;

unsigned char Cmd_Read_Id[8] = {0x01,0x08,0xa1,0x20,0x00,0x00,0x00,0x00};
unsigned char Cmd_Read_Block[8]	= {0x01,0x08,0xa3,0x20,0x00,0x00,0x00,0x00};
unsigned char Cmd_Write_Block[23] = {0x01,0x17,0xa4,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

unsigned char WBlockData[16] = {0x11,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
//CircularBuffer *Uart2_Circular_Buffer;
unsigned char Cmd_Write_RFID[0x0B]={0x03, 0x0B, 0xC5, 0x20, 0x05, 0x12, 0x34, 0x56, 0x78, 0x09, 0x16};
 //                          命令类型  包长度  命令  设备地址  起始地址  数据长度   保留  校验和
unsigned char Cmd_Read_RFID[]={0x02,   0x08,   0xB5,  0x20,    0x03,      0x06,     0x00,  0x65};

//延时,10000000大约为1S
void Delay(__IO unsigned int nCount)
{
  for (; nCount != 0; nCount--);
}

void Uart3_Send_Data(unsigned char *buf,unsigned char num)
{
	unsigned char i;
	for(i=0;i<num;i++)
	{ 
	 	USART_SendData(USART3, buf[i]);
	 	while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
	}	
}

unsigned char RxCheckSum(unsigned char *ptr,unsigned char len) //计算校验值 
{
	unsigned char i;
	unsigned char checksum;
	checksum = 0;
	for(i=0;i<(len-1);i++)
	{
		   checksum ^= ptr[i];
	}
	checksum = ~checksum;
	if(ptr[len-1] == checksum)
		return 	STATUS_OK;
	else 
		return 	STATUS_ERR;
}

void TxCheckSum(unsigned char *ptr,unsigned char len)
{
	unsigned char i;
	unsigned char checksum;
	checksum = 0;
	for(i=0;i<(len-1);i++)
	{
		   checksum ^= ptr[i];
	}
	checksum = ~checksum;
	ptr[len-1] = checksum;
}
//ReadId():读IC卡ID号(卡号)
//参数:*idout,读取的卡号保存到它所指向的存储空间
//返回值:0:成功读取卡号,1:读卡号失败
unsigned char ReadId(void)
{
	unsigned char status;
	unsigned char i;
	unsigned char idout[6];
	Cmd_Read_Id[5] = 0x01;//开启蜂鸣器提示
	//Cmd_Read_Id[5] = 0x00;//关闭蜂鸣器提示
	TxCheckSum(Cmd_Read_Id,Cmd_Read_Id[1]);		//计算校验和
	Uart3_Send_Data(Cmd_Read_Id,Cmd_Read_Id[1]);		 //发送读卡号ID命令
	Delay(2000000);//等待模块返回数据,大于150MS
 	if(Rx3Flag == 1)
 	{	
		Rx3Flag = 0;
		status = RxCheckSum(Uart3RxBuf,Uart3RxBuf[1]);//对接收到的数据校验
		if(status != STATUS_OK)  //判断校验和是否正确
		{
			return STATUS_ERR;
		}
		status = Uart3RxBuf[4];
		if(status != STATUS_OK)	//判断是否正确的读到卡
		{
		 	return STATUS_ERR;
		}
		if((Uart3RxBuf[0] == 0x01)&&(Uart3RxBuf[2] == 0xa1))//判断是否为读卡号返回的数据包
		{
			for(i=0;i<6;i++)//获取卡号ID,6字节		 
			{
				idout[i] = Uart3RxBuf[i+5];//从数组的第5个字节开始为卡号,长度为6字节
			}
			for(i=0;i<6;i++)
		{
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
			USART_SendData(USART1,idout[i]); 
		}
			return STATUS_OK;		 //成功返回0
		}
 	} 
	return STATUS_ERR;			//失败返回1
}


//ReadId():读IC卡数据块
//参数:*idout,读取的数据保存到它所指向的存储空间
//参数:block,块号
//返回值:0:成功读取,1:读读取失败
unsigned char ReadDataFromBlock(unsigned char *dataout,unsigned char block)
{
	unsigned char status;
	unsigned char i;
	Cmd_Read_Block[4] = block;
	Cmd_Read_Block[5] = 0x01;//开启蜂鸣器提示
//	Cmd_Read_Block[5] = 0x00;//关闭蜂鸣器提示
	TxCheckSum(Cmd_Read_Block,Cmd_Read_Block[1]);	//数据校验
	Uart3_Send_Data(Cmd_Read_Block,Cmd_Read_Block[1]);		 //发送读数据块命令
	Delay(2000000);//等待模块返回数据,大于150MS
 	if(Rx3Flag == 1)
 	{	
		Rx3Flag = 0;
		status = RxCheckSum(Uart3RxBuf,Uart3RxBuf[1]);//对接收到的数据校验
		if(status != STATUS_OK)		 //判断校验和是否正确
		{
			return 	STATUS_ERR;
		}
		status = Uart3RxBuf[4];		//获取返回包状态
		if(status != STATUS_OK)	//判断是否正确的读到卡
		{
			return STATUS_ERR;
		}
		if((Uart3RxBuf[0] == 0x01)&&(Uart3RxBuf[2] == 0xa3))//判断是否为读块数据返回的数据包
		{
			for(i=0;i<16;i++)//获取块数据,16字节	,一个数据块的大小为16字节	 
			{
				dataout[i] = Uart3RxBuf[i+5];//从数组的第5个字节开始为数据,长度为16字节
			}
			return STATUS_OK;		 //成功返回0
		}
	}
	return STATUS_ERR;			//失败返回1
}
//ReadId():写数据到指定的数据块
//参数:*idout,指向要写入数据的缓冲区
//参数:block,块号
//返回值:0:写入成功,1:写入失败
unsigned char WriteDataToBlock(unsigned char *datain,unsigned char block)
{
	unsigned char status;
	unsigned char i;
	Cmd_Write_Block[4] = block;
	for(i=0;i<16;i++)
	{
		Cmd_Write_Block[6+i] = datain[i];
	}
	TxCheckSum(Cmd_Write_Block,Cmd_Write_Block[1]);	//数据校验
	Uart3_Send_Data(Cmd_Write_Block,Cmd_Write_Block[1]);		 //发送写命令
	Delay(2000000);//等待模块返回数据,大于150MS
 	if(Rx3Flag == 1)
 	{	
		Rx3Flag = 0;
		status = RxCheckSum(Uart3RxBuf,Uart3RxBuf[1]);//对返回的数据进行校验
		if(status != STATUS_OK) //判断校验是否通过
		{
			return STATUS_ERR;
		}
		status = Uart3RxBuf[4];
		if(status != STATUS_OK) //判断校验是否通过
		{
			return STATUS_ERR;
		}
		if((Uart3RxBuf[0] == 0x01)&&(Uart3RxBuf[2] == 0xa4))//判断是否为写块数据返回的数据包
		{
				return STATUS_OK;		 //成功返回0
		}
 	} 
	return STATUS_ERR;			//失败返回1
}
//读RFID用户空间
unsigned char Read_RFID(unsigned char addr,unsigned char len)
{
  unsigned char status;
  unsigned char i;
    Cmd_Read_RFID[4]=addr;
    Cmd_Read_RFID[5]=len;
	TxCheckSum(Cmd_Read_RFID,Cmd_Read_RFID[1]);		//计算校验和
	Uart3_Send_Data(Cmd_Read_RFID,Cmd_Read_RFID[1]);		 //发送读用户数据命令
	Delay(2000000);//等待模块返回数据,大于150MS
 	if(Rx3Flag == 1)
 	{	
        
		Rx3Flag = 0;
		status = RxCheckSum(Uart3RxBuf,Uart3RxBuf[1]);//对接收到的数据校验
		if(status != STATUS_OK)  //判断校验和是否正确
		{
			return STATUS_ERR;
		}
		status = Uart3RxBuf[4];
		if(status != STATUS_OK)	//判断是否正确的读到卡
		{
		 	return STATUS_ERR;
		}
		if((Uart3RxBuf[0] == 0x02)&&(Uart3RxBuf[2] == 0xB5))//判断是否为读RFID用户信息返回的数据包
		{
			
			for(i=0;i<Cmd_Read_RFID[5];i++)   //将读取的RFID打印到串口
		{
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); 
			USART_SendData(USART1,Uart3RxBuf[i+5]); 
		}
			return STATUS_OK;		 //成功返回0
		}
 	} 
	return STATUS_ERR;	
}
//写RFID 用户空间
unsigned char Write_RFID(unsigned char addr,unsigned char * data,unsigned char len)
{ 
    unsigned char status;
	unsigned char i;
    unsigned char cmd[22]={0x03, 0x0B, 0xC5, 0x20};
	cmd[4] =addr;//地址
    cmd[1]=6+len;//长度
	for(i=0;i<len;i++)
	{
		cmd[5+i] = data[i];
	}
	TxCheckSum(cmd,cmd[1]);	//数据校验
	Uart3_Send_Data(cmd,cmd[1]);	 //发送写命令
	Delay(2000000);//等待模块返回数据,大于150MS
 	if(Rx3Flag == 1)
 	{	
		Rx3Flag = 0;
		status = RxCheckSum(Uart3RxBuf,Uart3RxBuf[1]);//对返回的数据进行校验
		if(status != STATUS_OK) //判断校验是否通过
		{
			return STATUS_ERR;
		}
		status = Uart3RxBuf[4];
		if(status != STATUS_OK) //判断校验是否通过
		{
			return STATUS_ERR;
		}
		if((Uart3RxBuf[0] == 0x03)&&(Uart3RxBuf[2] == 0xc5))//判断是否为写块数据返回的数据包
		{        
             for(i=0;i<len;i++)   //将写入的数据打印到串口
		{
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); 
			USART_SendData(USART1,cmd[i+5]); 
		}
				return STATUS_OK;		 //成功返回0
		}
 	} 
	return STATUS_ERR;			//失败返回1
}

3.2 rfid 头文件

#ifndef _RFID_H
#define _RFID_H

#define STATUS_OK			0x00
#define STATUS_ERR    0x01

#define UART3_RX_BUF_LEN 30
extern unsigned char Uart3RxBuf[];
extern unsigned char Uart3RxDataConut ;
extern unsigned char Rx3Flag;
unsigned char ReadId(void);
unsigned char Write_RFID(unsigned char addr,unsigned char * data,unsigned char len);
unsigned char Read_RFID(unsigned char addr,unsigned char len);
#endif

4. 结语

以上就说指令集以及实现代码了。你们可以拿去使用,改造成你项目中所需要的。
最后如果想要串口代码或者完整工程的可以评论区或者私信我哦!文章来源地址https://www.toymoban.com/news/detail-504662.html

到了这里,关于stm32驱动RFID高频读卡器读取IC卡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PHP实现轻量级WEB服务器接收HTTP提交的RFID刷卡信息并回应驱动读卡器显示播报语音

     本示例使用的读卡器:RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com)

    2024年02月12日
    浏览(32)
  • STM32CubeMX教程30 USB_DEVICE - MSC外设_读卡器

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 USB_OTG_FS为工作在Mass Storage Class(大容量存储类)模式下的USB_DEVICE(USB从机),使其作为SD卡读卡器在Windows系

    2024年02月19日
    浏览(34)
  • 【正点原子STM32连载】 第六十章 USB读卡器实验摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 本章,我们将向大家介绍如何利用USB OTG FS在STM32F1开发板实现一个USB 读卡器。本章分为如下几个部分

    2024年02月16日
    浏览(45)
  • 【正点原子STM32连载】 第六十一章 USB读卡器(Slave)实验摘自【正点原子】APM32F407最小系统板使用指南

    1)实验平台:正点原子APM32F407最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html## 本章将介绍使用APM32F407作为USB从设备,模拟出USB读卡器,使得PC与APM32F407通过USB连接后,能够访问与

    2024年02月21日
    浏览(47)
  • 实时在线云消费机、考勤门禁控制器、网络读卡器服务端C# Socket源码

      消费机UDP通讯协议介绍: 设备向服务器发送的指令格式,每个字段用半角逗号(,)分隔。 序号 指令名称 指令格式 指令说明 示例 1 响应服务器的搜索 100,包序列号,终端IP,子网掩码,网关IP,远程电脑主机IP,端口号,终端硬件号 响应电脑发出的搜寻局域网内所有终端设备指令000

    2024年02月10日
    浏览(46)
  • 身份证阅读器和社保卡读卡器Harmony鸿蒙系统ArkTS语言SDK开发包

    项目需求,用ArkTS新一代开发语言实现了在Harmony鸿蒙系统上面兼容身份证阅读器和社保卡读卡器,调用了DonseeDeviceLib.har这个读卡库。 需要注意的是,鸿蒙系统的app扩展名为.hap,本项目编译输出的应用为:entry-default-signed.hap 下面是调用身份证阅读器读取身份证信息的接口,支

    2024年02月03日
    浏览(67)
  • 晨控CK-FR03-EIP读卡器与欧姆龙NX/NJ系列EtherNet/IP通讯手册

    晨控CK-FR03-EIP读卡器与欧姆龙NX/NJ系列EtherNet/IP通讯手册 CK-FR03-EIP是一款基于射频识别技术的高频RFID标签读卡器,读卡器工作频率为13.56MHZ,支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。 读卡器同时支持标准工业通讯协议EtherNet IP,方便用户通集成到PLC等

    2024年02月01日
    浏览(47)
  • STM32F103+RFID-RC522模块 实现简单读卡写卡demo

    本仓库发布的程序,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 本人对任何脚本问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害。 间接使用脚本的任何用户,包括但不限于建立VPS或

    2023年04月09日
    浏览(37)
  • 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522

    目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3.2 配置调试方式 3.3 配置时钟电路 3.4 配置时钟 3.5 配置GPIO 3.6 配置SPI 3.7 配置串口 3.8 项目配置 4. MDK工程驱动代码调试 4.1 按键、LED程序 4.1.1 Us

    2024年02月09日
    浏览(45)
  • 基础篇010.3 STM32驱动RC522 RFID模块之三:STM32软件模拟SPI驱动RC522

    目录   1. 实验硬件及原理图 2. 利用STM32CubeMX创建MDK工程 2.1 STM32CubeMX工程创建 2.2 配置调试方式 2.3 配置时钟电路 2.4 配置时钟 2.5 配置GPIO 2.6 配置串口 2.7 项目配置 3. MDK工程驱动代码调试 3.1 按键、LED程序 3.2 SPI软件模拟程序 3.3 RC522驱动程序 3.4 UART串口printf,scanf函数串口重定

    2024年04月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包