极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14301|回复: 3

求助:RC522连续读卡的问题

[复制链接]
发表于 2015-6-5 10:18:33 | 显示全部楼层 |阅读模式
本帖最后由 葱拌豆腐 于 2015-6-5 10:21 编辑

最近做RFID的事情,发现同样的代码,有的卡只读一次,而有的卡片发到读卡器上就会一直连续读卡,这是怎么回事?代码如下,板子是2560:
  1. #include <SPI.h>
  2. #include <RFID.h>

  3. //public micro define
  4. #define UBOUND(Array)        (sizeof(Array)/sizeof(Array[0]))
  5. /**********************************
  6. *变量定义
  7. ***********************************/
  8. #define RFID_SS                53
  9. #define RFID_RST                49
  10. #define BLOCK_4                4

  11. typedef struct PersonIDTag
  12. {
  13.         byte IDCardNum[5];
  14.         byte PersonKind;
  15.         byte Reserv[14];
  16. }PersonID;

  17. union
  18. {
  19.         struct
  20.         {
  21.                 byte IDCardNum[5];
  22.                 byte PersonKind;
  23.                 byte Reserv[14];
  24.         }PersonIDStruct;
  25.         byte DataByte[20];
  26. } Person;


  27. PersonID PersonDatabase[3];                                                //0-银行;1-维修人员;2-保洁人员;

  28. union
  29. {
  30.         unsigned char PersonInfo[16];
  31.         struct PersonInfoStruct
  32.         {
  33.                 unsigned char KindCode;
  34.                 unsigned char BankCode;
  35.                 unsigned char ZoneCode;
  36.                 unsigned char Reserv[13];
  37.         };
  38. }PersonInfoUnion;

  39. RFID RFIDDev(RFID_SS, RFID_RST);
  40. unsigned char CardSerialNum[5];
  41. unsigned char PersonInfo[16];
  42. unsigned char PersonInfoToWrite[16];
  43. //卡出厂默认密码
  44. unsigned char InitalSectorKeyA[16][16] = {
  45.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  46.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  47.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  48.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  49.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  50.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  51.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  52.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  53.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  54.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  55.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  56.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  57.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  58.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  59.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
  60.         { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } };
  61. //重新设定的卡密码
  62. unsigned char NewSectorKeyA[16][16] = {
  63.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11},
  64.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  65.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  66.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  67.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  68.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  69.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  70.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  71.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  72.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  73.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  74.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  75.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  76.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  77.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
  78.         { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,  0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 } };


  79. void setup()
  80. {

  81.   /* add setup code here */
  82.         Serial.begin(9600);
  83.         RFIDInit();

  84.         PersonInfoUnion.PersonInfo[0] = 0x01;
  85.         PersonInfoUnion.PersonInfo[1] = 0x02;
  86.         PersonInfoUnion.PersonInfo[2] = 0x1A;
  87.         PersonInfoUnion.PersonInfo[3] = 0x80;
  88.         PersonInfoUnion.PersonInfo[4] = 0x62;
  89.         PersonInfoUnion.PersonInfo[5] = 0x62;
  90.         PersonInfoUnion.PersonInfo[6] = 0x11;
  91.         PersonInfoUnion.PersonInfo[7] = 0x05;
  92.         PersonInfoUnion.PersonInfo[8] = 0x32;
  93. }

  94. void loop()
  95. {
  96.   /* add main program code here */
  97.         CheckCardID();
  98.         RFIDWriteBlock(4);
  99.         for (int i = 0; i < 16; i++)
  100.         {
  101.                 RFIDReadBlock(i);
  102.         }
  103.         /*RFIDReadBlock(BLOCK_4);*/
  104.         RFIDDev.halt();
  105.        
  106. }

  107. /***************************************
  108. *函数定义
  109. *****************************************/
  110. //读卡器初始化
  111. void RFIDInit()
  112. {
  113.         SPI.begin();
  114.         RFIDDev.init();
  115. }
  116. //校验卡的身份
  117. void CheckCardID()
  118. {
  119.         RFIDDev.isCard();
  120.         if (RFIDDev.readCardSerial())
  121.         {
  122.                 for (int i = 0; i < 5; i++)
  123.                 {
  124.                         CardSerialNum[i] = RFIDDev.serNum[i];
  125.                         //以下代码供调试用
  126.                         Serial.print(CardSerialNum[i], HEX);
  127.                         Serial.print("-");
  128.                        
  129.                 }
  130.                 Serial.println();
  131.         }
  132.         RFIDDev.selectTag(RFIDDev.serNum);
  133. }
  134. //读取数据块,校验密码A
  135. void RFIDReadBlock(unsigned char BlockAddress)
  136. {
  137.         if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA[BlockAddress / 4], RFIDDev.serNum)==MI_OK)
  138.         {
  139.                 if (RFIDDev.read(BlockAddress, PersonInfo) == MI_OK)
  140.                 {
  141.                         //以下代码仅供调试
  142.                         for (int i = 0; i < UBOUND(PersonInfo); i++)
  143.                         {
  144.                                 Serial.print(PersonInfo[i], HEX);
  145.                         }
  146.                         Serial.println();
  147.                         Serial.print(BlockAddress);
  148.                         Serial.println("  is read!");
  149.                         /***************************************************/
  150.                 }
  151.         }
  152.         //else
  153.         //{
  154.         //        Serial.println("Card authority is not valid!");
  155.         //        //后续处理……
  156.         //}
  157. }
  158. //写数据块,校验密码A
  159. void RFIDWriteBlock(unsigned BlockAddress)
  160. {
  161.         if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA[BlockAddress / 4], RFIDDev.serNum) == MI_OK)
  162.         {
  163.                 if (RFIDDev.write(BlockAddress, PersonInfoUnion.PersonInfo) == MI_OK)
  164.                 {
  165.                         //以下代码仅供调试
  166.                         for (int i = 0; i < UBOUND(PersonInfoUnion.PersonInfo); i++)
  167.                         {
  168.                                 Serial.println(PersonInfoUnion.PersonInfo[i], HEX);
  169.                         }
  170.                         /***************************************************/
  171.                 }
  172.         }
  173.         //else
  174.         //{
  175.         //        Serial.println("Card authority is not valid!");
  176.         //        //后续处理……
  177.         //}
  178. }
  179. //修改AB密码和存取控制区
  180. void RFIDChangeControlWord(unsigned char BlockAddress)
  181. {
  182.         if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA[BlockAddress / 4], RFIDDev.serNum) == MI_OK)
  183.         {
  184.                 if (RFIDDev.write(BlockAddress, NewSectorKeyA[BlockAddress / 4]) == MI_OK)
  185.                 {
  186.                         //for debug only
  187.                         Serial.println("Change control zone word success.");
  188.                 }
  189.                 else
  190.                 {
  191.                         //for debug only
  192.                         Serial.println("Change control zone word failure.");
  193.                 }
  194.         }
  195.         else
  196.         {
  197.                 //for debug only
  198.                 Serial.println("Authority is wrong!");
  199.         }
  200. }
  201. //修改报警主机本地身份卡数据
  202. void ModifyPersonDatabase(byte KindCode,byte* IDCardNum)
  203. {
  204.         for (int i = 0; i < UBOUND(PersonDatabase); i++)
  205.         {
  206.                 if (KindCode == PersonDatabase[i].PersonKind)
  207.                 {
  208.                         for (int j = 0; j < UBOUND(PersonDatabase[i].IDCardNum); j++)
  209.                         {
  210.                                 PersonDatabase[i].IDCardNum[j] = IDCardNum[j];
  211.                         }               
  212.                         break;
  213.                 }
  214.         }
  215. }
  216. //校验卡序列号是否合法
  217. boolean CheckCardSerialNum(unsigned char * CardSerial)
  218. {
  219.         for (int i = 0; i < UBOUND(PersonDatabase); i++)
  220.         {
  221.                 for (int j = 0; j < UBOUND(PersonDatabase[i].IDCardNum); j++)
  222.                 {
  223.                         if (CardSerial[j] != PersonDatabase[i].IDCardNum[j])
  224.                         {
  225.                                 break;
  226.                         }
  227.                         if (j == UBOUND(PersonDatabase[i].IDCardNum) - 1)
  228.                         {
  229.                                 return true;
  230.                         }
  231.                 }
  232.         }
  233.         return false;
  234. }
复制代码
回复

使用道具 举报

发表于 2015-6-5 16:12:39 | 显示全部楼层
把本次读卡记录和上次比较,如果一样就不输出,不一样就输出
回复 支持 反对

使用道具 举报

发表于 2015-6-5 17:07:31 | 显示全部楼层
楼主做的门禁?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-10 15:06:18 | 显示全部楼层
手电铜人 发表于 2015-6-5 17:07
楼主做的门禁?

用来做身份识别的,不是门禁
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 20:08 , Processed in 0.037886 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表