测试软件、开发文档、参考代码.
全部资料51hei下载地址:
RFID读写器二次开发资料.rar
(3.8 MB, 下载次数: 59)
参考代码\
51单片机实例代码A2B2C1\
C#\
STM32读卡号读写数据代码示例3.0(C语言)\
开发文档\
HF高频读写器SDK使用说明V1.0.1.pdf
RFID产品选型手册.pdf
高频读写器系列使用手册V1.0.3.pdf
测试软件\
HF读写器测试软件V1.0.3.exe
自动读卡被动上传数据测试软件V1.0.1.exe
注意USB接口读写器请安装我们提供的驱动.txt
51单片机实例代码C1说明:
代码实现功能
一.
1.通过按键来设置读卡器的工作模式 ,读卡号,读数据块,写数据块,在代码中RFID()函数,函数采用发送完指令后等待读卡器返回数据包的方式完成操作(即发送完指令等待一段时间(程序中是100MS),然后去读串口标志位,是否接收到一包数据,做对应处理),这种方式比较占用系统的时间,不能是代码高效率的执行,因为每次发送完指令后都要等待串口接收数据。
二.
按键设置读卡器工作模式:RFID()函数
A.按键KEY1用来设置读卡器的工作模式,当按键被按下时,读卡器的工作模式会按顺序循环切换,每按一下并松开按键,模式就切换一下,切换顺序是:被动(命令)模式,主动读卡号,主 动读指定数据块,主动读卡号与指定数据块数。
B.按键KEY2被按下的时候,发送读卡号指令给读卡器完成读卡号操作
C.按键KEY3被按下的时候,发送读指定数据块指令给读卡器完成读数据块操作,程序中读的是数据块10的数据。
D.按键KEY4被按下的时候,发送写指定数据块指令给读卡器完成写数据块操作,程序中写的是数据块10的数据,写的数据是:00112233445566778899aabbccddeeff
E.主动读卡号数据包,主动读指定数据块数据包,主动读卡号与指定数据块数据包的接收处理
51单片机实例代码B2说明
代码实现功能
一.
1.通过按键来设置读卡器的工作模式 ,代码中Key()函数
2.通过按键来读卡号,读数据块,写数据块 ,代码中Key()函数
3.接收处理读卡器工作在主动读卡器模式下的数据包以及处理设置读卡器工作模式时读卡器返回的数据包,代码中ProcessUartRxData()函数
二.
按键设置读卡器工作模式:Key()函数
按键KEY1用来设置读卡器的工作模式,当按键被按下时,读卡器的工作模式会按顺序循环切换,每按一下并松开按键,模式就切换一下,切换顺序是:被动(命令)模式,主动读卡号,主动 读指定数据块,主动读卡号与指定数据块数。
按键控制读卡号,读指定数据块,写指定数据块:
A.按键KEY2被按下的时候,发送读卡号指令给读卡器完成读卡号操作
B.按键KEY3被按下的时候,发送读指定数据块指令给读卡器完成读数据块操作,程序中读的是数据块10的数据。
C.按键KEY4被按下的时候,发送写指定数据块指令给读卡器完成写数据块操作,程序中写的是数据块10的数据,写的数据是:00112233445566778899aabbccddeeff
接收处理实现了:ProcessUartRxData()函数
A.主动读卡号数据包,主动读指定数据块数据包,主动读卡号与指定数据块数据包的接收处理
B. 设置读卡器工作模式时读卡器返回的数据包的接收处理
C.实现了发送读卡号指令,发送读指定数据块指令,发送写指定数据块指令,读卡器返回数据包的处理
51单片机实例代码A2说明
代码实现功能
一.
1.通过按键来设置读卡器的工作模式 代码中Key()函数
2.接收处理读卡器工作在主动读卡器模式下的数据包以及处理设置读卡器工作模式时读卡器返回的数据包,代码中ProcessUartRxData()函数
二.
按键设置读卡器工作模式:Key()函数
A.按键KEY1被按下的时候,设置读卡器的工作模式为主动读卡号模式
B.按键KEY2被按下的时候,设置读卡器的工作模式为主动读指定数据块模式
C.按键KEY3被按下的时候,设置读卡器的工作模式为主动读卡号+指定数据块模式
接收处理实现了:ProcessUartRxData()函数
A.主动读卡号数据包,主动读指定数据块数据包,主动读卡号与指定数据块数据包的接收处理
B. 设置读卡器工作模式时读卡器返回的数据包的接收处理
STM32读卡号读写数据代码示例3.0(C语言)单片机源程序如下:
- #include "stm32f10x.h"
- #include "Uart.h"
- #define STATUS_OK 0x00
- #define STATUS_ERR 0x01
- unsigned char Uart1RxBuf[UART1_RX_BUF_LEN];
- unsigned char Uart1RxDataConut = 0;
- unsigned char Rx1Flag = 0;
- unsigned char Uart2RxBuf[UART2_RX_BUF_LEN];
- unsigned char Uart2RxDataConut = 0;
- unsigned char Rx2Flag = 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,0xa5,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;
-
- //配置矢量中断,矢量的意思就是有顺序,有先后的意思。
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure1; //定义数据结构体
- NVIC_InitTypeDef NVIC_InitStructure2; //定义数据结构体
-
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//将中断矢量放到Flash的0地址
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置优先级配置的模式,详情请阅读原材料中的文章
- //使能串口1中断,并设置优先级
- NVIC_InitStructure1.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure1); //将结构体丢到配置函数,即写入到对应寄存器中
- //使能串口2中断,并设置优先级
- NVIC_InitStructure2.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 2;
- NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure2); //将结构体丢到配置函数,即写入到对应寄存器中
- }
- //延时,10000000大约为1S
- void Delay(__IO unsigned int nCount)
- {
- for (; nCount != 0; nCount--);
- }
- //发送新封装的包
- void Uart1_Send_Data(unsigned char *buf,unsigned char num)
- {
- unsigned char i;
- for(i=0;i<num;i++)
- {
- USART_SendData(USART1, buf[i]);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- }
- void Uart2_Send_Data(unsigned char *buf,unsigned char num)
- {
- unsigned char i;
- for(i=0;i<num;i++)
- {
- USART_SendData(USART2, buf[i]);
- while (USART_GetFlagStatus(USART2, 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(unsigned char *idout)
- {
- unsigned char status;
- unsigned char i;
- Cmd_Read_Id[5] = 0x01;//开启蜂鸣器提示
- //Cmd_Read_Id[5] = 0x00;//关闭蜂鸣器提示
- TxCheckSum(Cmd_Read_Id,Cmd_Read_Id[1]); //计算校验和
- Uart2_Send_Data(Cmd_Read_Id,Cmd_Read_Id[1]); //发送读卡号ID命令
- Delay(2000000);//等待模块返回数据,大于150MS
- if(Rx2Flag == 1)
- {
- Rx2Flag = 0;
- status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//对接收到的数据校验
- if(status != STATUS_OK) //判断校验和是否正确
- {
- return STATUS_ERR;
- }
- status = Uart2RxBuf[4];
- if(status != STATUS_OK) //判断是否正确的读到卡
- {
- return STATUS_ERR;
- }
- if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa1))//判断是否为读卡号返回的数据包
- {
- for(i=0;i<6;i++)//获取卡号ID,6字节
- {
- idout[i] = Uart2RxBuf[i+5];//从数组的第5个字节开始为卡号,长度为6字节
- }
- 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]); //数据校验
- Uart2_Send_Data(Cmd_Read_Block,Cmd_Read_Block[1]); //发送读数据块命令
- Delay(2000000);//等待模块返回数据,大于150MS
- if(Rx2Flag == 1)
- {
- Rx2Flag = 0;
- status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//对接收到的数据校验
- if(status != STATUS_OK) //判断校验和是否正确
- {
- return STATUS_ERR;
- }
- status = Uart2RxBuf[4]; //获取返回包状态
- if(status != STATUS_OK) //判断是否正确的读到卡
- {
- return STATUS_ERR;
- }
- if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa3))//判断是否为读块数据返回的数据包
- {
- for(i=0;i<16;i++)//获取块数据,16字节 ,一个数据块的大小为16字节
- {
- dataout[i] = Uart2RxBuf[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]); //数据校验
- Uart2_Send_Data(Cmd_Write_Block,Cmd_Write_Block[1]); //发送写命令
- Delay(2000000);//等待模块返回数据,大于150MS
- if(Rx2Flag == 1)
- {
- Rx2Flag = 0;
- status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//对返回的数据进行校验
- if(status != STATUS_OK) //判断校验是否通过
- {
- return STATUS_ERR;
- }
- status = Uart2RxBuf[4];
- if(status != STATUS_OK) //判断校验是否通过
- {
- return STATUS_ERR;
- }
- if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa4))//判断是否为写块数据返回的数据包
- {
- return STATUS_OK; //成功返回0
- }
- }
- return STATUS_ERR; //失败返回1
- }
- int main(void)
- {
- //串口2连接读卡器
- //串口1连接上位机
- unsigned char status;
- unsigned char id[6];
- unsigned char blockdata[16];
-
- SystemInit(); //初始化系统
- NVIC_Configuration(); //初始化相关中断
- COM1_2_Init(); //初始化UART1,UART2
- Rx1Flag = 0;
- Rx2Flag = 0;
- Uart1RxDataConut = 0;
- Uart2RxDataConut = 0;
- while(1)
- {
- /*************调用读卡号函数ReadId()将卡号ID读入到指定的缓冲区id中************************************/
- status = ReadId(id); //读卡号
- if(status == STATUS_OK) //判断读卡号是否成功,等于0成功
- {
- Uart1_Send_Data(id,6); //从串口1把读取到的卡号发送出去
- }
- else
- {
- ;//错误处理
- }
- /*********************************************************************************************************/
- Delay(20000000);//延时
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|