使用pyUSB从ELM327 OBDII读取数据到USB设备



我在使用pyUSB库从ELM327 OBDII读取数据到USB设备时遇到问题。我知道我需要在写端点上向设备写入命令,并在读端点上读取接收到的数据。但它似乎对我不起作用。

我自己写了一个类obdusb:

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

然后我使用这个类并使用以下代码调用GetData方法:

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])

只打印数组中[0]和[1]元素中的数字1和60。该命令没有返回其他数据。无论设备是否与汽车相连,情况都是如此。我不知道这两个信息是什么。我希望它返回一个十六进制数的字符串。有人知道我做错了什么吗?

如果您不使用ATST或ATAT,那么在每次写/读组合之间,您必须在开始时预期200ms的超时。

您是否在每个命令后发送'r' ?看起来你没有,所以它永远在等待回车。

提示:测试010D或010C或其他东西。09xx可能很难预料。

更新:两种方法都可以。只要你用回车符"分隔"每个命令。

http://elmelectronics.com/ELM327/AT_Commands.pdfhttp://elmelectronics.com/DSheets/ELM327DS.pdf(扩展列表).

那个命令列表对我很有用。

ATAT可用于调整超时时间。当你发送010D时,ELM芯片通常会等待200毫秒,以获得所有可能的反应。有时你可以得到更多的回报,所以它等待200毫秒

你还可以做什么,这是一个谜,因为只有scantools倾向于实现这个:

010 d1/r

命令后面的1,指定当ELM从总线得到1个应答时,它应该报告。因此,它非常有效地减少了延迟,代价是无法从地址'010D'获得更多的值。(这就是速度!)

很抱歉我的英语不好,希望能给你指明正确的方向。

相关内容

  • 没有找到相关文章

最新更新