|
- //整理者:极客工坊bg1lsy ([email protected])
- //整理时间:2013.05.25
- #include <SPI.h>
- #include <RFID.h>
- RFID rfid(10,5); //D10--读卡器MOSI引脚、D5--读卡器RST引脚
- //4字节卡序列号,第5字节为校验字节
- unsigned char serNum[5];
- //写卡数据
- unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
- //原扇区A密码,16个扇区,每个扇区密码6Byte
- unsigned char sectorKeyA[16][16] = {
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
- //新扇区A密码,16个扇区,每个扇区密码6Byte
- unsigned char sectorNewKeyA[16][16] = {
- {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},};
- void setup()
- {
- Serial.begin(9600);
- SPI.begin();
- rfid.init();
- }
- void loop()
- {
- unsigned char i,tmp;
- unsigned char status;
- unsigned char str[MAX_LEN];
- unsigned char RC_size;
- unsigned char blockAddr; //选择操作的块地址0~63
- //找卡
- rfid.isCard();
- //读取卡序列号
- if (rfid.readCardSerial())
- {
- Serial.print("The card's number is : ");
- Serial.print(rfid.serNum[0],HEX);
- Serial.print(rfid.serNum[1],HEX);
- Serial.print(rfid.serNum[2],HEX);
- Serial.print(rfid.serNum[3],HEX);
- Serial.print(rfid.serNum[4],HEX);
- Serial.println(" ");
- }
- //选卡,返回卡容量(锁定卡片,防止多次读写)
- rfid.selectTag(rfid.serNum);
-
- //写数据卡
- blockAddr = 7; //数据块7
- if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK) //认证
- {
- //写数据
- status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
- Serial.print("set the new card password, and can modify the data of the Sector: ");
- Serial.println(blockAddr/4,DEC);
- //写数据
- blockAddr = blockAddr - 3 ; //数据块4
- status = rfid.write(blockAddr, writeDate);
- if(status == MI_OK)
- {
- Serial.println("Write card OK!");
- }
- }
- //读卡
- blockAddr = 7; //数据块7
- status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
- if (status == MI_OK) //认证
- {
- //读数据
- blockAddr = blockAddr - 3 ; //数据块4
- if( rfid.read(blockAddr, str) == MI_OK)
- {
- Serial.print("Read from the card ,the data is : ");
- Serial.println((char *)str);
- }
- }
-
- rfid.halt();
- }
复制代码
这段代码大家应该都见过,这是从论坛上搜到的关于RFID卡读写数据的代码。。。
这段程序直接上传到arduino是可以运行的,也能正确的写和读卡片
但是
我改了一下 - //整理者:极客工坊bg1lsy ([email protected])
- //整理时间:2013.05.25
- #include <SPI.h>
- #include <RFID.h>
- RFID rfid(10,5); //D10--读卡器MOSI引脚、D5--读卡器RST引脚
- //4字节卡序列号,第5字节为校验字节
- unsigned char serNum[5];
- //写卡数据
- unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
- //原扇区A密码,16个扇区,每个扇区密码6Byte
- unsigned char sectorKeyA[16][16] = {
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
- //新扇区A密码,16个扇区,每个扇区密码6Byte
- unsigned char sectorNewKeyA[16][16] = {
- {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},};
- void setup()
- {
- Serial.begin(9600);
- SPI.begin();
- rfid.init();
- }
- void loop()
- {
- unsigned char i,tmp;
- unsigned char status;
- unsigned char str[MAX_LEN];
- unsigned char RC_size;
- unsigned char blockAddr; //选择操作的块地址0~63
- //找卡
- rfid.isCard();
- //读取卡序列号
- if (rfid.readCardSerial())
- {
- Serial.print("The card's number is : ");
- Serial.print(rfid.serNum[0],HEX);
- Serial.print(rfid.serNum[1],HEX);
- Serial.print(rfid.serNum[2],HEX);
- Serial.print(rfid.serNum[3],HEX);
- Serial.print(rfid.serNum[4],HEX);
- Serial.println(" ");
- }
- //选卡,返回卡容量(锁定卡片,防止多次读写)
- rfid.selectTag(rfid.serNum);
-
- if(XXXXXXXXXXXX)//这块XXX懒得打了,各位自行理解。。那里就是一个和rfid.serNum有关的判断条件
- {
- change();
- }
-
- rfid.halt();
- }
- void change()
- {
- //写数据卡
- blockAddr = 7; //数据块7
- if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK) //认证
- {
- //写数据
- status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
- Serial.print("set the new card password, and can modify the data of the Sector: ");
- Serial.println(blockAddr/4,DEC);
- //写数据
- blockAddr = blockAddr - 3 ; //数据块4
- status = rfid.write(blockAddr, writeDate);
- if(status == MI_OK)
- {
- Serial.println("Write card OK!");
- }
- }
- //读卡
- blockAddr = 7; //数据块7
- status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
- if (status == MI_OK) //认证
- {
- //读数据
- blockAddr = blockAddr - 3 ; //数据块4
- if( rfid.read(blockAddr, str) == MI_OK)
- {
- Serial.print("Read from the card ,the data is : ");
- Serial.println((char *)str);
- }
- }
- }
复制代码
或者说改成另一个样子 - //整理者:极客工坊bg1lsy ([email protected])
- //整理时间:2013.05.25
- #include <SPI.h>
- #include <RFID.h>
- RFID rfid(10,5); //D10--读卡器MOSI引脚、D5--读卡器RST引脚
- //4字节卡序列号,第5字节为校验字节
- unsigned char serNum[5];
- //写卡数据
- unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
- //原扇区A密码,16个扇区,每个扇区密码6Byte
- unsigned char sectorKeyA[16][16] = {
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
- //新扇区A密码,16个扇区,每个扇区密码6Byte
- unsigned char sectorNewKeyA[16][16] = {
- {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},};
- void setup()
- {
- Serial.begin(9600);
- SPI.begin();
- rfid.init();
- }
- void loop()
- {
- unsigned char i,tmp;
- unsigned char status;
- unsigned char str[MAX_LEN];
- unsigned char RC_size;
- unsigned char blockAddr; //选择操作的块地址0~63
- //找卡
- rfid.isCard();
- //读取卡序列号
- if (rfid.readCardSerial())
- {
- Serial.print("The card's number is : ");
- Serial.print(rfid.serNum[0],HEX);
- Serial.print(rfid.serNum[1],HEX);
- Serial.print(rfid.serNum[2],HEX);
- Serial.print(rfid.serNum[3],HEX);
- Serial.print(rfid.serNum[4],HEX);
- Serial.println(" ");
- }
- //选卡,返回卡容量(锁定卡片,防止多次读写)
- rfid.selectTag(rfid.serNum);
- //读卡
- blockAddr = 7; //数据块7
- status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);//这里sectorNewKeyA和SectorKeyA都试过
- if (status == MI_OK) //认证
- {
- //读数据
- blockAddr = blockAddr - 3 ; //数据块4
- if( rfid.read(blockAddr, str) == MI_OK)
- {
- Serial.print("Read from the card ,the data is : ");
- Serial.println((char *)str);
- }
- }
- //写数据卡
- blockAddr = 7; //数据块7
- if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK) //认证
- {
- //写数据
- status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
- Serial.print("set the new card password, and can modify the data of the Sector: ");
- Serial.println(blockAddr/4,DEC);
- //写数据
- blockAddr = blockAddr - 3 ; //数据块4
- status = rfid.write(blockAddr, writeDate);
- if(status == MI_OK)
- {
- Serial.println("Write card OK!");
- }
- }
-
- rfid.halt();
- }
复制代码
这两种情况,一种是先读后写,另一种是放到自定义函数里面,都可以编译通过并上传,但是实际运行的时候,到rfid.auth这个函数的位置都会返回MI_Err的密码校验错误提示
不知道有没有大佬遇见过类似的情况。。。 |
|