首页 文章

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

提问于
浏览
9

我正在研究连接OBD2适配器并获取速度,转速,油门位置等实时数据的应用程序 . 当我一次读取一个命令时,它就像发送命令“010C \ r \ n”一样正常,我得到了目前的RPM .

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

我很惊讶它怎么可能?

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

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

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

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

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

2 回答

  • 5

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

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

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

    这就是该应用程序看起来如何“同时”请求数据 . 他们也可以使用一些技巧来等待收集所有数据,然后显示它 .

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

    编辑:

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

    使用'010D',它将等待200ms,然后报告所有答案 . 使用'010D1',它会在有1个答案时直接发回第一个答案 .

  • 5

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

    Multiple PID Requests 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

相关问题