为什么 class RFID 中没有函数 findCard()?
Why is there no function findCard() in the class RFID?
我正在使用 RFID-RC522 读取已安装在 arduino 中的 RFID 卡,但是在 class RFID 中使用函数 findCard() 时,出现错误:
'class RFID' 没有名为 'findCard'
的成员
我打开了我电脑中RFID.zip所在的地址(我是通过下载一个zip文件安装的,然后添加到arduino中)。解压后发现里面没有名为"findCard".
的函数
那么有两种可能:我的代码有误,或者我下载的RFID有误
但是我又检查了我的代码,它和我书上写的一样。然后我在网上搜索从不同的地方下载了第二个"RFID.zip",后来我发现和我第一次下载的一样。
我的代码如下。错误在第 19 行,其中有一个名为 "findCard" 的函数。这些代码还使用了class 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 in 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
如果你想使用 RC522,我建议你使用 Arduino 中提供的库 IDE。
单击草图 -> 包含库 -> 管理库
搜索 522 并安装找到的库。这个库是最新的,经过很好的测试,专门为您的 RFID-Reader 编写,应该支持该设备的全部功能集。
正如 Ivan 指出的,您使用的库是 2013 年的,很可能已经过时了。
我正在使用 RFID-RC522 读取已安装在 arduino 中的 RFID 卡,但是在 class RFID 中使用函数 findCard() 时,出现错误: 'class RFID' 没有名为 'findCard'
的成员我打开了我电脑中RFID.zip所在的地址(我是通过下载一个zip文件安装的,然后添加到arduino中)。解压后发现里面没有名为"findCard".
的函数那么有两种可能:我的代码有误,或者我下载的RFID有误
但是我又检查了我的代码,它和我书上写的一样。然后我在网上搜索从不同的地方下载了第二个"RFID.zip",后来我发现和我第一次下载的一样。
我的代码如下。错误在第 19 行,其中有一个名为 "findCard" 的函数。这些代码还使用了class 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 in 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
如果你想使用 RC522,我建议你使用 Arduino 中提供的库 IDE。
单击草图 -> 包含库 -> 管理库
搜索 522 并安装找到的库。这个库是最新的,经过很好的测试,专门为您的 RFID-Reader 编写,应该支持该设备的全部功能集。
正如 Ivan 指出的,您使用的库是 2013 年的,很可能已经过时了。