找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 6477|回復(fù): 0
收起左側(cè)

RFID讀寫器二次開發(fā)資料 源碼,文檔下載

[復(fù)制鏈接]
ID:247597 發(fā)表于 2017-11-9 10:34 | 顯示全部樓層 |閱讀模式
測試軟件、開發(fā)文檔、參考代碼.
0.png
全部資料51hei下載地址:
RFID讀寫器二次開發(fā)資料.rar (3.8 MB, 下載次數(shù): 59)


參考代碼\
51單片機(jī)實(shí)例代碼A2B2C1\
C#\
STM32讀卡號讀寫數(shù)據(jù)代碼示例3.0(C語言)\

開發(fā)文檔\
HF高頻讀寫器SDK使用說明V1.0.1.pdf
RFID產(chǎn)品選型手冊.pdf
高頻讀寫器系列使用手冊V1.0.3.pdf

測試軟件\
HF讀寫器測試軟件V1.0.3.exe
自動讀卡被動上傳數(shù)據(jù)測試軟件V1.0.1.exe

注意USB接口讀寫器請安裝我們提供的驅(qū)動.txt

51單片機(jī)實(shí)例代碼C1說明:
代碼實(shí)現(xiàn)功能

一.

1.通過按鍵來設(shè)置讀卡器的工作模式 ,讀卡號,讀數(shù)據(jù)塊,寫數(shù)據(jù)塊,在代碼中RFID()函數(shù),函數(shù)采用發(fā)送完指令后等待讀卡器返回數(shù)據(jù)包的方式完成操作(即發(fā)送完指令等待一段時間(程序中是100MS),然后去讀串口標(biāo)志位,是否接收到一包數(shù)據(jù),做對應(yīng)處理),這種方式比較占用系統(tǒng)的時間,不能是代碼高效率的執(zhí)行,因為每次發(fā)送完指令后都要等待串口接收數(shù)據(jù)。


二.
按鍵設(shè)置讀卡器工作模式:RFID()函數(shù)

                        A.按鍵KEY1用來設(shè)置讀卡器的工作模式,當(dāng)按鍵被按下時,讀卡器的工作模式會按順序循環(huán)切換,每按一下并松開按鍵,模式就切換一下,切換順序是:被動(命令)模式,主動讀卡號,主                            動讀指定數(shù)據(jù)塊,主動讀卡號與指定數(shù)據(jù)塊數(shù)。

            B.按鍵KEY2被按下的時候,發(fā)送讀卡號指令給讀卡器完成讀卡號操作
            C.按鍵KEY3被按下的時候,發(fā)送讀指定數(shù)據(jù)塊指令給讀卡器完成讀數(shù)據(jù)塊操作,程序中讀的是數(shù)據(jù)塊10的數(shù)據(jù)。
               D.按鍵KEY4被按下的時候,發(fā)送寫指定數(shù)據(jù)塊指令給讀卡器完成寫數(shù)據(jù)塊操作,程序中寫的是數(shù)據(jù)塊10的數(shù)據(jù),寫的數(shù)據(jù)是:00112233445566778899aabbccddeeff
            E.主動讀卡號數(shù)據(jù)包,主動讀指定數(shù)據(jù)塊數(shù)據(jù)包,主動讀卡號與指定數(shù)據(jù)塊數(shù)據(jù)包的接收處理


51單片機(jī)實(shí)例代碼B2說明
代碼實(shí)現(xiàn)功能

一.

1.通過按鍵來設(shè)置讀卡器的工作模式 ,代碼中Key()函數(shù)

2.通過按鍵來讀卡號,讀數(shù)據(jù)塊,寫數(shù)據(jù)塊 ,代碼中Key()函數(shù)

3.接收處理讀卡器工作在主動讀卡器模式下的數(shù)據(jù)包以及處理設(shè)置讀卡器工作模式時讀卡器返回的數(shù)據(jù)包,代碼中ProcessUartRxData()函數(shù)

二.
按鍵設(shè)置讀卡器工作模式:Key()函數(shù)

                        按鍵KEY1用來設(shè)置讀卡器的工作模式,當(dāng)按鍵被按下時,讀卡器的工作模式會按順序循環(huán)切換,每按一下并松開按鍵,模式就切換一下,切換順序是:被動(命令)模式,主動讀卡號,主動            讀指定數(shù)據(jù)塊,主動讀卡號與指定數(shù)據(jù)塊數(shù)。

按鍵控制讀卡號,讀指定數(shù)據(jù)塊,寫指定數(shù)據(jù)塊:

            A.按鍵KEY2被按下的時候,發(fā)送讀卡號指令給讀卡器完成讀卡號操作
            B.按鍵KEY3被按下的時候,發(fā)送讀指定數(shù)據(jù)塊指令給讀卡器完成讀數(shù)據(jù)塊操作,程序中讀的是數(shù)據(jù)塊10的數(shù)據(jù)。
               C.按鍵KEY4被按下的時候,發(fā)送寫指定數(shù)據(jù)塊指令給讀卡器完成寫數(shù)據(jù)塊操作,程序中寫的是數(shù)據(jù)塊10的數(shù)據(jù),寫的數(shù)據(jù)是:00112233445566778899aabbccddeeff

接收處理實(shí)現(xiàn)了:ProcessUartRxData()函數(shù)

        A.主動讀卡號數(shù)據(jù)包,主動讀指定數(shù)據(jù)塊數(shù)據(jù)包,主動讀卡號與指定數(shù)據(jù)塊數(shù)據(jù)包的接收處理
        B. 設(shè)置讀卡器工作模式時讀卡器返回的數(shù)據(jù)包的接收處理
        C.實(shí)現(xiàn)了發(fā)送讀卡號指令,發(fā)送讀指定數(shù)據(jù)塊指令,發(fā)送寫指定數(shù)據(jù)塊指令,讀卡器返回數(shù)據(jù)包的處理


51單片機(jī)實(shí)例代碼A2說明

代碼實(shí)現(xiàn)功能

一.

1.通過按鍵來設(shè)置讀卡器的工作模式 代碼中Key()函數(shù)

2.接收處理讀卡器工作在主動讀卡器模式下的數(shù)據(jù)包以及處理設(shè)置讀卡器工作模式時讀卡器返回的數(shù)據(jù)包,代碼中ProcessUartRxData()函數(shù)

二.
按鍵設(shè)置讀卡器工作模式:Key()函數(shù)

                        A.按鍵KEY1被按下的時候,設(shè)置讀卡器的工作模式為主動讀卡號模式
            B.按鍵KEY2被按下的時候,設(shè)置讀卡器的工作模式為主動讀指定數(shù)據(jù)塊模式
            C.按鍵KEY3被按下的時候,設(shè)置讀卡器的工作模式為主動讀卡號+指定數(shù)據(jù)塊模式

接收處理實(shí)現(xiàn)了:ProcessUartRxData()函數(shù)

        A.主動讀卡號數(shù)據(jù)包,主動讀指定數(shù)據(jù)塊數(shù)據(jù)包,主動讀卡號與指定數(shù)據(jù)塊數(shù)據(jù)包的接收處理
        B. 設(shè)置讀卡器工作模式時讀卡器返回的數(shù)據(jù)包的接收處理


STM32讀卡號讀寫數(shù)據(jù)代碼示例3.0(C語言)單片機(jī)源程序如下:
  1. #include "stm32f10x.h"
  2. #include "Uart.h"

  3. #define STATUS_OK                        0x00
  4. #define STATUS_ERR    0x01



  5. unsigned char Uart1RxBuf[UART1_RX_BUF_LEN];
  6. unsigned char Uart1RxDataConut = 0;
  7. unsigned char Rx1Flag = 0;

  8. unsigned char Uart2RxBuf[UART2_RX_BUF_LEN];
  9. unsigned char Uart2RxDataConut = 0;
  10. unsigned char Rx2Flag = 0;

  11. unsigned char Cmd_Read_Id[8] = {0x01,0x08,0xa1,0x20,0x00,0x00,0x00,0x00};
  12. unsigned char Cmd_Read_Block[8]        = {0x01,0x08,0xa3,0x20,0x00,0x00,0x00,0x00};
  13. 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};

  14. unsigned char WBlockData[16] = {0x11,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
  15. //CircularBuffer *Uart2_Circular_Buffer;

  16.          
  17. //配置矢量中斷,矢量的意思就是有順序,有先后的意思。
  18. void NVIC_Configuration(void)
  19. {
  20.   NVIC_InitTypeDef NVIC_InitStructure1;        //定義數(shù)據(jù)結(jié)構(gòu)體
  21.   NVIC_InitTypeDef NVIC_InitStructure2;        //定義數(shù)據(jù)結(jié)構(gòu)體
  22.   
  23.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//將中斷矢量放到Flash的0地址


  24.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//設(shè)置優(yōu)先級配置的模式,詳情請閱讀原材料中的文章

  25.   //使能串口1中斷,并設(shè)置優(yōu)先級
  26.   NVIC_InitStructure1.NVIC_IRQChannel = USART1_IRQn;
  27.   NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 1;
  28.   NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0;
  29.   NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;  
  30.   NVIC_Init(&NVIC_InitStructure1);        //將結(jié)構(gòu)體丟到配置函數(shù),即寫入到對應(yīng)寄存器中

  31.     //使能串口2中斷,并設(shè)置優(yōu)先級
  32.   NVIC_InitStructure2.NVIC_IRQChannel = USART2_IRQn;
  33.   NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 2;
  34.   NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 0;
  35.   NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;  
  36.   NVIC_Init(&NVIC_InitStructure2);        //將結(jié)構(gòu)體丟到配置函數(shù),即寫入到對應(yīng)寄存器中

  37. }

  38. //延時,10000000大約為1S
  39. void Delay(__IO unsigned int nCount)
  40. {
  41.   for (; nCount != 0; nCount--);
  42. }

  43. //發(fā)送新封裝的包
  44. void Uart1_Send_Data(unsigned char *buf,unsigned char num)
  45. {
  46.         unsigned char i;
  47.         for(i=0;i<num;i++)
  48.         {
  49.                  USART_SendData(USART1, buf[i]);
  50.                  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  51.         }       
  52. }

  53. void Uart2_Send_Data(unsigned char *buf,unsigned char num)
  54. {
  55.         unsigned char i;
  56.         for(i=0;i<num;i++)
  57.         {
  58.                  USART_SendData(USART2, buf[i]);
  59.                  while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
  60.         }       
  61. }

  62. unsigned char RxCheckSum(unsigned char *ptr,unsigned char len)
  63. {
  64.         unsigned char i;
  65.         unsigned char checksum;
  66.         checksum = 0;
  67.         for(i=0;i<(len-1);i++)
  68.         {
  69.                    checksum ^= ptr[i];
  70.         }
  71.         checksum = ~checksum;
  72.         if(ptr[len-1] == checksum)
  73.                 return         STATUS_OK;
  74.         else
  75.                 return         STATUS_ERR;
  76. }

  77. void TxCheckSum(unsigned char *ptr,unsigned char len)
  78. {
  79.         unsigned char i;
  80.         unsigned char checksum;
  81.         checksum = 0;
  82.         for(i=0;i<(len-1);i++)
  83.         {
  84.                    checksum ^= ptr[i];
  85.         }
  86.         checksum = ~checksum;
  87.         ptr[len-1] = checksum;
  88. }
  89. //ReadId():讀IC卡ID號(卡號)
  90. //參數(shù):*idout,讀取的卡號保存到它所指向的存儲空間
  91. //返回值:0:成功讀取卡號,1:讀卡號失敗
  92. unsigned char ReadId(unsigned char *idout)
  93. {
  94.         unsigned char status;
  95.         unsigned char i;
  96.         Cmd_Read_Id[5] = 0x01;//開啟蜂鳴器提示
  97.         //Cmd_Read_Id[5] = 0x00;//關(guān)閉蜂鳴器提示
  98.         TxCheckSum(Cmd_Read_Id,Cmd_Read_Id[1]);                //計算校驗和
  99.         Uart2_Send_Data(Cmd_Read_Id,Cmd_Read_Id[1]);                 //發(fā)送讀卡號ID命令
  100.         Delay(2000000);//等待模塊返回數(shù)據(jù),大于150MS
  101.         if(Rx2Flag == 1)
  102.         {       
  103.                 Rx2Flag = 0;
  104.                 status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//對接收到的數(shù)據(jù)校驗
  105.                 if(status != STATUS_OK)  //判斷校驗和是否正確
  106.                 {
  107.                         return STATUS_ERR;
  108.                 }
  109.                 status = Uart2RxBuf[4];
  110.                 if(status != STATUS_OK)        //判斷是否正確的讀到卡
  111.                 {
  112.                          return STATUS_ERR;
  113.                 }
  114.                 if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa1))//判斷是否為讀卡號返回的數(shù)據(jù)包
  115.                 {
  116.                         for(i=0;i<6;i++)//獲取卡號ID,6字節(jié)                 
  117.                         {
  118.                                 idout[i] = Uart2RxBuf[i+5];//從數(shù)組的第5個字節(jié)開始為卡號,長度為6字節(jié)
  119.                         }
  120.                         return STATUS_OK;                 //成功返回0
  121.                 }
  122.         }
  123.         return STATUS_ERR;                        //失敗返回1
  124. }


  125. //ReadId():讀IC卡數(shù)據(jù)塊
  126. //參數(shù):*idout,讀取的數(shù)據(jù)保存到它所指向的存儲空間
  127. //參數(shù):block,塊號
  128. //返回值:0:成功讀取,1:讀讀取失敗
  129. unsigned char ReadDataFromBlock(unsigned char *dataout,unsigned char block)
  130. {
  131.         unsigned char status;
  132.         unsigned char i;
  133.         Cmd_Read_Block[4] = block;
  134.         Cmd_Read_Block[5] = 0x01;//開啟蜂鳴器提示
  135. //        Cmd_Read_Block[5] = 0x00;//關(guān)閉蜂鳴器提示
  136.         TxCheckSum(Cmd_Read_Block,Cmd_Read_Block[1]);        //數(shù)據(jù)校驗
  137.         Uart2_Send_Data(Cmd_Read_Block,Cmd_Read_Block[1]);                 //發(fā)送讀數(shù)據(jù)塊命令
  138.         Delay(2000000);//等待模塊返回數(shù)據(jù),大于150MS
  139.         if(Rx2Flag == 1)
  140.         {       
  141.                 Rx2Flag = 0;
  142.                 status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//對接收到的數(shù)據(jù)校驗
  143.                 if(status != STATUS_OK)                 //判斷校驗和是否正確
  144.                 {
  145.                         return         STATUS_ERR;
  146.                 }
  147.                 status = Uart2RxBuf[4];                //獲取返回包狀態(tài)
  148.                 if(status != STATUS_OK)        //判斷是否正確的讀到卡
  149.                 {
  150.                         return STATUS_ERR;
  151.                 }
  152.                 if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa3))//判斷是否為讀塊數(shù)據(jù)返回的數(shù)據(jù)包
  153.                 {
  154.                         for(i=0;i<16;i++)//獲取塊數(shù)據(jù),16字節(jié)        ,一個數(shù)據(jù)塊的大小為16字節(jié)         
  155.                         {
  156.                                 dataout[i] = Uart2RxBuf[i+5];//從數(shù)組的第5個字節(jié)開始為數(shù)據(jù),長度為16字節(jié)
  157.                         }
  158.                         return STATUS_OK;                 //成功返回0
  159.                 }
  160.         }
  161.         return STATUS_ERR;                        //失敗返回1
  162. }
  163. //ReadId():寫數(shù)據(jù)到指定的數(shù)據(jù)塊
  164. //參數(shù):*idout,指向要寫入數(shù)據(jù)的緩沖區(qū)
  165. //參數(shù):block,塊號
  166. //返回值:0:寫入成功,1:寫入失敗
  167. unsigned char WriteDataToBlock(unsigned char *datain,unsigned char block)
  168. {
  169.         unsigned char status;
  170.         unsigned char i;
  171.         Cmd_Write_Block[4] = block;
  172.         for(i=0;i<16;i++)
  173.         {
  174.                 Cmd_Write_Block[6+i] = datain[i];
  175.         }
  176.         TxCheckSum(Cmd_Write_Block,Cmd_Write_Block[1]);        //數(shù)據(jù)校驗
  177.         Uart2_Send_Data(Cmd_Write_Block,Cmd_Write_Block[1]);                 //發(fā)送寫命令
  178.         Delay(2000000);//等待模塊返回數(shù)據(jù),大于150MS
  179.         if(Rx2Flag == 1)
  180.         {       
  181.                 Rx2Flag = 0;
  182.                 status = RxCheckSum(Uart2RxBuf,Uart2RxBuf[1]);//對返回的數(shù)據(jù)進(jìn)行校驗
  183.                 if(status != STATUS_OK) //判斷校驗是否通過
  184.                 {
  185.                         return STATUS_ERR;
  186.                 }
  187.                 status = Uart2RxBuf[4];
  188.                 if(status != STATUS_OK) //判斷校驗是否通過
  189.                 {
  190.                         return STATUS_ERR;
  191.                 }
  192.                 if((Uart2RxBuf[0] == 0x01)&&(Uart2RxBuf[2] == 0xa4))//判斷是否為寫塊數(shù)據(jù)返回的數(shù)據(jù)包
  193.                 {
  194.                                 return STATUS_OK;                 //成功返回0
  195.                 }
  196.         }
  197.         return STATUS_ERR;                        //失敗返回1
  198. }
  199. int main(void)
  200. {       
  201.         //串口2連接讀卡器
  202.         //串口1連接上位機(jī)
  203.         unsigned char status;
  204.         unsigned char id[6];
  205.         unsigned char blockdata[16];
  206.        
  207.         SystemInit();                                        //初始化系統(tǒng)
  208.         NVIC_Configuration(); //初始化相關(guān)中斷
  209.         COM1_2_Init();  //初始化UART1,UART2

  210.         Rx1Flag = 0;
  211.         Rx2Flag = 0;
  212.         Uart1RxDataConut = 0;
  213.         Uart2RxDataConut = 0;
  214.         while(1)
  215.         {
  216. /*************調(diào)用讀卡號函數(shù)ReadId()將卡號ID讀入到指定的緩沖區(qū)id中************************************/       
  217.                 status = ReadId(id);  //讀卡號
  218.                 if(status == STATUS_OK)        //判斷讀卡號是否成功,等于0成功
  219.                 {
  220.                         Uart1_Send_Data(id,6);        //從串口1把讀取到的卡號發(fā)送出去
  221.                 }
  222.                 else
  223.                 {
  224.                         ;//錯誤處理
  225.                 }
  226. /*********************************************************************************************************/
  227.                 Delay(20000000);//延時
  228. ……………………

  229. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼



回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表