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



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

目标:我想读取卡ID+读取+写入卡,而无需移除并重新进入天线场。

我为每一项手术分别写了草图,每一项工作都是独立的。当我将代码组合成一个草图时,它会读取卡ID,但无法执行读/写功能。如果我注释掉除一个调用之外的所有调用,我可以ReadCardData((、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,4,7);
//Serial.print("carType = ");
Serial.println(isGood);
isGood = WriteBlock(carColor,5,7);
//Serial.print("carColor = ");
Serial.println(isGood);
isGood = WriteBlock(carName,6,7);
//Serial.print("carName = ");
Serial.println(isGood);
isGood = WriteBlock(carNumber,8,11);
//Serial.print("carNumber = ");
Serial.println(isGood);
isGood = WriteBlock(carOwner,9,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 blockAddr, 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, trailerBlock, &key, &(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((。

最新更新