皮爱了西 发表于 2015-6-5 10:29:13

RC522为什么有的卡只读一次,有的卡却连续读卡?

同样的代码,有的卡只读一次,有的卡却连续读卡。测试硬件是arduino 2560,用的标准库,代码如下:

#include <SPI.h>
#include <RFID.h>

//public micro define
#define UBOUND(Array)        (sizeof(Array)/sizeof(Array))
/**********************************
*变量定义
***********************************/
#define RFID_SS                53
#define RFID_RST                49
#define BLOCK_4                4

typedef struct PersonIDTag
{
        byte IDCardNum;
        byte PersonKind;
        byte Reserv;
}PersonID;

union
{
        struct
        {
                byte IDCardNum;
                byte PersonKind;
                byte Reserv;
        }PersonIDStruct;
        byte DataByte;
} Person;


PersonID PersonDatabase;                                                //0-银行;1-维修人员;2-保洁人员;

union
{
        unsigned char PersonInfo;
        struct PersonInfoStruct
        {
                unsigned char KindCode;
                unsigned char BankCode;
                unsigned char ZoneCode;
                unsigned char Reserv;
        };
}PersonInfoUnion;

RFID RFIDDev(RFID_SS, RFID_RST);
unsigned char CardSerialNum;
unsigned char PersonInfo;
unsigned char PersonInfoToWrite;
//卡出厂默认密码
unsigned char InitalSectorKeyA = {
        { 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 = {
        { 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 = 0x01;
        PersonInfoUnion.PersonInfo = 0x02;
        PersonInfoUnion.PersonInfo = 0x1A;
        PersonInfoUnion.PersonInfo = 0x80;
        PersonInfoUnion.PersonInfo = 0x62;
        PersonInfoUnion.PersonInfo = 0x62;
        PersonInfoUnion.PersonInfo = 0x11;
        PersonInfoUnion.PersonInfo = 0x05;
        PersonInfoUnion.PersonInfo = 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 = RFIDDev.serNum;
                        //以下代码供调试用
                        Serial.print(CardSerialNum, HEX);
                        Serial.print("-");
                       
                }
                Serial.println();
        }
        RFIDDev.selectTag(RFIDDev.serNum);
}
//读取数据块,校验密码A
void RFIDReadBlock(unsigned char BlockAddress)
{
        if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA, RFIDDev.serNum)==MI_OK)
        {
                if (RFIDDev.read(BlockAddress, PersonInfo) == MI_OK)
                {
                        //以下代码仅供调试
                        for (int i = 0; i < UBOUND(PersonInfo); i++)
                        {
                                Serial.print(PersonInfo, 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, 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, HEX);
                        }
                        /***************************************************/
                }
        }
        //else
        //{
        //        Serial.println("Card authority is not valid!");
        //        //后续处理……
        //}
}
//修改AB密码和存取控制区
void RFIDChangeControlWord(unsigned char BlockAddress)
{
        if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA, RFIDDev.serNum) == MI_OK)
        {
                if (RFIDDev.write(BlockAddress, NewSectorKeyA) == 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.PersonKind)
                {
                        for (int j = 0; j < UBOUND(PersonDatabase.IDCardNum); j++)
                        {
                                PersonDatabase.IDCardNum = IDCardNum;
                        }               
                        break;
                }
        }
}
//校验卡序列号是否合法
boolean CheckCardSerialNum(unsigned char * CardSerial)
{
        for (int i = 0; i < UBOUND(PersonDatabase); i++)
        {
                for (int j = 0; j < UBOUND(PersonDatabase.IDCardNum); j++)
                {
                        if (CardSerial != PersonDatabase.IDCardNum)
                        {
                                break;
                        }
                        if (j == UBOUND(PersonDatabase.IDCardNum) - 1)
                        {
                                return true;
                        }
                }
        }
        return false;
}
页: [1]
查看完整版本: RC522为什么有的卡只读一次,有的卡却连续读卡?