微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RFID无法同时读取标签ID和数据

如何解决RFID无法同时读取标签ID和数据

Win-10,Arduino IDE 1.8.13,Arduino NANO,MFRC522库。 所有代码均基于提供的库示例。

目标:我想读取卡ID +读取+写入卡,而不必删除并重新输入天线字段。

我为每个操作分别编写了草图,并且每个独立地工作。当我将代码组合到一个草图中时,它将读取卡ID,但无法执行读/写功能。如果我注释掉一个电话以外的所有电话,则可以读取CardCardData()或WriteCardData()或CardId()。我知道这与卡的检测/停止方式有关,但我无法找出正确的组合。有什么建议吗?

问题:有没有一种方法可以读取卡ID(扇区0块0)并提取值,而不必使用IsNewCardPresent()?

一些无关的代码已被裁剪....... 数据结果放在声明的变量中。

组合功能中的循环

     void loop() {
  if(digitalRead(DropOff)== LOW){
    digitalWrite(Red,HIGH);
  }else{
    digitalWrite(Red,LOW);
  }
  if(digitalRead(PickUp)== LOW){
    digitalWrite(Green,HIGH);
  }else{
    digitalWrite(Green,LOW);
  }
  // print the string when a newline arrives:
  delay(1000);
  cardTime = millis();
  A = cardTime - holdTime;
  if (A >= 2000){
    Serial.print("A = ");
    Serial.println(A);
     // WriteCardData();
     // delay(3000);
     //CardId();
      ReadCardData ();
      // WriteCardData();
      holdTime = cardTime;
  } else {
    //holdTime = cardTime;
  }

所有这些功能都起作用

void CardId(){

if (  mfrc522.PICC_IsNewCardPresent()){
    //Serial.println(F("A new card is Present"));
  mfrc522.PICC_ReadCardSerial();
  tagString = "";
  tagString = String(mfrc522.uid.uidByte[0]);
  tagString = tagString + String(mfrc522.uid.uidByte[1]);
  tagString = tagString + String(mfrc522.uid.uidByte[2]);
  tagString = tagString + String(mfrc522.uid.uidByte[3]);
  Serial.print("UID = ");
  Serial.println(tagString);
  //closeCard();
  delay(200);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(tagString);
} // end main if
else {
  closeCard();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("no card");
}
} // end function

// **************************************************************
void ReadCardData (){
    String myTest = "";
    myTest = openCard();
    Serial.println(myTest);
    carType = ReadBlock(1,4,7);
    Serial.print("carType = ");
    Serial.println(carType);
    carColor = ReadBlock(1,5,7);
    Serial.print("carColor = ");
    Serial.println(carColor);
    carName = ReadBlock(1,6,7);
    Serial.print("carName = ");
    Serial.println(carName);
    carNumber = ReadBlock(2,8,11);
    Serial.print("carNumber = ");
    Serial.println(carNumber);
    carOwner = ReadBlock(2,9,11);
    Serial.print("carOwner = ");
    Serial.println(carOwner);
    closeCard();
}

// *************************************************************
void WriteCardData (){
    openCard();
    isGood = WriteBlock(carType,7);
    //Serial.print("carType = ");
    Serial.println(isGood);
    isGood = WriteBlock(carColor,7);
    //Serial.print("carColor = ");
    Serial.println(isGood);
    isGood = WriteBlock(carName,7);
    //Serial.print("carName = ");
    Serial.println(isGood);
    isGood = WriteBlock(carNumber,11);
    //Serial.print("carNumber = ");
    Serial.println(isGood);
    isGood = WriteBlock(carOwner,11);
    //Serial.print("carOwner = ");
    Serial.println(isGood);
    closeCard();
}




// ***************************************************************************
void dump_byte_array(byte *buffer,byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
        //Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        //Serial.print(buffer[i],HEX);
        msgArray[i] = buffer[i];
       //Serial.print(msgArray[i]);
    }

}

// **********************************************************************
String openCard(){
 /* int z = 0;
   for (int i=0; i<5; i++){
         if ( mfrc522.PICC_IsNewCardPresent()){
            break;
         }else{ 
              z = ++z; 
              if (z = 4){
                 return "loop Failed";
              }   
         }
    }
    if ( ! mfrc522.PICC_ReadCardSerial()){
        return "read Failed";
    }
    */
    while ( ! mfrc522.PICC_IsNewCardPresent()) {
     //do nothing
  }
  mfrc522.PICC_IsNewCardPresent();
return "got it!";
}
// ********************************************************************
void closeCard(){
     // Halt PICC
    mfrc522.PICC_HaltA();
    // Stop encryption on PCD
    mfrc522.PCD_StopCrypto1();
}
// *********************************************************************
String ReadBlock (int sector,int blockAddr,int trailerBlock){
 
    //MFRC522::StatusCode status;
    byte buffer[18];
    byte size = sizeof(buffer);
    // Authenticate using key A
    //Serial.println(F("Authenticating using key A..."));
    status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,trailerBlock,&key,&(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
         //Serial.print(F("PCD_Authenticate() Failed: "));
         //Serial.println(mfrc522.GetStatusCodeName(status));
        return "Failed";
    }
    // Read data from the block
     //Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
     //Serial.println(F(" ..."));
    status = (MFRC522::StatusCode) mfrc522.mifare_Read(blockAddr,buffer,&size);
    if (status != MFRC522::STATUS_OK) {
        // Serial.print(F("mifare_Read() Failed: "));
        // Serial.println(mfrc522.GetStatusCodeName(status));
        return "Failed";
    }
    //Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer,16); Serial.println();

    Serial.println();
    String q = "";
    int t = 0;
    int w = 0;
    for (int i=0; i<16; i++){
      t = msgArray[i] + 0;
      if (t<32 || t>126)        // check for random byte values that aren't acceptable ASCII
        {
           msgArray[i] = 32;    // change bad value to a space bar
        }
    }    
    q = msgArray;    
    q.trim();                   // get rid of trailing spaces
    w = q.length();
     //Serial.print("size of array = ");
     //Serial.println(w);
     //Serial.println(q);
    if (w < 1){                 // test for empty string -- will pass random printable ASCII
      return "unkNown";
    }else{

      return q;
    }
}
// ********************************************
String WriteBlock (String storeData,int trailerBlock){
    // Serial.println("enter function");
    storeData.trim();
    int w = storeData.length();
    if (w < 16) {
      for (int i=0; i < (16-w); i++){
        storeData += " ";
      }
      // Serial.println("pad data");
      for (int i=0; i < 16; i++){
        myBlock[i] = storeData[i];
      }
    }
    else if (w > 16){
       for (int i=0; i < 16; i++){
        myBlock[i] = storeData[i];
      }
      // Serial.println("remove data");
    }
    //MFRC522::StatusCode status;
    byte buffer[18];
    byte size = sizeof(buffer);
    // Authenticate using key A
    // Serial.println(F("Authenticating using key A..."));
    status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,&(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
        //Serial.print(F("PCD_Authenticate() Failed: "));
        //Serial.println(mfrc522.GetStatusCodeName(status));
        return "Failed";
    }
 
    // Write data to the block
    // Serial.print(F("Writing data into block ")); Serial.print(blockAddr);
    // Serial.println(F(" ..."));
    //dump_byte_array(myBlock,16); Serial.println();
    status = (MFRC522::StatusCode) mfrc522.mifare_Write(blockAddr,myBlock,16);
    if (status != MFRC522::STATUS_OK) {
        // Serial.print(F("mifare_Write() Failed: "));
        // Serial.println(mfrc522.GetStatusCodeName(status));
         return "Failed";
    }
    // Serial.println("end of function");
return "good";





}
// ********************************************

解决方法

Nano的内存几乎已满,并且不稳定。删除了所有openCard()和closecard(),仅将其放置在程序的主“循环”中。如果已打开卡,则设置标志。根据需要调用readCard()或writeCard()。具有读/写设置标志以触发主循环底部的closeCard()。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。