我目前正在开发一个连接到 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 协议的专家,我真的不知道我应该如何处理. 我非常感谢任何形式的帮助,只需指出我在官方文档中遗漏的一些内容或我可能犯的任何愚蠢错误。大多数情况下,我想了解正在发生的事情,以便我可以一致地处理数据。
非常感谢!