android - 了解 OBDII 协议(protocol)的数据

标签 android obd-ii

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

我对 OBDII 协议(protocol)相对较新,我一个月前才开始使用它,但是使用官方文档,在互联网上查找并使用 pires api,这为我的开发奠定了良好的基础需要(您可以找到 herehere )我已经成功完成了该应用程序并在几辆车上进行了测试。在我在梅赛德斯-奔驰 C 级 w204 上测试该应用程序之前,大部分结果都非常好。

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

我将给您写一些此数据的示例,但首先我想告诉您每次应用程序连接到 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

是因为它同时用不同的协议(protocol)应答吗?这就是 06 的意思吗?

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

我很确定这与OBD初始化有关,也许我需要设置更高的超时时间或包含更多命令,但由于我不是OBD协议(protocol)方面的专家,所以我真的不知道如何我应该继续吗?我真的很感激任何形式的帮助,只要指出我在官方文档中遗漏的东西或我可能犯的任何愚蠢的错误。主要是我想了解正在发生的事情,以便我可以相应地处理数据。

非常感谢!

最佳答案

最后我发现发生这种情况的原因是因为汽车有两个 ECU 响应我的请求。

我通过请求一些 header 为 ON (AT H1) 的 PID 发现了这一点。通过此命令,我可以看到答案数据来自 CAN 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。

来源:This page where I asked this question too

关于android - 了解 OBDII 协议(protocol)的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504587/

相关文章:

android - 是否可以在 xml 布局中使用具有不同旋转的可绘制对象?

android - 替换 fragment 后状态栏覆盖工具栏

android - 带有实心圆的自定义圆形进度条

java - java新手——了解java编译

android - 如何通过 Android 蓝牙连接到 OBDII

android - 在 ViewFlipper 或 ViewPager 中滑动图像

java - 如何使用 pires OBD-II Java API 中的 ObdRawCommand 发送自定义命令

obd-ii - 我可以使用 obd-elm327 或 vgate i-car2 获取转向灯状态吗?

c# - 如何使用 Windows Phone 8 从 OBD-II 适配器读取/写入数据?

Python:如何将对象转换为整数