本帖最后由 葱拌豆腐 于 2015-6-5 10:21 编辑
最近做RFID的事情,发现同样的代码,有的卡只读一次,而有的卡片发到读卡器上就会一直连续读卡,这是怎么回事?代码如下,板子是2560:
- #include <SPI.h>
- #include <RFID.h>
- //public micro define
- #define UBOUND(Array) (sizeof(Array)/sizeof(Array[0]))
- /**********************************
- *变量定义
- ***********************************/
- #define RFID_SS 53
- #define RFID_RST 49
- #define BLOCK_4 4
- typedef struct PersonIDTag
- {
- byte IDCardNum[5];
- byte PersonKind;
- byte Reserv[14];
- }PersonID;
- union
- {
- struct
- {
- byte IDCardNum[5];
- byte PersonKind;
- byte Reserv[14];
- }PersonIDStruct;
- byte DataByte[20];
- } Person;
- PersonID PersonDatabase[3]; //0-银行;1-维修人员;2-保洁人员;
- union
- {
- unsigned char PersonInfo[16];
- struct PersonInfoStruct
- {
- unsigned char KindCode;
- unsigned char BankCode;
- unsigned char ZoneCode;
- unsigned char Reserv[13];
- };
- }PersonInfoUnion;
- RFID RFIDDev(RFID_SS, RFID_RST);
- unsigned char CardSerialNum[5];
- unsigned char PersonInfo[16];
- unsigned char PersonInfoToWrite[16];
- //卡出厂默认密码
- unsigned char InitalSectorKeyA[16][16] = {
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } };
- //重新设定的卡密码
- unsigned char NewSectorKeyA[16][16] = {
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11},
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
- { 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 } };
- void setup()
- {
- /* add setup code here */
- Serial.begin(9600);
- RFIDInit();
- PersonInfoUnion.PersonInfo[0] = 0x01;
- PersonInfoUnion.PersonInfo[1] = 0x02;
- PersonInfoUnion.PersonInfo[2] = 0x1A;
- PersonInfoUnion.PersonInfo[3] = 0x80;
- PersonInfoUnion.PersonInfo[4] = 0x62;
- PersonInfoUnion.PersonInfo[5] = 0x62;
- PersonInfoUnion.PersonInfo[6] = 0x11;
- PersonInfoUnion.PersonInfo[7] = 0x05;
- PersonInfoUnion.PersonInfo[8] = 0x32;
- }
- void loop()
- {
- /* add main program code here */
- CheckCardID();
- RFIDWriteBlock(4);
- for (int i = 0; i < 16; i++)
- {
- RFIDReadBlock(i);
- }
- /*RFIDReadBlock(BLOCK_4);*/
- RFIDDev.halt();
-
- }
- /***************************************
- *函数定义
- *****************************************/
- //读卡器初始化
- void RFIDInit()
- {
- SPI.begin();
- RFIDDev.init();
- }
- //校验卡的身份
- void CheckCardID()
- {
- RFIDDev.isCard();
- if (RFIDDev.readCardSerial())
- {
- for (int i = 0; i < 5; i++)
- {
- CardSerialNum[i] = RFIDDev.serNum[i];
- //以下代码供调试用
- Serial.print(CardSerialNum[i], HEX);
- Serial.print("-");
-
- }
- Serial.println();
- }
- RFIDDev.selectTag(RFIDDev.serNum);
- }
- //读取数据块,校验密码A
- void RFIDReadBlock(unsigned char BlockAddress)
- {
- if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA[BlockAddress / 4], RFIDDev.serNum)==MI_OK)
- {
- if (RFIDDev.read(BlockAddress, PersonInfo) == MI_OK)
- {
- //以下代码仅供调试
- for (int i = 0; i < UBOUND(PersonInfo); i++)
- {
- Serial.print(PersonInfo[i], HEX);
- }
- Serial.println();
- Serial.print(BlockAddress);
- Serial.println(" is read!");
- /***************************************************/
- }
- }
- //else
- //{
- // Serial.println("Card authority is not valid!");
- // //后续处理……
- //}
- }
- //写数据块,校验密码A
- void RFIDWriteBlock(unsigned BlockAddress)
- {
- if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA[BlockAddress / 4], RFIDDev.serNum) == MI_OK)
- {
- if (RFIDDev.write(BlockAddress, PersonInfoUnion.PersonInfo) == MI_OK)
- {
- //以下代码仅供调试
- for (int i = 0; i < UBOUND(PersonInfoUnion.PersonInfo); i++)
- {
- Serial.println(PersonInfoUnion.PersonInfo[i], HEX);
- }
- /***************************************************/
- }
- }
- //else
- //{
- // Serial.println("Card authority is not valid!");
- // //后续处理……
- //}
- }
- //修改AB密码和存取控制区
- void RFIDChangeControlWord(unsigned char BlockAddress)
- {
- if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA[BlockAddress / 4], RFIDDev.serNum) == MI_OK)
- {
- if (RFIDDev.write(BlockAddress, NewSectorKeyA[BlockAddress / 4]) == MI_OK)
- {
- //for debug only
- Serial.println("Change control zone word success.");
- }
- else
- {
- //for debug only
- Serial.println("Change control zone word failure.");
- }
- }
- else
- {
- //for debug only
- Serial.println("Authority is wrong!");
- }
- }
- //修改报警主机本地身份卡数据
- void ModifyPersonDatabase(byte KindCode,byte* IDCardNum)
- {
- for (int i = 0; i < UBOUND(PersonDatabase); i++)
- {
- if (KindCode == PersonDatabase[i].PersonKind)
- {
- for (int j = 0; j < UBOUND(PersonDatabase[i].IDCardNum); j++)
- {
- PersonDatabase[i].IDCardNum[j] = IDCardNum[j];
- }
- break;
- }
- }
- }
- //校验卡序列号是否合法
- boolean CheckCardSerialNum(unsigned char * CardSerial)
- {
- for (int i = 0; i < UBOUND(PersonDatabase); i++)
- {
- for (int j = 0; j < UBOUND(PersonDatabase[i].IDCardNum); j++)
- {
- if (CardSerial[j] != PersonDatabase[i].IDCardNum[j])
- {
- break;
- }
- if (j == UBOUND(PersonDatabase[i].IDCardNum) - 1)
- {
- return true;
- }
- }
- }
- return false;
- }
复制代码 |