Can RFID read stacked cards?
Question
Can a RFID reader read a stack of playing cards?


Answer
Short Answer
(1) My RFID reader will freeze if given a two card stack to read, and
(2) It will complain if I try to slowly splay the two cards.

Long Answer (TLDR)
Part 1 - Introduction
The RFID reader can of course read cards one by one, but not sure what will happen if trying to read a stack or a splay.
I have a python program to read cards one by one, next step is try to read a stack.

Part 2 - Testing Procedure
(1) Which kind of RFID reader and library to use for testing
I have basically two kinds of cheap RFID modules, pn532 and RC522.  I can use SPI, I2C or UART interface, using libraries or writing a program using python. However, I think there is no need to spend time to choose which reader and which library to use, because I think they are not relevant. Also I think the reading distance is also not relevant, my two kinds of RC522, and THM3060 can read cards at 2 cm and 10 cm.  But I don't think distance matters.
So I think what to find out first is the following:
If I give a stack of cards for the RFID card reader to read, will it just read the card that it get the strongest signal, or the first card that he gets a signal, or random?

(2) Testing procedure
(a) Take 4 cards and separately write the names Spade Ace, Diamond Ace, Club Ace, and Heart Ace to each of them and then read back.
(b)  Now try to read them again, but two cards at a time, three at a time and four at a time.

Part 3 - Testing Results
So I first tested 4 playing cards one by one, giving them names &quot;Heart Ace&quot; etc.  Then I read them back one by one without any problem.
Next is the fun part.  I give a two card stack, but the reader hangs. I think it gets confused of a corrupted signal.
Next I tried to splay them, very very slowly, as I was playing poker. Then a weird thing happens, the reader gave the following error message:
AUTH ERROR!!
AUTH ERROR(status2reg &amp; 0x08) != 0
What is also interesting is that the Thonny python 3.7.3 prints the above message
IN BRIGHT RED!!! (This is my first time seeing a red warning from Thonny, after programming Thonny python for a year or so!)

This is the main test functions I am using (Appendix B)
def main():
printBeginProgram()
#testMcp3201()
#testMcp3208()
#testRc522()
#writeRfidCard('Diamond Ace')
#readRfidCard()
#writeRfidCard('Heart Ace')
#readRfidCard()
#writeRfidCard('Club Ace')
#readRfidCard()
#writeRfidCard('Spade Ace')
#readRfidCard() 
readRfidCard()

printEndProgram()
return

And this is a sample output
Sample Output

%Run rfd_util_01_v134..py

     Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17
       spiPortName   = SpiPort00
       spiSpeedName  = 1 MHz

       This RFID card is (647176253282, 'Diamond Ace                                     ')

     End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17

%Run rfd_util_01_v134..py
     Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:18
       spiPortName   = SpiPort00
       spiSpeedName  = 1 MHz

AUTH ERROR!!
AUTH ERROR(status2reg &amp; 0x08) != 0

/ to continue, ...
/ to continue, ...

References
(1) Program listing and sample output of a python program to read RFID cards one by one v0.1 2020sep05
(2) RFID Mfrc522-nfc Module Testing Notes
(3) pn532-nfc Module Testing Notes 1/2
(4) pn532- nfc Module Testing Notes 2/2
(5) RFID Reader Signal Strength Measurement Notes
(6) RFID Reader THM3060 Setup Notes
/ to continue, ...

Appendices
Appendix A - Sample output of python program reading RFID cards one by bone.


Appendix B - Sample output of python program reading cards one by one and also a stack and a splay
# Program:

rfd_util01_v135.py tlfong01 2020sep05hkt1619
def writeRfidCard(nameString):
# 1. Set SPIPort00 SPI speed 1 MHz 
print('\n       1.  *** Set SpiPort00 1 MHz ***')
spiutil.setSpiPortSpeedBySpiPortNameList(['SpiPort00'], '1 MHz') # &lt;&lt;&lt; SpiPort00 &lt;&lt;&lt;

# 2. Loop back SpiPOr00 three bytes 0x5b, 0x5c, ox5d 
print('\n       2.  *** Loopback SpiPort00 three bytes 0x5b, 0x5c, 0x5d (remember to short MOSI and MISO ***')    
spiutil.testLoopbackThreeBytesSpiPortNameList(['SpiPort00'], '0x5d', '0x5c', '0x5b') # &lt;&lt;&lt; SpiPort00 &lt;&lt;&lt;

# 3. Test RC522 WriteRead

print('\n       3.  *** RC522 Module Write/Read Test (Remember to place RFID tag/car on top or near the RC522 Module ***')  

GPIO.setwarnings(False)

reader = SimpleMFRC522() # *** Create SimpleMFRC522 object

reader.write(nameString)   # Writete something to RFID tag/card, must place tag/card on top or near to the RC522 module
#reader.write('Joker')   # Writete something to RFID tag/card, must place tag/card on top or near to the RC522 module

readText = reader.read() # Read back from tag/card

print('\n       This RFID card is', readText)

return

def readRfidCard():
# 1. Set SPIPort00 SPI speed 1 MHz 
# print('\n       1.  *** Set SpiPort00 1 MHz ***')
spiutil.setSpiPortSpeedBySpiPortNameList(['SpiPort00'], '1 MHz') # &lt;&lt;&lt; SpiPort00 &lt;&lt;&lt;

# 2. Loop back SpiPOr00 three bytes 0x5b, 0x5c, ox5d 
# print('\n       2.  *** Loopback SpiPort00 three bytes 0x5b, 0x5c, 0x5d (remember to short MOSI and MISO ***')    
# spiutil.testLoopbackThreeBytesSpiPortNameList(['SpiPort00'], '0x5d', '0x5c', '0x5b') # &lt;&lt;&lt; SpiPort00 &lt;&lt;&lt;

# 3. Test RC522 WriteRead

# 3. Read RFID card

# print('\n       3.  *** RC522 Module Write/Read Test (Remember to place RFID tag/car on top or near the RC522 Module ***')  

GPIO.setwarnings(False)

reader = SimpleMFRC522() # *** Create SimpleMFRC522 object

#reader.write('Dimond Ace')   # Writete something to RFID tag/card, must place tag/card on top or near to the RC522 module
#reader.write('Joker')   # Writete something to RFID tag/card, must place tag/card on top or near to the RC522 module

readText = reader.read() # Read back from tag/card

print('\n       This RFID card is', readText)

return

Main
def main():
printBeginProgram()
#testMcp3201()
#testMcp3208()
#testRc522()
#writeRfidCard('Diamond Ace')
#readRfidCard()
#writeRfidCard('Heart Ace')
#readRfidCard()
#writeRfidCard('Club Ace')
#readRfidCard()
#writeRfidCard('Spade Ace')
#readRfidCard()
readRfidCard()
printEndProgram()
return

if name == 'main':
main()
End of program
Sample Output
Python 3.7.3 (/usr/bin/python3)
%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:08
spiPortName   = SpiPort00
spiSpeedName  = 1 MHz
   This RFID card is (504284031262, 'Dimond Ace                                      ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:08

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:12
Traceback (most recent call last):
File &quot;/home/pi/Programs/programs/rfd_util_01_v134..py&quot;, line 544, in 
main()
File &quot;/home/pi/Programs/programs/rfd_util_01_v134..py&quot;, line 534, in main
writeRfidCard('Diamond Ace')
NameError: name 'writeRfidCard' is not defined
%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:13
   1.  *** Set SpiPort00 1 MHz ***
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   2.  *** Loopback SpiPort00 three bytes 0x5b, 0x5c, 0x5d (remember to short MOSI and MISO ***
   sendBytes                               = 0x5d 0x5c 0x5b
   sendBytes                               = 0x01 0x6f 0x5c

   3.  *** RC522 Module Write/Read Test (Remember to place RFID tag/car on top or near the RC522 Module ***

   This RFID card is (504284031262, 'Diamond Ace                                     ')
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   This RFID card is (504284031262, 'Diamond Ace                                     ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:13

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:13
   1.  *** Set SpiPort00 1 MHz ***
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   2.  *** Loopback SpiPort00 three bytes 0x5b, 0x5c, 0x5d (remember to short MOSI and MISO ***
   sendBytes                               = 0x5d 0x5c 0x5b
   sendBytes                               = 0x01 0x6f 0x5c

   3.  *** RC522 Module Write/Read Test (Remember to place RFID tag/car on top or near the RC522 Module ***

   This RFID card is (647176253282, 'Diamond Ace                                     ')
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   This RFID card is (647176253282, 'Diamond Ace                                     ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:13

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:14
   1.  *** Set SpiPort00 1 MHz ***
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   2.  *** Loopback SpiPort00 three bytes 0x5b, 0x5c, 0x5d (remember to short MOSI and MISO ***
   sendBytes                               = 0x5d 0x5c 0x5b
   sendBytes                               = 0x01 0x6f 0x5c

   3.  *** RC522 Module Write/Read Test (Remember to place RFID tag/car on top or near the RC522 Module ***

   This RFID card is (504284031262, 'Heart Ace                                       ')
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   This RFID card is (504284031262, 'Heart Ace                                       ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:14

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:15
   1.  *** Set SpiPort00 1 MHz ***
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   2.  *** Loopback SpiPort00 three bytes 0x5b, 0x5c, 0x5d (remember to short MOSI and MISO ***
   sendBytes                               = 0x5d 0x5c 0x5b
   sendBytes                               = 0x01 0x6f 0x5c

   3.  *** RC522 Module Write/Read Test (Remember to place RFID tag/car on top or near the RC522 Module ***

   This RFID card is (233736302454, 'Club Ace                                        ')
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   This RFID card is (233736302454, 'Club Ace                                        ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:15

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:16
   1.  *** Set SpiPort00 1 MHz ***
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   2.  *** Loopback SpiPort00 three bytes 0x5b, 0x5c, 0x5d (remember to short MOSI and MISO ***
   sendBytes                               = 0x5d 0x5c 0x5b
   sendBytes                               = 0x01 0x6f 0x5c

   3.  *** RC522 Module Write/Read Test (Remember to place RFID tag/car on top or near the RC522 Module ***

   This RFID card is (896130096106, 'Spade Ace                                       ')
   spiPortName   = SpiPort00
   spiSpeedName  = 1 MHz

   This RFID card is (896130096106, 'Spade Ace                                       ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:16

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17
spiPortName   = SpiPort00
spiSpeedName  = 1 MHz
   This RFID card is (504284031262, 'Heart Ace                                       ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17
spiPortName   = SpiPort00
spiSpeedName  = 1 MHz
   This RFID card is (233736302454, 'Club Ace                                        ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17
spiPortName   = SpiPort00
spiSpeedName  = 1 MHz
   This RFID card is (896130096106, 'Spade Ace                                       ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17
spiPortName   = SpiPort00
spiSpeedName  = 1 MHz
   This RFID card is (647176253282, 'Diamond Ace                                     ')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:17

%Run rfd_util_01_v134..py
Begin program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:18
spiPortName   = SpiPort00
spiSpeedName  = 1 MHz
AUTH ERROR!!
AUTH ERROR(status2reg &amp; 0x08) != 0
   This RFID card is (896130096106, '')

 End   program rfdutil_01_v134 (Testing SimplMFRC522)  tlfong01  2020-09-05 16:18