【问题标题】:How can I get "mode & PIDs" from raw OBD2 identifier 11 or 29 bit?如何从原始 OBD2 标识符 11 或 29 位获取“模式和 PID”?
【发布时间】: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 芯片。我需要直接处理原始数据。

【问题讨论】:

    标签: can-bus obd-ii


    【解决方案1】:

    提示:我所有的数字都是十六进制的。

    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。此外,尝试使用位运算符让您的生活更轻松。

    如果有更多问题,请不要犹豫。

    【讨论】:

    • 谢谢。我会在测试后回复你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多