本帖最后由 Gwei 于 2015-4-28 11:08 编辑
为什么KeyA={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}可以用来读取数据,这说明你sector trailor keyA位置存储了KeyA,可是为啥读出来的数据是{0x00,0x00,0x00,0x00,0x00,0x00}求助呀
代码是改这位朋友的特此鸣谢 bg1lsy
连接:http://www.geek-workshop.com/forum.php?mod=viewthread&tid=4719&highlight=rfid
自己的代码
[pre lang="arduino" line="1" file="read.cpp"]#include <SPI.h>
#include <RFID.h>
RFID rfid(10,5); //D10--读卡器MOSI引脚、D5--读卡器RST引脚
//4字节卡序列号,第5字节为校验字节
unsigned char serNum[5];
//原扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorKeyA[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
int serial_putc( char c, struct __file * )
{
Serial.write( c );
return c;
}
void printf_begin(void)
{
fdevopen( &serial_putc, 0 );
}
void setup()
{
Serial.begin(9600);
printf_begin();
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);
//读卡
for(int j=0,k=1;j<64;j++,k++){
blockAddr = j; //数据块7
status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA, rfid.serNum);
if (status == MI_OK) //认证
{
//读数据
//blockAddr = blockAddr - 3 ; //数据块4
if( rfid.read(blockAddr, str) == MI_OK)
{
printf("Block %d the data is : ",j%4);
for(int i=0;i<16;i++){
printf("%.2x ",str);
}
Serial.println();
if(k%4==0){
printf("up is sector %d\n",k/4-1);
Serial.println();
}
}
}
}
rfid.halt();
}[/code]
tip:只能实现S50,S70有点问题,随后补上S70的代码。 |