我怎样才能获得"模式&的PID"从原始OBD2标识符11或29位?

时间:2016-11-27 08:04:15

标签: can-bus obd-ii

我已连接OBD2并使用atmel can控制器获取can数据(11bit 500kpbs CAN)。 我得到了数据。

现在,如何从这些数据中获取模式和PID? 例如,我的数据如下所示:

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

我可以在数据字段上看到RPM更改,点火开/关等.... 我不想使用ELM芯片。我需要直接处理原始数据。

1 个答案:

答案 0 :(得分:2)

提示:我的所有号码都是HEX。

OBD2协议以字节(8位)发送响应。响应细分为标题(或称为ID)和数据。

ID是ECU的地址,数据是"响应数据"来自ECU,它总是8个字节(CAN总线协议?!)。

8个字节的数据将被分为PCI(可以是一个或两个字节)和值。 PCI将显示您的帧类型(单个,第一个,连续或流控制帧)以及传入的字节数。

为了让我更容易,我只为单帧做一个例子:

您可以向主ECU发送OBD请求,如下所示:

7DF 02 01 0C 00 00 00 00 00

7DF是诊断测试仪设备的ECU地址。

02是发送数据字节的数量

01是模式(你可能会感兴趣!)01是当前数据,02是冻结帧等。

0C是rpm PID。

ECU的响应类似于(单帧):

7E8 04 41 0C 12 13 00 00 00

7E8是响应的ECU。

04个传入数据字节数。

41数据响应01 PID

0C对此PID的响应

12 13是响应0C的两个字节。请记住,您必须使用OBD II ISO协议解码这两个字节。你也可以在维基百科上找到一些转换率。

其他字节无用。

要简化:你必须解析ECU的每个响应,并尝试将有用的字节转换为可读的十进制值。这取决于您使用的编程语言。在C / C ++中,我认为最佳实践是unsigned char,编译器保证为8位,而在JAVA中,它可以是Byte。此外,尝试使用按位运算符使您的生活更轻松。

通过更多问题,请不要犹豫。