Source code for AutoHeadFix.AHF_TagReader
#! /usr/bin/python
#-*-coding: utf-8 -*-
import serial
[docs]class AHF_TagReader:
"""
Class to read values from a Innovations RFID tag reader, such as ID-20LA
"""
[docs] def __init__(self, serialPort, doChecksum = False):
"""
Makes a new AHF_TagReader object
:param serialPort: serial port tag reader is attached to, /dev/ttyUSB0 or /dev/ttyAMA0 for instance
:param doCheckSum: set to calculate the checksum on each tag read
"""
# initialize serial port
self.serialPort = None
try:
self.serialPort = serial.Serial(str (serialPort), baudrate=9600)
except IOError as anError:
print ("Error initializing TagReader serial port.." + str (anError))
raise anError
if (self.serialPort.isOpen() == False):
self.serialPort.open()
self.serialPort.flushInput()
# set boolean for doing checksum on each read
self.doCheckSum = bool(doChecksum)
[docs] def clearBuffer (self):
"""
Clears the serial buffer for the serialport used by the tagReader
"""
self.serialPort.flushInput()
[docs] def readTag (self):
"""
Reads a hexidecimal RFID tag from the serial port using a blocking read and returns the decimal equivalent
RFID Tag is 16 characters: STX(02h) DATA (10 ASCII) CHECK SUM (2 ASCII) CR LF ETX(03h)
1 char of junk, 10 of hexadecimal data, 2 of hexadecimal check sum, 3 of junk
:returns decimal value of RFID tag
:raises IOError: if serialPort not read
raises ValueError: if checksum or conversion from hex to decimal fails
"""
serialJunk = self.serialPort.read(1)
serialTag = self.serialPort.read(10)
serialCheckSum = self.serialPort.read(2)
serialJunk = self.serialPort.read(3)
if serialJunk.__len__() < 3:
self.serialPort.flushInput()
raise IOError
try:
decVal = int(serialTag, 16)
except ValueError as anError:
print ("TagReader Error converting tag to integer: " + str (serialTag) + ': ' + str (anError))
self.serialPort.flushInput()
raise ValueError
else:
if self.doCheckSum == True:
if self.checkSum(serialTag, serialCheckSum)== True:
return decVal
else:
print ("TagReader checksum error: " + str (serialTag) + ': ' + str (serialCheckSum))
self.serialPort.flushInput()
raise ValueError
else:
return decVal
[docs] def checkSum(self, tag, checkSum):
"""
Sequentially XOR-ing 2 byte chunks of the 10 byte tag value will give the 2-byte check sum
:param tag: the 10 bytes of tag value
:param checksum: the two butes of checksum value
:returns: True if check sum calculated correctly, else False
"""
checkedVal = 0
try:
for i in range(0,5):
checkedVal = checkedVal ^ int(tag [(2 * i) : (2 * (i + 1))], 16)
if checkedVal == int(checkSum, 16):
return True
else:
return False
except Exception:
return False
def __del__(self):
if self.serialPort is not None:
self.serialPort.close()
if __name__ == '__main__':
serialPort = '/dev/ttyUSB0'
doCheckSum = True
nReads =3
try:
tagReader = AHF_TagReader (serialPort, doCheckSum)
for i in range (0,nReads):
print (tagReader.readTag ())
print ('Read ' + str (nReads) + ' tags')
except Exception:
print ('Tag reader not found, check port ' + serialPort)