2016-11-27 3 views
0

私はOBD2を接続し、atmel canコントローラを使用してcanデータ(11bit 500kpbs CAN)を取得しています。 私はデータを取得します。生のOBD2識別子11または29ビットから「モード&PID」を取得するにはどうすればよいですか?

ここで、このデータからモードとPIDを取得するにはどうすればよいですか? は例えば、私のデータは次のようになります。

15164A8A-FF088B52 -- Data: 00,00,00,86,9C,FE,9C,FE, 

私はデータフィールドに... /オフなどにRPMの変化、点火を見ることができました。 私はELMチップを使いたくありません。生データを直接処理する必要があります。

答えて

2

ヒント:私の数字はすべて16進数です。

OBD2プロトコルは、応答をバイト(8ビット)で送信します。応答はヘッダー(または呼び出されたID)とデータに細分されます。

IDはECUのアドレスであり、データはECUからの「応答データ」であり、常に8バイト(CANバスプロトコルでは?)です。

8バイトのデータは、PCI(1バイトまたは2バイト)と値に分割されます。 PCIは、あなたのフレームタイプ(単一、最初、連続またはフロー制御フレーム)と何バイトが入ってくるかを表示します。

あなたはこのようなメインECUにOBD要求を送信することがあります:

7DF 02 01 0C 00 00 00 00 00

7DFの診断テスターデバイス用ECUのアドレスである、それが簡単に私は、単一のフレームのための例を作るようにする

02は、データ・バイト

01を送信数はモードです(あなたが面白いかもしれません!)01は、現在のデータであり、02はフリーズフレームで、など

0Cは、回転数のPIDです。

ECUからの応答が(単一フレーム)のようなものであろう:

7E8 04 41 0C 12 13 00 00 00

7E8が応答することをECUです。

04着信データバイト数。

41データは01 PID

0CこのPIDに対応

12 13に応答している0Cに応答して2バイトです。これら2バイトをOBD II ISOプロトコルでデコードする必要があることに注意してください。あなたはウィキペディアでいくつかのコンバージョン率を見つけることもできます。

他のバイトは無駄です。

簡潔にするには、ECUからの各応答を解析し、有用なバイトを可読な10進値に変換する必要があります。使用しているプログラミング言語によって異なります。私の意見では、C/C++のベストプラクティスはunsigned charで、コンパイラによって8ビットであることが保証されており、JAVAではByteになる可能性があります。さらに、ビット単位の演算子を使用して、あなたの人生を少し楽にしてください。

さらにお気軽にお問い合わせください。

+0

ありがとうございました。私はこれをテストした後にあなたに戻ってきます。 – Eugene

関連する問題