【发布时间】:2016-11-27 08:04:15
【问题描述】:
我已连接 OBD2 并使用 atmel can 控制器获取 can 数据(11 位 500kpbs CAN)。 我得到数据。
现在,我如何从这些数据中获取模式和 PID? 例如,我的数据如下所示:
15164A8A-FF088B52 -- Data: 00,00,00,86,9C,FE,9C,FE,
我可以在数据字段中看到 RPM 变化、点火开关等。 我不想使用 ELM 芯片。我需要直接处理原始数据。
【问题讨论】:
我已连接 OBD2 并使用 atmel can 控制器获取 can 数据(11 位 500kpbs CAN)。 我得到数据。
现在,我如何从这些数据中获取模式和 PID? 例如,我的数据如下所示:
15164A8A-FF088B52 -- Data: 00,00,00,86,9C,FE,9C,FE,
我可以在数据字段中看到 RPM 变化、点火开关等。 我不想使用 ELM 芯片。我需要直接处理原始数据。
【问题讨论】:
提示:我所有的数字都是十六进制的。
OBD2 协议以字节(8 位)向您发送响应。响应被细分为标头(或称为 ID)和数据。
ID 是 ECU 的地址,数据是来自 ECU 的“响应数据”,它总是 8 个字节(在 CAN 总线协议中?!)。
8 Bytes 的数据将分为 PCI(可以是 1 或 2 字节)和值。 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 协议解码这两个字节。您还可以在 Wikipedia 上找到一些转化率。
其他字节无用。
简而言之:您必须解析来自 ECU 的每个响应,并尝试将有用的字节转换为可读的十进制值。这取决于您使用的编程语言。在 C/C++ 中,我认为最佳实践是 unsigned char,编译器保证它是 8 位,而在 JAVA 中它可以是 Byte。此外,尝试使用位运算符让您的生活更轻松。
如果有更多问题,请不要犹豫。
【讨论】: