zjz5717 发表于 2017-7-19 17:57:03

程序能编译通过。。。但是运行效果不太对

//整理者:极客工坊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;
//写卡数据
unsigned char writeDate ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
//原扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorKeyA = {
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
//新扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorNewKeyA = {
      {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;
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,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.println(" ");
}

//选卡,返回卡容量(锁定卡片,防止多次读写)
rfid.selectTag(rfid.serNum);

//写数据卡
blockAddr = 7;                //数据块7
if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA, rfid.serNum) == MI_OK)//认证
{
    //写数据
    status = rfid.write(blockAddr, sectorNewKeyA);
    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, 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;
//写卡数据
unsigned char writeDate ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
//原扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorKeyA = {
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
//新扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorNewKeyA = {
      {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;
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,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,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, rfid.serNum) == MI_OK)//认证
{
    //写数据
    status = rfid.write(blockAddr, sectorNewKeyA);
    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, 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;
//写卡数据
unsigned char writeDate ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
//原扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorKeyA = {
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
//新扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorNewKeyA = {
      {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;
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,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.println(" ");
}

//选卡,返回卡容量(锁定卡片,防止多次读写)
rfid.selectTag(rfid.serNum);
//读卡
blockAddr = 7;                //数据块7
status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA, 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, rfid.serNum) == MI_OK)//认证
{
    //写数据
    status = rfid.write(blockAddr, sectorNewKeyA);
    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的密码校验错误提示


不知道有没有大佬遇见过类似的情况。。。

qq576193486 发表于 2017-8-13 00:01:34

呀 老哥 遇见你了
那么看源程序,其实有个叫扇区密码的,注意一下,
//原扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorKeyA = {
xxxxxx};
//新扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorNewKeyA = {
xxxxxxx};
然后注意看写卡的时候,它不仅把数据
'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0
写到了卡里面
还把新的扇区密码也修改了
if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA, rfid.serNum) == MI_OK)//认证
{
    //写数据
    status = rfid.write(blockAddr, sectorNewKeyA);
所以,当你改代码的时候,记得要把扇区密码也要调整一下

zjz5717 发表于 2017-8-13 08:16:00

qq576193486 发表于 2017-8-13 00:01
呀 老哥 遇见你了
那么看源程序,其实有个叫扇区密码的,注意一下,
//原扇区A密码,16个扇区,每个扇区 ...

之前我注意到这个问题了,后来测试的时候发现是读写卡之前没有选卡造成无法读写。
现在的问题是,示例程序可以连续读写卡,可是我的程序不管在loop还是子函数读写一次(或者读一次,总之就是执行到卡休眠)之后就无法再次读写了,连卡序列号都读不出来(换张卡也不行)
页: [1]
查看完整版本: 程序能编译通过。。。但是运行效果不太对