title: Using pyUSB to read data from ELM327 OBDII to USB device
body: <p>I am having problems using the pyUSB library to read data from an ELM327 OBDII to USB device. I know that I need to write a command to the device on the write endpoint and read the received data back on the read endpoint. It doesn't seem to want to work for me though. </p>
  
  <p>I wrote my own class obdusb for this:</p>
  
  <pre><code>import usb.core
  
  class obdusb:
  
        def __init__(self,_vend,_prod):
  
      '''Handle to USB device'''
      self.idVendor = _vend
      self.idProduct = _prod
      self._dev = usb.core.find(idVendor=_vend, idProduct=_prod) 
  
      return None
  
  
  def GetDevice(self):
      '''Must be called after constructor'''
      return self._dev
  
  
  def SetupEndpoint(self):
      '''Must be called after constructor'''
      try: 
          self._dev.set_configuration()
  
      except usb.core.USBError as e:
          sys.exit("Could not set configuration")
  
      self._endpointWrite = self._dev[0][(0,0)][1]
      self._endpointRead = self._dev[0][(0,0)][0]
  
      #Resetting device and setting vehicle protocol (Auto)
      #20ms is required as a delay between each written command
  
      #ATZ resets device
      self._dev.write(self._endpointWrite.bEndpointAddress,'ATZ',0)
      sleep(0.002)
      #ATSP 0 should set vehicle protocol automatically
      self._dev.write(self._endpointWrite.bEndpointAddress,'ATSP 0',0) 
      sleep(0.02)
  
      return self._endpointRead
  
  
  def GetData(self,strCommand):
  
      data = []
      self._dev.write(self._endpintWrite.bEndpointAddress,strCommand,0)
      sleep(0.002)
      data = self._dev.read(self._endpointRead.bEndpointAddress, self._endpointRead.wMaxPacketSize)
  
      return data
  </code></pre>
  
  <p>So I then use this class and call the GetData method using this code:</p>
  
  <pre><code>import obdusb
  
  #Setting up library,device and endpoint
  lib = obdusb.obdusb(0x0403,0x6001)
  myDev = lib.GetDevice()
  endp = lib.SetupEndpoint()
  
  #Testing GetData function with random OBD command
  #0902 is VIN number of vehicle being requested
  dataArr = lib.GetData('0902')
  PrintResults(dataArr)
  
  raw_input("Press any key")
  
  def PrintResults(arr):
  
      size = len(arr)
  
      print "Data currently in buffer:"
  
      for i in range(0,size):
          print "[" + str(i) + "]: " + str(make[i])
  </code></pre>
  
  <p>This only ever prints the numbers 1 and 60 from [0] and [1] element in the array. No other data has been return from the command. This is the case whether the device is connected to a car or not. I don't know what these 2 pieces of information are. I am expecting it to return a string of hexadecimal numbers. Does anyone know what I am doing wrong here?</p>