Printing the value of hold slows down reading of data from rfid. Currently you check if any data, even just one character, is available from rfid but as soon as you read it there is nothing more to read as it has not arrived yet so the while loop exits. To prove this, replace the Serial.print of hold with a short delay. If this works then fix the code properly by ensuring that there is a character to read each time before you do it.
NOTE - adding the delay IS NOT THE WAY TO DO IT IN PRACTICE, only a diagnostic test.
If this works then fix the code properly by ensuring that there is a character to read each time before you do it.
And, of course, hold should be either global or static (static is better). Otherwise, a pass through loop when there aren't 14 characters to read will cause you to reset hold next pass.