Reading 9 Hex-Digits with RFID

Any ideas?

Yes. I suggest that you to learn to use the carriage return now and then. This is ridiculous.

char knowntags[NUMTAGS][11] = {"2100DFB002", "2100E0B6ED", "2100DFF660", "2100DFD586", "2100DFB1E5", "2100E0CBAA", "2100E07B21", "2100E0B9D6", "2100D82331", "2100DFA060", "2100DFBC77", "2100DFA69A", "2100D7EFF7", "2100DFE251", "2100E02F09", "2100DFBF83", "2100DFD9EA", "2100E0ABA6", "2100DFDFC4", "2100DFF0DF", "36005B7B50", "36005B7C05"};
      if(bytesread == 10) {              // if 10 digit read is complete

How do you know/why do you assume that the tag is 10 characters? There is an end-of-tag marker sent. Read and store data until that marker arrives.

You can name the files 0.wav, 1.wav, 2.wav, etc. Then, after properly NULL terminating (you are not currently) code, loop through the array of knowntags, looking for a match. Play the file with the name that matches the index where the scanned tag is found.

        Serial.flush();                  // Flush the serial buffer before trying to read a new code

This just screams CLUELESS. I'm not even going to ask why its here. I'm simply going to say that it is not what you should be doing, so get rid of it.