一起发送多个OBD命令并同时获得响应

我正在研究连接OBD2适配器并获取速度,转速,节气门位置等实时数据的应用程序。当我一次读取一个命令时,它通过发送命令“010C \ r”正常工作,我得到当前RPM。

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

我很惊讶,这怎么可能?

我们添加了一些代码,如用户想要显示3个组件,然后为每个组件生成一个线程,并处理该命令的请求和响应。 所以在这种情况下,生成3个线程,我们得到响应,但是如果我们在3个PID中观察速度,则花费太多时间,然后在3-4秒延迟之后更新速度。

我们还需要locking发送请求的代码,并获得响应bcoz OBD2适配器一次处理一个请求和响应。

如果我们不locking代码,那么我们得到不可预知的结果,这可能是由于应用程序和obd2适配器之间的套接字通信所使用的公用共享stream所致。

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

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

首先,我不认为你需要3线程。 正如你所说,OBD-II一次只能处理1个命令,所以你可以用1个线程来完成,这个线程知道每秒钟必须做出哪些请求。

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

您可以通过在命令结尾处发送一个额外的号码(号码x)来完成此操作。 OBD-II设备将等待车内设备的x响应。 所以当你发送'010D1'时,会等到1个回答进来,然后直接发回给你。 那么在50ms或者甚至更短的时间内处理命令是很简单的。

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

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

编辑:

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

'010D'会等待200ms,然后报告所有的答案。 使用'010D1'时,直接回答第一个答案。

ELM327数据表在第45页上给出了以下信息:

多个PID请求 SAE J1979(ISO 15031-5)标准允许用一条消息来请求多个PID,但只有当您使用CAN(ISO 15765-4)连接到车辆时。 一次最多可以请求六个参数,答复是一个包含所有答复的消息。 例如,假设您需要定期了解发动机负荷(04),发动机冷却液温度(05),歧pipe压力(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