2

我目前正在开发一个连接到 OBD 设备(使用 ELM 327 Mini)并读取其数据的 Android 应用程序。

我对 OBDII 协议比较陌生,一个月前我才开始使用它,但是使用官方文档,在互联网上四处查看并使用 pires api,这为开发我需要的东西(其中你可以在这里这里找到)我已经成功地完成了应用程序并在几辆汽车上进行了测试。在我在梅赛德斯-奔驰 C 级 w204 上测试该应用程序之前,结果大部分都很好。

在这辆车上,我的应用程序从 OBD 读取的数据是我无法理解的。我试图寻找类似的例子,但我没有成功,我发现自己完全陷入困境,无法找到解决这个问题的方法。

我将给你写几个这个数据的例子,但首先我想告诉你我是如何在每次我的应用程序连接到 OBD 时初始化它的,因为我的直觉告诉我我没有使用正确的命令或者有一些我失踪了。但正如我所说,我的应用程序与其他汽车完美配合。

AT 命令:

AT Z
AT L0
AT SP 6 or AT SP 0

首先,在初始化完成后,我发送 PID 00 (01 00) 以了解汽车支持从 01 到 20 的 PID。这是我的第一个问题

有时我收到

[Req] 01 00
[Ans] 01 00 41 00 98 18 00 01
[Ans] 1: 06 41 00 BF FF E8 93

而有时

[Req] 01 00
[Ans] 01 00 41 00 95 00 20 13

注意:我手动添加了 [Req] 和 [Ans],其唯一目的是使其更易于理解。

真正困扰我的是答案不同的事实。有时它会回答 41 00 95 00 20 13 和其他 41 00 98 18 00 01,这怎么可能?对于同一辆车,PID 的答案应该总是相同的,我认为汽车不能动态地改变 PID 支持的情况。

另一个原因是为什么有时 PID 00 会用 1 或 2 行来回答。在第一个示例中,您可以看到第一行是对 pid 00 的正常答案,但是它有第二个答案,即 1: 06 41 00 BF FF E8 93,我真的不知道这是什么意思。

我有另一个 pid 01 的例子

[Req] 01 01
[Ans] 01 01 41 01 00 07 E9 00
[Ans] 1: 06 41 01 00 04 00 00

[Req] 01 01
[Ans] 01 01 41 01 00 04 00 00

是因为它同时在不同的协议中回答吗?06是这个意思吗?

此外,询问车辆的速度有时会返回 NO DATA,然后在接下来的 2 秒内返回正确的值,例如 41 0D 00(例如),然后在接下来的 2 秒内再次返回 NO DATA。这意味着,当 NO DATA 错误发生时,它是完全随机的。问题是汽车实际上支持 PID,因为它有时可以返回正确的数据。

我很确定这与 OBD 的初始化有关,也许我需要设置更高的超时时间或包含更多命令,但由于我不是 OBD 协议的专家,我真的不知道我应该如何处理. 我非常感谢任何形式的帮助,只需指出我在官方文档中遗漏的一些内容或我可能犯的任何愚蠢错误。大多数情况下,我想了解正在发生的事情,以便我可以一致地处理数据。

非常感谢!

4

1 回答 1

4

所以最后我发现了发生这种情况的原因,因为这辆车有两个 ECU 来回答我的请求。

我通过请求一些标头为 ON(AT H1)的 PI​​D 找到了它。使用此命令,我可以看到答案数据来自罐 ID 7E8(引擎)和 7E9(传输)。这是一个例子

[Req] 01 01
[Ans] 7E8 06 41 01 00 07 E9 00 
[Ans] 7E9 06 41 01 00 04 00 00

要解决此问题,您可以执行命令 AT SH 7E0。这个命令的作用是告诉 OBD 只听 7E8。

资料来源: 这个页面我也问过这个问题

于 2014-12-19T13:33:11.233 回答