Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino RC-522 RFID阅读器-比较字节数组中的值_Arduino - Fatal编程技术网

Arduino RC-522 RFID阅读器-比较字节数组中的值

Arduino RC-522 RFID阅读器-比较字节数组中的值,arduino,Arduino,我正在使用以下代码成功地将ID从MIFARE卡读取到串行监视器 #include <SPI.h> #include <MFRC522.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> int readflag; byte readCard[4]; #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_

我正在使用以下代码成功地将ID从MIFARE卡读取到串行监视器

 #include <SPI.h>      
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int readflag;
byte readCard[4];           

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.

///////////////////////////////////////// Setup ///////////////////////////////////
void setup() {

  Serial.begin(9600); 
  SPI.begin();         
  mfrc522.PCD_Init();   
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); 

lcd.begin(20, 4);

    }

///////////////////////////////////////////////////////////////////////////////
  // Main loop
///////////////////////////////////////////////////////////////////////////////
void loop () {

 do {                                                               
   readflag = checkread(); 
  }
    while (!readflag); 

//If card detected do this

       recordid();
  }

///////////////////////////////////////////////////////////////////////////////
  // Stores the ID of the card that's been detected in readCard byte array
///////////////////////////////////////////////////////////////////////////////
void recordid() {
    mfrc522.PICC_IsNewCardPresent();
    mfrc522.PICC_ReadCardSerial();
   lcd.clear();
    for (int i = 0; i < 4; i++) { 
        readCard[i] = mfrc522.uid.uidByte[i];  
             Serial.print( mfrc522.uid.uidByte[i], HEX);  

        }
    Serial.println("");
    mfrc522.PICC_HaltA();
  }


/////////////////////////////////////////////
  // Returns 1 if a card has been detected
/////////////////////////////////////////////
int checkread() {
   if ( ! mfrc522.PICC_IsNewCardPresent()) { 
    return 0; }                                        //no card detected

    mfrc522.PICC_HaltA(); 
    return 1; }                                       //card detected
#包括
#包括
#包括
#包括
int readflag;
字节读卡[4];
#定义SS_引脚10
#定义RST_引脚9
MFRC522 MFRC522(不锈钢插脚、RST插脚);//创建MFRC522实例。
/////////////////////////////////////////设置///////////////////////////////////
无效设置(){
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
mfrc522.PCD_设置天线增益(mfrc522.RxGain_最大值);
lcd.begin(20,4);
}
///////////////////////////////////////////////////////////////////////////////
//主回路
///////////////////////////////////////////////////////////////////////////////
空循环(){
做{
readflag=checkread();
}
而(!readflag);
//如果检测到卡,请执行此操作
recordid();
}
///////////////////////////////////////////////////////////////////////////////
//存储在readCard字节数组中检测到的卡的ID
///////////////////////////////////////////////////////////////////////////////
void recordid(){
mfrc522.PICC_IsNewCardPresent();
mfrc522.PICC_ReadCardSerial();
lcd.clear();
对于(int i=0;i<4;i++){
读卡器[i]=mfrc522.uid.uidByte[i];
串行打印(mfrc522.uid.uidByte[i],十六进制);
}
Serial.println(“”);
mfrc522.PICC_HaltA();
}
/////////////////////////////////////////////
//如果检测到卡,则返回1
/////////////////////////////////////////////
int checkread(){
如果(!mfrc522.PICC_IsNewCardPresent()){
返回0;}//未检测到卡
mfrc522.PICC_HaltA();
返回1;}//检测到卡
我有12张卡,串行监视器告诉我它们的ID是(十六进制):

3278CE3F F5C9FD29 2FC640 82BA7A3F 2BD7A3F 52B77A3F B2E5640 F2DD640 E2ECCC3F 22B3640 2FD640 73D5B7AC

据我所知,这些数据存储在readCard字节数组中

我想将此字节数组的当前值与已知值进行比较,以确定指令是否正在运行(例如LED闪烁)

大概是这样的:

union
{
  byte Bytes[4];
  uint32_t Integer;
} UnionCard;
UnionCard Uc;
Uc.Bytes[i] = mfrc522.uid.uidByte[i];
如果(读卡=2FD640){ 打开LED }

我已经能够使用以下if语句成功完成此操作:

如果((uint32_t)读卡==0x3FCE7832)

比如第一张牌。但是,它不适用于ID不是8位数长的卡,即卡11(2FD640)

有人能帮我用代码实现这个吗

非常感谢。

我不知道为什么
如果((uint32\u t)读卡==0x3FCE7832)
对你有用;它不应该,因为您正在将
字节
指针强制转换为32位整数。你应该做的是:

  • readCard
    声明为
    uint8\u t
    指针,而不是
    byte
  • 比较应该是这样的:
    if(*(uint32_t*)读卡)==0x3FCE7832)
但就像你说的,这对第11张牌不起作用。您必须用零右键填充反转的文本,如下所示:
如果(*(uint32\u t*)读卡)==0x40D62F00)
。要获得反向文字(例如0x2FDD640),请写出完整的字节(左上加零)以生成8位数字(例如0x02FDD640)。然后颠倒字节顺序(例如0x40D6FD02)

您还可以将卡UID存储为代码中的数组,并逐字节进行比较,这样就不会依赖UID的大小来创建32位整数。

您可以使用如下方法:

union
{
  byte Bytes[4];
  uint32_t Integer;
} UnionCard;
UnionCard Uc;
Uc.Bytes[i] = mfrc522.uid.uidByte[i];
像这样使用它:

union
{
  byte Bytes[4];
  uint32_t Integer;
} UnionCard;
UnionCard Uc;
Uc.Bytes[i] = mfrc522.uid.uidByte[i];
像循环中的
readCard[i]
一样填充它,如下所示:

union
{
  byte Bytes[4];
  uint32_t Integer;
} UnionCard;
UnionCard Uc;
Uc.Bytes[i] = mfrc522.uid.uidByte[i];
通过以下方式获取UInt:

Uc.Integer;

谢谢-但是当如上声明联合时,我得到了“['令牌联合之前的预期非限定id”。联合联合卡{byte[4]Bytes;uint32_t Integer;};@mh512哦,是的,抱歉,有一个小错误。我更正了代码!谢谢,我已经实现了此功能,但它不适用于非4字节的卡。即,当我查找*((uint32_t*)readCard)=时,找不到卡F2DD6400x64DDF200@mh512那是因为你填错了。我会编辑我的答案