pn532 shield crash if remove tag too early

For other supported Arduino products from Adafruit: Shields, accessories, etc.

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
User avatar
kasperhangard
 
Posts: 8
Joined: Wed Jun 11, 2014 1:57 pm

pn532 shield crash if remove tag too early

Post by kasperhangard »

Hey guys. i am having some problems with my NFC shield. if i start to scan the tag, and remove the tag, before the scanner is done, it crashes and restarts my arduino.

how do i solve this?

Code: Select all

byte namecheckerloadReady = 1;
byte namecheckerReady = 0;
byte writerReady = 0;
byte linecheckerReady = 0;
byte linenumbersetReady = 0;
byte clearerReady = 0;
byte linenumbersetdirty = 0;
byte printerReady = 0;
byte readerReady = 1;
int freeline = 0;
int linetoclear = 0;
int nextlinenumber = 0;
const byte entryCount = 17;
const byte entrySize = 19;
char inData[entryCount][entrySize]; 
const byte MAX_INPUT_LENGTH = 16;
char namecheck[MAX_INPUT_LENGTH+1];
char lineholder[MAX_INPUT_LENGTH+1];
byte namecheckindex = 0;
char inChar; 
byte index = 0; 
byte linenumber = 0;
byte queuenumber = 0;

#include <Mifare.h>
#include <NDEF.h>
#include <Wire.h>
#include <PN532_I2C.h>
#define IRQ   2
#define RESET 3
#define PAYLOAD_SIZE 224
PN532 * board = new PN532_I2C(IRQ, RESET);
Mifare mifare;

//init keys for reading classic
uint8_t Mifare::useKey = KEY_A;
uint8_t Mifare::keyA[6] = {
  0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 };
uint8_t Mifare::keyB[6] = {
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
uint32_t Mifare::cardType = 0; //will get overwritten if it finds a different card
uint8_t payload[PAYLOAD_SIZE] = {
};


void setup() {
  Serial.begin(115200);
  board->begin();
  uint32_t versiondata = board->getFirmwareVersion();
  if (! versiondata) {
    Serial.println("err");
    while (1); // halt
  }
  if(mifare.SAMConfig()){
    Serial.println("ok");  
  }
  else{
    Serial.println("err");
  }
}


void writer()
{
  //  delay(1000);
  // Serial.println("starting writer");
  // Serial.println("inside writer");
  // Serial.println(index);
  // Serial.print("linenumber: ");
  // Serial.println(linenumber);
  if ((linenumber<entryCount) && (index < entrySize))
  {
    for(byte i = 0; i < entrySize; i++)
    {
      inChar = namecheck[i]; //read from Serial 

      if (inChar == 0 ) // if character is the enter key
      {
        // Serial.println("Writing");
        inData[linenumber][index] = 0; // trailing null
        // Serial.print("have written ");
        // Serial.print(inData[linenumber]); // show received line
        // Serial.print(" to line: ");
        // Serial.println(linenumber);
        index = 0;
        writerReady = 0;
        namecheckerloadReady = 1;
        linenumber++;
        printer();
        clearerReady = 1;
        linenumbersetdirty = 0;
        linenumberset();
        writerReady = 1;
        break;
      } 
      else
      {

        // Serial.println(index);
        inData[linenumber][index] = inChar; //store it in inData
        index++; //make ready for next time - Next array "downwards"
      }
    }
  }

}

void queuefix()
{
  // Serial.println("Starting queuefix");
  for (byte i = linetoclear; i < entryCount; i++)
  {
    index = 0;
    if(inData[i][0] == 0)
    {
      break;
    }
    do
    {
      inData[i][index] = inData[i+1][index];
      index ++;
    } 
    while (inData[i+1][index] != 0);
    // Serial.print("moving ");
        // Serial.println(lineholder[i]);
  }
  printerReady = 1;
}


void linenumberset()
{
  // Serial.println("Running linenumberset");
  for(byte i = 0; i < entryCount; i++)
  {
    if(strlen(inData[i]) == 0)   // check if the length of the string is 0
    {
      if(linenumbersetdirty == 0)
      { 
        linenumber = i;
      }
      linenumbersetdirty = 1;

      //      // Serial.print("free line at ");
      //      // Serial.println(i);

    }        
    if(i == (entryCount-1))
    {
      // Serial.println("linenumberset done");
      linenumbersetReady = 0;
      inChar = 0;
      printer();
      break;

    }
  }

  // Serial.print("freeline = ");
  // Serial.println(linenumber);
  linenumbersetdirty = 1;
}

void namechecker()
{
  // Serial.println("Running namechecker");
  delay(1000);
  // Serial.print("name to look for: ");
  // Serial.println(namecheck);
  for(byte i = 0; i < entryCount; i++)
  {
    if(strcmp(inData[i], namecheck) == 0)
    {
      // Serial.print("name found: ");
      // Serial.println(inData[i]);
      linetoclear = i;
      // Serial.print("is already here at position ");
      // Serial.println(i);
      // Serial.println("clearer line");
      inData[i][0] = 0;
      // Serial.print("name cleared: ");
      // Serial.println(inData[i]);
      index = 0;
      queuefix();
      linenumbersetdirty = 0;
      linenumberset();
      writerReady = 0;   // don't needed, I believe (LS)
      namecheckerloadReady = 1;
      linecheckerReady = 1;
      readerReady = 1;
      break;
    }
    else
    {
      writerReady = 1;
      index = 0; 

    }
  }

  // Serial.println("Exiting namechecker");
  namecheckerReady = 0;   // repeated (LS)
  index = 0;

}


void printer()
{
  Serial.write(27);       // ESC command
  Serial.print("[2J");    // clear screen command
  Serial.write(27);
  Serial.print("[H");     // cursor to home command
  // Serial.println("Starting printer");
  for(byte i = 0; i < entryCount; i++)
  { 
    if (inData[i][0] != 0)
    {
Serial.println(inData[i]);

    }
  }
  printerReady = 0;
  index = 0;
}

void reader()
{
  // Serial.println("Reader Ready");
  uint8_t * uid = mifare.readTarget();
  if(uid){    
    memset(payload, 0, PAYLOAD_SIZE);
    mifare.readPayload(payload, PAYLOAD_SIZE);
    FOUND_MESSAGE m = NDEF().decode_message(payload);     
    // Serial.print("readeren recieved: ");
 Serial.println((char*)m.payload);
    do
    {
      inChar = m.payload[index]; //read from Serial     //inChar is set to payload[index]. payload being the array holding the NFC readers data
      namecheck[namecheckindex] = inChar; //store it in inData
      namecheckindex++; //make ready for next time - Next array "downwards"
      // Serial.println(index);
      index++;
    }
    while (inChar != 13);
    namecheck[namecheckindex] = 0; // trailing null
    // Serial.print("namecheck has "); // show received line
    // Serial.println(namecheck);
    namecheckindex=0;
    namecheckerReady = 1;
    namecheckerloadReady = 0;
    readerReady = 0;                            //  H E R E   i s   a   b e t t e r   p l a c e 
    index = 0;  
    delay(100);  
  }
  delay(2000);
}




void loop() {

  if (readerReady == 1)
  {
    reader();
    namecheckerloadReady = 1; 
  }

  if (namecheckerReady == 1)
  {
    namechecker();
  }

  //  if( printerReady == 1) 
  //  {
  //    Serial.println("printer should start");    
  //    printer();
  //  }

  if (writerReady == 1)
  {
    writer(); 
  }

  if (linenumbersetReady == 1)
  {
    nextlinenumber = 30;
    index = 0;
    linenumberset(); 
    linenumbersetdirty = 1;
  }
  if (clearerReady == 1)
  {
    clearerReady = 0;
    readerReady = 1;
    index = 0;
  }
}
This is my code. it is meant to run in putty btw.
if i remove the tag too early, the busy light turns off, and after like 1 second, it restarts, printing the "ok" line.
i need it to just start "reader()" again, instead of the whole arduino restarting. how would i fix this? i have tried to fix it for very long now. :/

User avatar
adafruit_support_mike
 
Posts: 67485
Joined: Thu Feb 11, 2010 2:51 pm

Re: pn532 shield crash if remove tag too early

Post by adafruit_support_mike »

Reboots are usually a symptom of a memory overflow.

Take a look at this tutorial for information about how to measure the amount of memory your Arduino is using, and see if that gives you any clues: https://learn.adafruit.com/memories-of- ... ree-memory

Locked
Please be positive and constructive with your questions and comments.

Return to “Other Arduino products from Adafruit”