2017-11-9 10:34 上傳
點(diǎn)擊文件名下載附件
參考代碼\
51單片機(jī)實(shí)例代碼A2B2C1\
C#\
STM32讀卡號(hào)讀寫數(shù)據(jù)代碼示例3.0(C語言)\
開發(fā)文檔\
HF高頻讀寫器SDK使用說明V1.0.1.pdf
RFID產(chǎn)品選型手冊(cè).pdf
高頻讀寫器系列使用手冊(cè)V1.0.3.pdf
測試軟件\
HF讀寫器測試軟件V1.0.3.exe
自動(dòng)讀卡被動(dòng)上傳數(shù)據(jù)測試軟件V1.0.1.exe
注意USB接口讀寫器請(qǐng)安裝我們提供的驅(qū)動(dòng).txt
51單片機(jī)實(shí)例代碼C1說明:
代碼實(shí)現(xiàn)功能
一.
1.通過按鍵來設(shè)置讀卡器的工作模式 ,讀卡號(hào),讀數(shù)據(jù)塊,寫數(shù)據(jù)塊,在代碼中RFID()函數(shù),函數(shù)采用發(fā)送完指令后等待讀卡器返回?cái)?shù)據(jù)包的方式完成操作(即發(fā)送完指令等待一段時(shí)間(程序中是100MS),然后去讀串口標(biāo)志位,是否接收到一包數(shù)據(jù),做對(duì)應(yīng)處理),這種方式比較占用系統(tǒng)的時(shí)間,不能是代碼高效率的執(zhí)行,因?yàn)槊看伟l(fā)送完指令后都要等待串口接收數(shù)據(jù)。
二.
按鍵設(shè)置讀卡器工作模式:RFID()函數(shù)
A.按鍵KEY1用來設(shè)置讀卡器的工作模式,當(dāng)按鍵被按下時(shí),讀卡器的工作模式會(huì)按順序循環(huán)切換,每按一下并松開按鍵,模式就切換一下,切換順序是:被動(dòng)(命令)模式,主動(dòng)讀卡號(hào),主 動(dòng)讀指定數(shù)據(jù)塊,主動(dòng)讀卡號(hào)與指定數(shù)據(jù)塊數(shù)。
B.按鍵KEY2被按下的時(shí)候,發(fā)送讀卡號(hào)指令給讀卡器完成讀卡號(hào)操作
C.按鍵KEY3被按下的時(shí)候,發(fā)送讀指定數(shù)據(jù)塊指令給讀卡器完成讀數(shù)據(jù)塊操作,程序中讀的是數(shù)據(jù)塊10的數(shù)據(jù)。
D.按鍵KEY4被按下的時(shí)候,發(fā)送寫指定數(shù)據(jù)塊指令給讀卡器完成寫數(shù)據(jù)塊操作,程序中寫的是數(shù)據(jù)塊10的數(shù)據(jù),寫的數(shù)據(jù)是:00112233445566778899aabbccddeeff
E.主動(dòng)讀卡號(hào)數(shù)據(jù)包,主動(dòng)讀指定數(shù)據(jù)塊數(shù)據(jù)包,主動(dòng)讀卡號(hào)與指定數(shù)據(jù)塊數(shù)據(jù)包的接收處理
51單片機(jī)實(shí)例代碼B2說明
代碼實(shí)現(xiàn)功能
一.
1.通過按鍵來設(shè)置讀卡器的工作模式 ,代碼中Key()函數(shù)
2.通過按鍵來讀卡號(hào),讀數(shù)據(jù)塊,寫數(shù)據(jù)塊 ,代碼中Key()函數(shù)
3.接收處理讀卡器工作在主動(dòng)讀卡器模式下的數(shù)據(jù)包以及處理設(shè)置讀卡器工作模式時(shí)讀卡器返回的數(shù)據(jù)包,代碼中ProcessUartRxData()函數(shù)
二.
按鍵設(shè)置讀卡器工作模式:Key()函數(shù)
按鍵KEY1用來設(shè)置讀卡器的工作模式,當(dāng)按鍵被按下時(shí),讀卡器的工作模式會(huì)按順序循環(huán)切換,每按一下并松開按鍵,模式就切換一下,切換順序是:被動(dòng)(命令)模式,主動(dòng)讀卡號(hào),主動(dòng) 讀指定數(shù)據(jù)塊,主動(dòng)讀卡號(hào)與指定數(shù)據(jù)塊數(shù)。
按鍵控制讀卡號(hào),讀指定數(shù)據(jù)塊,寫指定數(shù)據(jù)塊:
A.按鍵KEY2被按下的時(shí)候,發(fā)送讀卡號(hào)指令給讀卡器完成讀卡號(hào)操作
B.按鍵KEY3被按下的時(shí)候,發(fā)送讀指定數(shù)據(jù)塊指令給讀卡器完成讀數(shù)據(jù)塊操作,程序中讀的是數(shù)據(jù)塊10的數(shù)據(jù)。
C.按鍵KEY4被按下的時(shí)候,發(fā)送寫指定數(shù)據(jù)塊指令給讀卡器完成寫數(shù)據(jù)塊操作,程序中寫的是數(shù)據(jù)塊10的數(shù)據(jù),寫的數(shù)據(jù)是:00112233445566778899aabbccddeeff
接收處理實(shí)現(xiàn)了:ProcessUartRxData()函數(shù)
A.主動(dòng)讀卡號(hào)數(shù)據(jù)包,主動(dòng)讀指定數(shù)據(jù)塊數(shù)據(jù)包,主動(dòng)讀卡號(hào)與指定數(shù)據(jù)塊數(shù)據(jù)包的接收處理
B. 設(shè)置讀卡器工作模式時(shí)讀卡器返回的數(shù)據(jù)包的接收處理
C.實(shí)現(xiàn)了發(fā)送讀卡號(hào)指令,發(fā)送讀指定數(shù)據(jù)塊指令,發(fā)送寫指定數(shù)據(jù)塊指令,讀卡器返回?cái)?shù)據(jù)包的處理
51單片機(jī)實(shí)例代碼A2說明
代碼實(shí)現(xiàn)功能
一.
1.通過按鍵來設(shè)置讀卡器的工作模式 代碼中Key()函數(shù)
2.接收處理讀卡器工作在主動(dòng)讀卡器模式下的數(shù)據(jù)包以及處理設(shè)置讀卡器工作模式時(shí)讀卡器返回的數(shù)據(jù)包,代碼中ProcessUartRxData()函數(shù)
二.
按鍵設(shè)置讀卡器工作模式:Key()函數(shù)
A.按鍵KEY1被按下的時(shí)候,設(shè)置讀卡器的工作模式為主動(dòng)讀卡號(hào)模式
B.按鍵KEY2被按下的時(shí)候,設(shè)置讀卡器的工作模式為主動(dòng)讀指定數(shù)據(jù)塊模式
C.按鍵KEY3被按下的時(shí)候,設(shè)置讀卡器的工作模式為主動(dòng)讀卡號(hào)+指定數(shù)據(jù)塊模式
接收處理實(shí)現(xiàn)了:ProcessUartRxData()函數(shù)
A.主動(dòng)讀卡號(hào)數(shù)據(jù)包,主動(dòng)讀指定數(shù)據(jù)塊數(shù)據(jù)包,主動(dòng)讀卡號(hào)與指定數(shù)據(jù)塊數(shù)據(jù)包的接收處理
B. 設(shè)置讀卡器工作模式時(shí)讀卡器返回的數(shù)據(jù)包的接收處理
STM32讀卡號(hào)讀寫數(shù)據(jù)代碼示例3.0(C語言)單片機(jī)源程序如下:
- #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; //定義數(shù)據(jù)結(jié)構(gòu)體
- NVIC_InitTypeDef NVIC_InitStructure2; //定義數(shù)據(jù)結(jié)構(gòu)體
-
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//將中斷矢量放到Flash的0地址
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//設(shè)置優(yōu)先級(jí)配置的模式,詳情請(qǐng)閱讀原材料中的文章
- //使能串口1中斷,并設(shè)置優(yōu)先級(jí)
- 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); //將結(jié)構(gòu)體丟到配置函數(shù),即寫入到對(duì)應(yīng)寄存器中
- //使能串口2中斷,并設(shè)置優(yōu)先級(jí)
- 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); //將結(jié)構(gòu)體丟到配置函數(shù),即寫入到對(duì)應(yīng)寄存器中
- }
- //延時(shí),10000000大約為1S
- void Delay(__IO unsigned int nCount)
- {
- for (; nCount != 0; nCount--);
- }
- //發(fā)送新封裝的包
- 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號(hào)(卡號(hào))
- //參數(shù):*idout,讀取的卡號(hào)保存到它所指向的存儲(chǔ)空間
- //返回值:0:成功讀取卡號(hào),1:讀卡號(hào)失敗
- unsigned char ReadId(unsigned char *idout)
- {
- unsigned char status;
- unsigned char i;
- Cmd_Read_Id[5] = 0x01;//開啟蜂鳴器提示
- //Cmd_Read_Id[5] = 0x00;//關(guān)閉蜂鳴器提示
- TxCheckSum(Cmd_Read_Id,Cmd_Read_Id[1]); //計(jì)算校驗(yàn)和
- Uart2_Send_Data(Cmd_Read_Id,Cmd_Read_Id[1]); //發(fā)送讀卡號(hào)ID命令
- Delay(2000000);//等待模塊返回?cái)?shù)據(jù),大于150MS
- if(Rx2Flag == 1)
- {
- Rx2Flag = 0;
- status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//對(duì)接收到的數(shù)據(jù)校驗(yàn)
- if(status != STATUS_OK) //判斷校驗(yàn)和是否正確
- {
- return STATUS_ERR;
- }
- status = Uart2RxBuf[4];
- if(status != STATUS_OK) //判斷是否正確的讀到卡
- {
- return STATUS_ERR;
- }
- if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa1))//判斷是否為讀卡號(hào)返回的數(shù)據(jù)包
- {
- for(i=0;i<6;i++)//獲取卡號(hào)ID,6字節(jié)
- {
- idout[i] = Uart2RxBuf[i+5];//從數(shù)組的第5個(gè)字節(jié)開始為卡號(hào),長度為6字節(jié)
- }
- return STATUS_OK; //成功返回0
- }
- }
- return STATUS_ERR; //失敗返回1
- }
- //ReadId():讀IC卡數(shù)據(jù)塊
- //參數(shù):*idout,讀取的數(shù)據(jù)保存到它所指向的存儲(chǔ)空間
- //參數(shù):block,塊號(hào)
- //返回值: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;//關(guān)閉蜂鳴器提示
- TxCheckSum(Cmd_Read_Block,Cmd_Read_Block[1]); //數(shù)據(jù)校驗(yàn)
- Uart2_Send_Data(Cmd_Read_Block,Cmd_Read_Block[1]); //發(fā)送讀數(shù)據(jù)塊命令
- Delay(2000000);//等待模塊返回?cái)?shù)據(jù),大于150MS
- if(Rx2Flag == 1)
- {
- Rx2Flag = 0;
- status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//對(duì)接收到的數(shù)據(jù)校驗(yàn)
- if(status != STATUS_OK) //判斷校驗(yàn)和是否正確
- {
- return STATUS_ERR;
- }
- status = Uart2RxBuf[4]; //獲取返回包狀態(tài)
- if(status != STATUS_OK) //判斷是否正確的讀到卡
- {
- return STATUS_ERR;
- }
- if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa3))//判斷是否為讀塊數(shù)據(jù)返回的數(shù)據(jù)包
- {
- for(i=0;i<16;i++)//獲取塊數(shù)據(jù),16字節(jié) ,一個(gè)數(shù)據(jù)塊的大小為16字節(jié)
- {
- dataout[i] = Uart2RxBuf[i+5];//從數(shù)組的第5個(gè)字節(jié)開始為數(shù)據(jù),長度為16字節(jié)
- }
- return STATUS_OK; //成功返回0
- }
- }
- return STATUS_ERR; //失敗返回1
- }
- //ReadId():寫數(shù)據(jù)到指定的數(shù)據(jù)塊
- //參數(shù):*idout,指向要寫入數(shù)據(jù)的緩沖區(qū)
- //參數(shù):block,塊號(hào)
- //返回值: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]); //數(shù)據(jù)校驗(yàn)
- Uart2_Send_Data(Cmd_Write_Block,Cmd_Write_Block[1]); //發(fā)送寫命令
- Delay(2000000);//等待模塊返回?cái)?shù)據(jù),大于150MS
- if(Rx2Flag == 1)
- {
- Rx2Flag = 0;
- status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//對(duì)返回的數(shù)據(jù)進(jìn)行校驗(yàn)
- if(status != STATUS_OK) //判斷校驗(yàn)是否通過
- {
- return STATUS_ERR;
- }
- status = Uart2RxBuf[4];
- if(status != STATUS_OK) //判斷校驗(yàn)是否通過
- {
- return STATUS_ERR;
- }
- if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa4))//判斷是否為寫塊數(shù)據(jù)返回的數(shù)據(jù)包
- {
- return STATUS_OK; //成功返回0
- }
- }
- return STATUS_ERR; //失敗返回1
- }
- int main(void)
- {
- //串口2連接讀卡器
- //串口1連接上位機(jī)
- unsigned char status;
- unsigned char id[6];
- unsigned char blockdata[16];
-
- SystemInit(); //初始化系統(tǒng)
- NVIC_Configuration(); //初始化相關(guān)中斷
- COM1_2_Init(); //初始化UART1,UART2
- Rx1Flag = 0;
- Rx2Flag = 0;
- Uart1RxDataConut = 0;
- Uart2RxDataConut = 0;
- while(1)
- {
- /*************調(diào)用讀卡號(hào)函數(shù)ReadId()將卡號(hào)ID讀入到指定的緩沖區(qū)id中************************************/
- status = ReadId(id); //讀卡號(hào)
- if(status == STATUS_OK) //判斷讀卡號(hào)是否成功,等于0成功
- {
- Uart1_Send_Data(id,6); //從串口1把讀取到的卡號(hào)發(fā)送出去
- }
- else
- {
- ;//錯(cuò)誤處理
- }
- /*********************************************************************************************************/
- Delay(20000000);//延時(shí)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼