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

2024-09-29 18:47:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用pyUSB库从elm327obdii向USB设备读取数据时遇到问题。我知道我需要在写端点上向设备写入一个命令,然后在读取端点上读回接收到的数据。但它似乎不想为我工作。在

我为此写了我自己的班底宣言:

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方法:

^{pr2}$

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


Tags: coredevselfreturndevicedefsleepprod
1条回答
网友
1楼 · 发布于 2024-09-29 18:47:24

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

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

还有一个提示:用010D或010C什么的测试。09xx可能很难预料。在

更新: 两种方法都可以。只要你用回车键“分离”每个命令。在

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

那个命令单对我很有用。在

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

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

'010D1/r'

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

对不起我的英语,我希望能给你正确的方向。在

相关问题 更多 >

    热门问题