【问题标题】:Using pyUSB to read data from ELM327 OBDII to USB device使用 pyUSB 从 ELM327 OBDII 读取数据到 USB 设备
【发布时间】:2013-05-08 15:30:23
【问题描述】:

我在使用 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。该命令没有返回其他数据。无论设备是否连接到汽车,情况都是如此。我不知道这两条信息是什么。我期望它返回一串十六进制数字。有谁知道我在这里做错了什么?

【问题讨论】:

    标签: python usb libusb pyusb obd-ii


    【解决方案1】:

    如果您不使用 ATST 或 ATAT,则必须在每次写入/读取组合之间等待 200 毫秒的超时时间。

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

    还有一个提示:用 010D 或 010C 或其他东西进行测试。 09xx 可能很难期待。

    更新: 你可以通过两种方式做到这一点。只要您用回车“分隔”每个命令。

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

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

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

    你还可以做什么,这是一个谜,因为只有扫描工具倾向于实现这一点:

    '010D1/r'

    命令后的 1 指定 ELM 在收到来自总线的 1 个回复时应报告回来。因此,它非常有效地减少了延迟,但代价是无法从地址“010D”获取更多值。 (这就是速度!)

    对不起我的英语,我希望把你送到正确的方向。

    【讨论】:

    • 感谢您的评论。我不知道它期待回车。这些东西真的很难研究,因为周围没有太多信息。我可以使用命令发送回车还是必须单独发送? ATAT 命令实际上是做什么的?如果我使用它可以省略时间延迟吗?您能否指出与此相关的一些资源的方向?这是很多问题:P 再次感谢 :)
    • 你能帮我解决这个关于获得 VIN 号码回复的问题吗? stackoverflow.com/questions/19158165/…
    猜你喜欢
    • 2020-03-25
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多