10

我正在开发连接 OBD2 适配器并获取实时数据(如速度、转速、油门位置等)的应用程序。当我一次读取一个命令时,它可以正常工作,就像发送命令“010C\r”一样,我得到了当前转速。

我认为在一个请求中发送多个命令是不可能的。但是在 EngineLink HD、Dashcommand 等其他应用程序中,我们发现多个组件会同时更新,例如,如果我们正在驾驶汽车并检查 RPM、Sped 和 Throttle,那么它们每 1 秒更新一次。它看起来像实时数据。

我很惊讶这怎么可能?

我们添加了代码,例如如果用户想要显示 3 个组件,那么对于每个组件,都会生成一个线程并处理该命令的请求和响应。因此,在这种情况下,生成了 3 个线程并且我们得到了响应,但这需要太多时间,例如如果我们正在观看 3 个 PID 中的速度,那么速度会在 3-4 秒延迟后更新。

我们还需要锁定它发送请求和获取响应的代码 bcoz OBD2 适配器一次处理一个请求和响应。

如果我们不锁定代码,那么我们会得到无法预料的结果,这可能是由于应用程序和 obd2 适配器之间的套接字通信使用的公共共享流造成的。

但现在我想一次读取多个命令。我的意思是在某个时间点,我想知道速度、RPM 和油门位置等。所以我想在一个请求中发送上述命令并一次得到响应。

这怎么可能 ?有人可以指导我。

4

2 回答 2

5

首先,我认为您不需要 3 个线程。正如您所说,OBD-II 一次只能处理 1 个命令,因此您可以使用 1 个线程来处理,它知道每秒必须发出哪些请求。

简单地说,您不能一次读取多个命令。正如您所说,您会遇到一些延迟。OBD-II 默认设置对此负责。默认等待时间(据我所知)200 毫秒。所以你每秒只能发送 5 个命令。这有点慢,一些应用程序每秒设法获得 20 个请求。

您可以通过在命令末尾发送一个额外的数字(数字 x)来做到这一点。OBD-II 设备将等待来自车内设备的 x 个响应。所以当你发送'010D1'时,它会等到1个答案进来,它会直接发回给你。然后很容易在 50 毫秒甚至更短的时间内处理一个命令。

这就是该应用程序看起来“同时”请求数据的方式。他们还可以使用一些技巧等到收集到所有数据,然后再显示。

我希望我回答了你所有的问题,否则再问一些。

编辑:

同样对于成功的命令,也需要这个标准时间。这是因为某些命令可以有 2 个报告相同数据的源。例如,速度计和 gps 模块都可以测量速度。如果两者都连接到 OBD-II 总线,那么您将得到 2 个答案。

使用“010D”,它将等待 200 毫秒,然后报告所有答案。使用'010D1',当它有1个答案时,它将直接发回第一个答案。

于 2014-01-25T21:47:37.023 回答
5

ELM327 数据表在第 45 页提供了以下信息:

多个 PID 请求 SAE J1979 (ISO 15031-5) 标准允许通过一条消息请求多个 PID,但前提是您使用 CAN (ISO 15765-4) 连接到车辆。一次最多可以请求六个参数,并且回复是包含所有响应的一条消息。例如,假设您需要定期了解发动机负载 (04)、发动机冷却液温度 (05)、歧管压力 (0B) 和发动机转速 (0C)。您可以为它们发送四个单独的请求(01 04,然后是 01 05,然后是 01 0B 等),或者您可以将它们全部放入一条消息中,如下所示:

01 04 05 0B 0C

对此,典型的答复可能是:

00A
0: 41 04 3F 05 44 0B
1: 21 0C 17 B8 00 00 00
于 2015-02-10T16:31:54.850 回答