Skip to content

Instantly share code, notes, and snippets.

@cassc
Created April 20, 2021 10:11
Show Gist options
  • Select an option

  • Save cassc/2d6f21abc4e12e1cbb0c626d98ff4839 to your computer and use it in GitHub Desktop.

Select an option

Save cassc/2d6f21abc4e12e1cbb0c626d98ff4839 to your computer and use it in GitHub Desktop.
Read PN532 UID from uart
# https://www.waveshare.com/wiki/PN532_NFC_HAT
# PN532 UART
import serial
import time
_port = '/dev/ttyUSB0'
_baudrate = 115200
_timeout = 2
_max_retry = 100
def open_port():
return serial.Serial(
port=_port,
baudrate=_baudrate,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=_timeout)
def wait_ser(ser, timeout=_timeout):
t = 0
while ser.inWaiting() <= 0:
if t > timeout:
return False
time.sleep(0.01)
t += 0.01
return True
def wake_reader(ser):
cmd = '55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00'
cmd = cmd.replace(' ', '')
# expected resp for wake command
resp = '00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00'.replace(' ', '').lower()
ser.write(bytes.fromhex(cmd))
if not wait_ser(ser):
print('wait for reader resp timeout')
return False
data = ser.read(int(len(resp)/2))
print(data.hex())
return data.hex() == resp
def read_uid(ser):
cmd = '00 00 FF 04 FC D4 4A 01 00 E1 00'
cmd = cmd.replace(' ', '')
header = '00 00 FF 0C F4 D5 4B 01 01 00 04 08 04'.replace(' ', '')
header_len = len(header)
trim_header = '00 00 ff 00 ff 00'.replace(' ', '')
ser.write(bytes.fromhex(cmd))
if not wait_ser(ser):
print('wait for reader resp timeout')
return False, None
resp = ''
while ser.inWaiting() > 0:
resp += ser.read().hex()
while resp.startswith(trim_header):
resp = resp[len(trim_header):]
if resp == '':
return False, None
return resp[header_len:][:-4], resp
ser = open_port()
while not wake_reader(ser):
print('Wake up reader failed')
time.sleep(1)
while True:
uid, resp = read_uid(ser)
if uid:
print(f'Found tag: {uid}')
time.sleep(.1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment