Created
April 20, 2021 10:11
-
-
Save cassc/2d6f21abc4e12e1cbb0c626d98ff4839 to your computer and use it in GitHub Desktop.
Read PN532 UID from uart
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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