2

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 のみを出力します。コマンドから他のデータは返されていません。これは、デバイスが車に接続されているかどうかに関係なく当てはまります。これら2つの情報が何であるかはわかりません。16 進数の文字列を返すことを期待しています。ここで私が間違っていることを誰かが知っていますか?

4

1 に答える 1

2

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 は、バスからの応答が 1 つある場合に ELM が報告する必要があることを指定します。そのため、アドレス「010D」からそれ以上の値を取得できないという犠牲を払って、遅延を非常に効率的に削減します。(これがスピードです!)

私の英語で申し訳ありませんが、正しい方向に送っていただければ幸いです。

于 2013-05-08T19:20:58.690 に答える