Python Forum

Full Version: Handling Multiple USB ports in Python
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi,
I am new to python and to the forum too. In my python application I have to read from two USB ports and process the data I get from any of the USB port. For one port I am using pyUSB to read data from the device. On another USB port is attached a device for which I am using method from shared object library(.so file). If I rung the functions independently I get the desired response from each USB port. But If I run the application in a while loop alternately I can only get the response from port that I am reading using pyUsb.
Here is my sample code. Please let me know if the approach is incorrect or I have to follow some other approach.
import usb.core
import array
import usb.util
from time import sleep
import ctypes

devStatus = False
ep = None
interfaceNo = None
eaddr = None
dev = None

def hid2ascii(lst):
	assert len(lst) == 8, 'Invalid data length (needs 8 bytes)'
	conv_table = {
        0:['', ''],
        4:['a', 'A'],
        5:['b', 'B'],
        6:['c', 'C'],
        7:['d', 'D'],
        8:['e', 'E'],
        9:['f', 'F'],
        10:['g', 'G'],
        11:['h', 'H'],
        12:['i', 'I'],
        13:['j', 'J'],
        14:['k', 'K'],
        15:['l', 'L'],
        16:['m', 'M'],
        17:['n', 'N'],
        18:['o', 'O'],
        19:['p', 'P'],
        20:['q', 'Q'],
        21:['r', 'R'],
        22:['s', 'S'],
        23:['t', 'T'],
        24:['u', 'U'],
        25:['v', 'V'],
        26:['w', 'W'],
        27:['x', 'X'],
        28:['y', 'Y'],
        29:['z', 'Z'],
        30:['1', '!'],
        31:['2', '@'],
        32:['3', '#'],
        33:['4', '$'],
        34:['5', '%'],
        35:['6', '^'],
        36:['7' ,'&'],
        37:['8', '*'],
        38:['9', '('],
        39:['0', ')'],
        40:['\n', '\n'],
        41:['\x1b', '\x1b'],
        42:['\b', '\b'],
        43:['\t', '\t'],
        44:[' ', ' '],
        45:['_', '_'],
        46:['=', '+'],
        47:['[', '{'],
        48:[']', '}'],
        49:['\\', '|'],
        50:['#', '~'],
        51:[';', ':'],
        52:["'", '"'],
        53:['`', '~'],
        54:[',', '<'],
        55:['.', '>'],
        56:['/', '?'],
        100:['\\', '|'],
        103:['=', '='],
        }
	# A 2 in first byte seems to indicate to shift the key. For example
	    # a code for ';' but with 2 in first byte really means ':'.
	if lst[0] == 2:
		shift = 1
	else:
		shift = 0

	# The character to convert is in the third byte
	ch = lst[2]
	if ch not in conv_table:
		print "Warning: data not in conversion table"
		return ''
	return conv_table[ch][shift]

def getQRDevice():
	global devStatus
	global ep
	global interfaceNo
	global eaddr
	global dev
	dev = usb.core.find(idVendor=0x2dd6, idProduct=0x26c1)
	if (dev):
		ep = dev[0].interfaces()[0].endpoints()[0]
		interfaceNo = dev[0].interfaces()[0].bInterfaceNumber
		dev.reset()

		if dev.is_kernel_driver_active(interfaceNo):
			dev.detach_kernel_driver(interfaceNo)
		dev.set_configuration()
		eaddr = ep.bEndpointAddress
		print('Device connected')
		devStatus = True;
	else:
		print('Device not connected')
		return False;
def getQR():
	if (devStatus == True):
		
		data = None
		line = ''	
		while data is None:
			try:

				readData = dev.read(eaddr,1024)
				#print(readData)
				ch = hid2ascii(readData)
				line += ch

				if len(line)>0 and ch =='\n':
					print(line)
					return line;
					break
			except usb.core.USBError as e:
				data = None
				if e.args == ('Operation timed out'):
					continue

def detect():
    obj = ctypes.CDLL('/home/pramod/testpython/for_so/dualcard_main.so')
    o = obj.DualiUSBOpen()
    while(o):
        s=" "
    	s=s.rjust(128," ")
    	c = obj.DualiUSBFind(0,s)
    	print("c : " + str(c))
    	if c>=0:
            s=""
            s=s.rjust(128," ")
            card = obj.DualiUSBFind(0,s)
            print("card obj"+str(card))
            print("scard="+s)
            if card>=0:
                #submit_to_tkinter(label2,"Remove Card/QR")
                detected = "card"
                card = None
                break
        else:
            s=""
	    s = getQR()
            print("sqr="+s)
            if len(s)>0:
                #submit_to_tkinter(label2,"Remove Card/QR")
                detected = "qr"
                break
    return s,detected

if __name__=='__main__':
#check Card reader
	devNFC = usb.core.find(idVendor=0x1db2, idProduct=0x0650)
	getQRDevice()
	if (devNFC is not None and devStatus==True):
		while(1):
			dump3 = detect()
			s = dump3[0]
			detected = dump3[1]
			print("s")
			print(s)
			print("detected : "+detected)
			sleep(1)
	else:
		raise ValueError('Device not found')
Thanks
Pramod