Почему нет функции findCard () в классе RFID? - PullRequest
0 голосов
/ 26 марта 2019

Я использую RFID-RC522 для чтения карты с уже установленной в arduino картой RFID, но при использовании функции findCard () в классе RFID я получаю ошибку: В классе RFID нет члена с именем findCard

Я открыл адрес, на котором существует RFID.zip на моем компьютере (я установил его, загрузив zip-файл и добавив его в arduino). Я распаковал его и обнаружил, что нет функции с именем "findCard".

Тогда есть две возможности: мой код - ошибка, или RFID, который я скачал, - ошибка.

Но я снова проверил свой код, он такой же, как то, что было написано в моей книге. И я искал в интернете, чтобы загрузить второй «RFID.zip» из другого места, который, как я позже обнаружил, был таким же, как тот, что я скачал первым.

мой код выглядит следующим образом. Ошибка в строке 19, где есть функция с именем "findCard". Этот код также использует некоторые другие функции в классе RFID, но все они могут быть успешно найдены в RFID.

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

//D10 - 读卡器CS引脚、D5 - 读卡器RST引脚
RFID rfid(10, 5);
unsigned char status;
unsigned char str[MAX_LEN];  //MAX_LEN为16,数组最大长度

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.init(); //初始化
}

void loop()
{
  //Search card, return card types
  if (rfid.findCard(PICC_REQIDL, str) == MI_OK) {
    Serial.println("Find the card!");
    // Show card type
    ShowCardType(str);
    //防冲突检测,读取卡序列号
    if (rfid.anticoll(str) == MI_OK) {
      Serial.print("The card's number is  : ");
      //显示卡序列号
      for (int i = 0; i < 4; i++) {
        Serial.print(0x0F & (str[i] >> 4), HEX);
        Serial.print(0x0F & str[i], HEX);
      }
      Serial.println("");
    }
    //选卡(锁定卡片,防止多数读取,去掉本行将连续读卡)
    rfid.selectTag(str);
  }
  rfid.halt();  //命令卡片进入休眠状态
}

void ShowCardType(unsigned char * type)
{
  Serial.print("Card type: ");
  if (type[0] == 0x04 && type[1] == 0x00)
    Serial.println("MFOne-S50");
  else if (type[0] == 0x02 && type[1] == 0x00)
    Serial.println("MFOne-S70");
  else if (type[0] == 0x44 && type[1] == 0x00)
    Serial.println("MF-UltraLight");
  else if (type[0] == 0x08 && type[1] == 0x00)
    Serial.println("MF-Pro");
  else if (type[0] == 0x44 && type[1] == 0x03)
    Serial.println("MF Desire");
  else
    Serial.println("Unknown");
}

RFID.h в RFID.zip: где нет функции findCard:

/* RFID.h - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
 * Based on code Dr.Leong   ( WWW.B2CQSHOP.COM )
 * Created by Miguel Balboa (circuitito.com), Jan, 2012. 
 * 整理者:极客工坊bg1lsy (lsy@sogou.com)
 * 整理时间:2013.05.25
 */
#ifndef RFID_h
#define RFID_h

#include <Arduino.h>
#include <SPI.h>


/******************************************************************************
 * 定义
 ******************************************************************************/
#define MAX_LEN 16   // 数组最大长度

//MF522命令字
#define PCD_IDLE              0x00               //无动作,取消当前命令
#define PCD_AUTHENT           0x0E               //验证密钥
#define PCD_RECEIVE           0x08               //接收数据
#define PCD_TRANSMIT          0x04               //发送数据
#define PCD_TRANSCEIVE        0x0C               //发送并接收数据
#define PCD_RESETPHASE        0x0F               //复位
#define PCD_CALCCRC           0x03               //CRC计算

//Mifare_One卡片命令字
#define PICC_REQIDL           0x26               //寻天线区内未进入休眠状态
#define PICC_REQALL           0x52               //寻天线区内全部卡
#define PICC_ANTICOLL         0x93               //防冲撞
#define PICC_SElECTTAG        0x93               //选卡
#define PICC_AUTHENT1A        0x60               //验证A密钥
#define PICC_AUTHENT1B        0x61               //验证B密钥
#define PICC_READ             0x30               //读块
#define PICC_WRITE            0xA0               //写块
#define PICC_DECREMENT        0xC0               
#define PICC_INCREMENT        0xC1               
#define PICC_RESTORE          0xC2               //调块数据到缓冲区
#define PICC_TRANSFER         0xB0               //保存缓冲区中数据
#define PICC_HALT             0x50               //休眠

//和MF522通讯时返回的错误代码
#define MI_OK                 0
#define MI_NOTAGERR           1
#define MI_ERR                2


//------------------MFRC522寄存器---------------
//Page 0:Command and Status
#define     Reserved00            0x00    
#define     CommandReg            0x01    
#define     CommIEnReg            0x02    
#define     DivlEnReg             0x03    
#define     CommIrqReg            0x04    
#define     DivIrqReg             0x05
#define     ErrorReg              0x06    
#define     Status1Reg            0x07    
#define     Status2Reg            0x08    
#define     FIFODataReg           0x09
#define     FIFOLevelReg          0x0A
#define     WaterLevelReg         0x0B
#define     ControlReg            0x0C
#define     BitFramingReg         0x0D
#define     CollReg               0x0E
#define     Reserved01            0x0F
//Page 1:Command     
#define     Reserved10            0x10
#define     ModeReg               0x11
#define     TxModeReg             0x12
#define     RxModeReg             0x13
#define     TxControlReg          0x14
#define     TxAutoReg             0x15
#define     TxSelReg              0x16
#define     RxSelReg              0x17
#define     RxThresholdReg        0x18
#define     DemodReg              0x19
#define     Reserved11            0x1A
#define     Reserved12            0x1B
#define     MifareReg             0x1C
#define     Reserved13            0x1D
#define     Reserved14            0x1E
#define     SerialSpeedReg        0x1F
//Page 2:CFG    
#define     Reserved20            0x20  
#define     CRCResultRegM         0x21
#define     CRCResultRegL         0x22
#define     Reserved21            0x23
#define     ModWidthReg           0x24
#define     Reserved22            0x25
#define     RFCfgReg              0x26
#define     GsNReg                0x27
#define     CWGsPReg              0x28
#define     ModGsPReg             0x29
#define     TModeReg              0x2A
#define     TPrescalerReg         0x2B
#define     TReloadRegH           0x2C
#define     TReloadRegL           0x2D
#define     TCounterValueRegH     0x2E
#define     TCounterValueRegL     0x2F
//Page 3:TestRegister     
#define     Reserved30            0x30
#define     TestSel1Reg           0x31
#define     TestSel2Reg           0x32
#define     TestPinEnReg          0x33
#define     TestPinValueReg       0x34
#define     TestBusReg            0x35
#define     AutoTestReg           0x36
#define     VersionReg            0x37
#define     AnalogTestReg         0x38
#define     TestDAC1Reg           0x39  
#define     TestDAC2Reg           0x3A   
#define     TestADCReg            0x3B   
#define     Reserved31            0x3C   
#define     Reserved32            0x3D   
#define     Reserved33            0x3E   
#define     Reserved34            0x3F
//-----------------------------------------------

class RFID
{
  public:
    RFID(int chipSelectPin, int NRSTPD);

    bool isCard();
    bool readCardSerial();
    void init();
    void reset();
    void setBitMask(unsigned char reg, unsigned char mask);
    void clearBitMask(unsigned char reg, unsigned char mask);
    void antennaOn(void);
    void antennaOff(void);
    void calculateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData);
    void writeMFRC522(unsigned char addr, unsigned char val);
    unsigned char readMFRC522(unsigned char addr);
    unsigned char MFRC522Request(unsigned char reqMode, unsigned char *TagType);
    unsigned char MFRC522ToCard(unsigned char command, unsigned char *sendData, unsigned char sendLen, unsigned char *backData, unsigned int *backLen);
    unsigned char anticoll(unsigned char *serNum);
    unsigned char auth(unsigned char authMode, unsigned char BlockAddr, unsigned char *Sectorkey, unsigned char *serNum);
    unsigned char read(unsigned char blockAddr, unsigned char *recvData);
    unsigned char write(unsigned char blockAddr, unsigned char *writeData);
    unsigned char selectTag(unsigned char *serNum);
    void halt();

    unsigned char serNum[5];       // 4字节卡序列号,第5字节为校验字节

  private:
    int _chipSelectPin;
    int _NRSTPD;
};

#endif

1 Ответ

0 голосов
/ 26 марта 2019

Если вы хотите использовать RC522, я предлагаю вам использовать библиотеку, предлагаемую в Arduino IDE.

Нажмите Эскиз -> Включить библиотеку -> Управление библиотеками

Найдите 522 и установите найденную библиотеку. Эта библиотека обновлена, очень хорошо протестирована и специально написана для вашего RFID-ридера и должна поддерживать полный набор функций этого устройства.

Как отметил Иван, используемая вами библиотека относится к 2013 году и, скорее всего, устарела.

...