极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10710|回复: 2

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

[复制链接]
发表于 2017-7-19 17:57:03 | 显示全部楼层 |阅读模式
  1. //整理者:极客工坊bg1lsy ([email protected])
  2. //整理时间:2013.05.25
  3. #include <SPI.h>
  4. #include <RFID.h>

  5. RFID rfid(10,5);    //D10--读卡器MOSI引脚、D5--读卡器RST引脚

  6. //4字节卡序列号,第5字节为校验字节
  7. unsigned char serNum[5];
  8. //写卡数据
  9. unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
  10. //原扇区A密码,16个扇区,每个扇区密码6Byte
  11. unsigned char sectorKeyA[16][16] = {
  12.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  13.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  14.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
  15. //新扇区A密码,16个扇区,每个扇区密码6Byte
  16. unsigned char sectorNewKeyA[16][16] = {
  17.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  18.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  19.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};

  20. void setup()
  21. {
  22.   Serial.begin(9600);
  23.   SPI.begin();
  24.   rfid.init();
  25. }

  26. void loop()
  27. {
  28.   unsigned char i,tmp;
  29.   unsigned char status;
  30.   unsigned char str[MAX_LEN];
  31.   unsigned char RC_size;
  32.   unsigned char blockAddr;        //选择操作的块地址0~63

  33.   //找卡
  34.   rfid.isCard();
  35.   //读取卡序列号
  36.   if (rfid.readCardSerial())
  37.   {
  38.     Serial.print("The card's number is  : ");
  39.     Serial.print(rfid.serNum[0],HEX);
  40.     Serial.print(rfid.serNum[1],HEX);
  41.     Serial.print(rfid.serNum[2],HEX);
  42.     Serial.print(rfid.serNum[3],HEX);
  43.     Serial.print(rfid.serNum[4],HEX);
  44.     Serial.println(" ");
  45.   }

  46.   //选卡,返回卡容量(锁定卡片,防止多次读写)
  47.   rfid.selectTag(rfid.serNum);
  48.   
  49.   //写数据卡
  50.   blockAddr = 7;                //数据块7
  51.   if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK)  //认证
  52.   {
  53.     //写数据
  54.     status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
  55.     Serial.print("set the new card password, and can modify the data of the Sector: ");
  56.     Serial.println(blockAddr/4,DEC);
  57.     //写数据
  58.     blockAddr = blockAddr - 3 ; //数据块4
  59.     status = rfid.write(blockAddr, writeDate);
  60.     if(status == MI_OK)
  61.     {
  62.       Serial.println("Write card OK!");
  63.     }
  64.   }

  65.   //读卡
  66.   blockAddr = 7;                //数据块7
  67.   status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
  68.   if (status == MI_OK)  //认证
  69.   {
  70.     //读数据
  71.     blockAddr = blockAddr - 3 ; //数据块4
  72.     if( rfid.read(blockAddr, str) == MI_OK)
  73.     {
  74.       Serial.print("Read from the card ,the data is : ");
  75.       Serial.println((char *)str);
  76.     }
  77.   }
  78.   
  79.   rfid.halt();
  80. }
复制代码


这段代码大家应该都见过,这是从论坛上搜到的关于RFID卡读写数据的代码。。。
这段程序直接上传到arduino是可以运行的,也能正确的写和读卡片
但是
我改了一下
  1. //整理者:极客工坊bg1lsy ([email protected])
  2. //整理时间:2013.05.25
  3. #include <SPI.h>
  4. #include <RFID.h>

  5. RFID rfid(10,5);    //D10--读卡器MOSI引脚、D5--读卡器RST引脚

  6. //4字节卡序列号,第5字节为校验字节
  7. unsigned char serNum[5];
  8. //写卡数据
  9. unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
  10. //原扇区A密码,16个扇区,每个扇区密码6Byte
  11. unsigned char sectorKeyA[16][16] = {
  12.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  13.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  14.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
  15. //新扇区A密码,16个扇区,每个扇区密码6Byte
  16. unsigned char sectorNewKeyA[16][16] = {
  17.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  18.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  19.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};

  20. void setup()
  21. {
  22.   Serial.begin(9600);
  23.   SPI.begin();
  24.   rfid.init();
  25. }

  26. void loop()
  27. {
  28.   unsigned char i,tmp;
  29.   unsigned char status;
  30.   unsigned char str[MAX_LEN];
  31.   unsigned char RC_size;
  32.   unsigned char blockAddr;        //选择操作的块地址0~63

  33.   //找卡
  34.   rfid.isCard();
  35.   //读取卡序列号
  36.   if (rfid.readCardSerial())
  37.   {
  38.     Serial.print("The card's number is  : ");
  39.     Serial.print(rfid.serNum[0],HEX);
  40.     Serial.print(rfid.serNum[1],HEX);
  41.     Serial.print(rfid.serNum[2],HEX);
  42.     Serial.print(rfid.serNum[3],HEX);
  43.     Serial.print(rfid.serNum[4],HEX);
  44.     Serial.println(" ");
  45.   }

  46.   //选卡,返回卡容量(锁定卡片,防止多次读写)
  47.   rfid.selectTag(rfid.serNum);
  48.   
  49. if(XXXXXXXXXXXX)//这块XXX懒得打了,各位自行理解。。那里就是一个和rfid.serNum有关的判断条件
  50. {
  51.   change();
  52. }
  53.   
  54.   rfid.halt();
  55. }

  56. void change()
  57. {
  58.    //写数据卡
  59.   blockAddr = 7;                //数据块7
  60.   if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK)  //认证
  61.   {
  62.     //写数据
  63.     status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
  64.     Serial.print("set the new card password, and can modify the data of the Sector: ");
  65.     Serial.println(blockAddr/4,DEC);
  66.     //写数据
  67.     blockAddr = blockAddr - 3 ; //数据块4
  68.     status = rfid.write(blockAddr, writeDate);
  69.     if(status == MI_OK)
  70.     {
  71.       Serial.println("Write card OK!");
  72.     }
  73.   }

  74.   //读卡
  75.   blockAddr = 7;                //数据块7
  76.   status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
  77.   if (status == MI_OK)  //认证
  78.   {
  79.     //读数据
  80.     blockAddr = blockAddr - 3 ; //数据块4
  81.     if( rfid.read(blockAddr, str) == MI_OK)
  82.     {
  83.       Serial.print("Read from the card ,the data is : ");
  84.       Serial.println((char *)str);
  85.     }
  86.   }
  87. }
复制代码



或者说改成另一个样子
  1. //整理者:极客工坊bg1lsy ([email protected])
  2. //整理时间:2013.05.25
  3. #include <SPI.h>
  4. #include <RFID.h>

  5. RFID rfid(10,5);    //D10--读卡器MOSI引脚、D5--读卡器RST引脚

  6. //4字节卡序列号,第5字节为校验字节
  7. unsigned char serNum[5];
  8. //写卡数据
  9. unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
  10. //原扇区A密码,16个扇区,每个扇区密码6Byte
  11. unsigned char sectorKeyA[16][16] = {
  12.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  13.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  14.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
  15. //新扇区A密码,16个扇区,每个扇区密码6Byte
  16. unsigned char sectorNewKeyA[16][16] = {
  17.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  18.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  19.         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};

  20. void setup()
  21. {
  22.   Serial.begin(9600);
  23.   SPI.begin();
  24.   rfid.init();
  25. }

  26. void loop()
  27. {
  28.   unsigned char i,tmp;
  29.   unsigned char status;
  30.   unsigned char str[MAX_LEN];
  31.   unsigned char RC_size;
  32.   unsigned char blockAddr;        //选择操作的块地址0~63

  33.   //找卡
  34.   rfid.isCard();
  35.   //读取卡序列号
  36.   if (rfid.readCardSerial())
  37.   {
  38.     Serial.print("The card's number is  : ");
  39.     Serial.print(rfid.serNum[0],HEX);
  40.     Serial.print(rfid.serNum[1],HEX);
  41.     Serial.print(rfid.serNum[2],HEX);
  42.     Serial.print(rfid.serNum[3],HEX);
  43.     Serial.print(rfid.serNum[4],HEX);
  44.     Serial.println(" ");
  45.   }

  46.   //选卡,返回卡容量(锁定卡片,防止多次读写)
  47.   rfid.selectTag(rfid.serNum);
  48.   //读卡
  49.   blockAddr = 7;                //数据块7
  50.   status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);//这里sectorNewKeyA和SectorKeyA都试过
  51.   if (status == MI_OK)  //认证
  52.   {
  53.     //读数据
  54.     blockAddr = blockAddr - 3 ; //数据块4
  55.     if( rfid.read(blockAddr, str) == MI_OK)
  56.     {
  57.       Serial.print("Read from the card ,the data is : ");
  58.       Serial.println((char *)str);
  59.     }
  60.   }
  61.   //写数据卡
  62.   blockAddr = 7;                //数据块7
  63.   if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK)  //认证
  64.   {
  65.     //写数据
  66.     status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
  67.     Serial.print("set the new card password, and can modify the data of the Sector: ");
  68.     Serial.println(blockAddr/4,DEC);
  69.     //写数据
  70.     blockAddr = blockAddr - 3 ; //数据块4
  71.     status = rfid.write(blockAddr, writeDate);
  72.     if(status == MI_OK)
  73.     {
  74.       Serial.println("Write card OK!");
  75.     }
  76.   }
  77.   
  78.   rfid.halt();
  79. }
复制代码



这两种情况,一种是先读后写,另一种是放到自定义函数里面,都可以编译通过并上传,但是实际运行的时候,到rfid.auth这个函数的位置都会返回MI_Err的密码校验错误提示


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

使用道具 举报

发表于 2017-8-13 00:01:34 | 显示全部楼层
呀 老哥 遇见你了
那么看源程序,其实有个叫扇区密码的,注意一下,
//原扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorKeyA[16][16] = {
  xxxxxx};
//新扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorNewKeyA[16][16] = {
xxxxxxx};
然后注意看写卡的时候,它不仅把数据
'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0
写到了卡里面
还把新的扇区密码也修改了
if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK)  //认证
  {
    //写数据
    status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
所以,当你改代码的时候,记得要把扇区密码也要调整一下
回复 支持 反对

使用道具 举报

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

之前我注意到这个问题了,后来测试的时候发现是读写卡之前没有选卡造成无法读写。
现在的问题是,示例程序可以连续读写卡,可是我的程序不管在loop还是子函数读写一次(或者读一次,总之就是执行到卡休眠)之后就无法再次读写了,连卡序列号都读不出来(换张卡也不行)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 09:28 , Processed in 0.039202 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表