问题描述
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()。