MCP2515 OBD II 多PID

MCP2515 OBD II multiple PID

我正在使用 raspberry Pi 和 arduino CAN schield,它使用 MCP2515 和 SPI 来请求单个 OBD II PID。

我可以从我的 OBD 模拟器 (Freematics) 请求并接收一个 PID。我知道可以在单个查询中请求多个 PID(最多 6 个 PID)。

每当我使用其他类型的消息时,我只收到第一个请求。有人可以帮忙吗?

这是正在工作的单个 PID 的消息 (C++):

msg.id = 0x7DF; //ID_QUERY
msg.header.rtr = 0;
msg.header.length = 0x08;
msg.data[0] = 0x02;
msg.data[1] = 0x01;
msg.data[2] = PID; //Whatever PID I want!

多个请求无效的消息:

msg.id = 0x7DF; //ID_QUERY
msg.header.rtr = 0;
msg.header.length = 0x08;
msg.data[0] = 0x07; //! Also it is not working with 0x08
msg.data[1] = 0x01;
msg.data[2] = PID0;
msg.data[3] = PID1;
msg.data[4] = PID2;
msg.data[5] = PID3;
msg.data[6] = PID4;
msg.data[7] = PID5;

我们的 Freematics OBD II 模拟器不支持发送多个响应。我们的测试车之一,一辆 2010 款丰田花冠。根据我们的经验,最好在启动时发送一个测试命令,看看我们正在与之通信的设备是否支持多重响应。对于我们的应用程序,我们发送命令 00 两次,

010000

如果响应大于 25 个字符,我们知道设备支持多个命令,因为它响应了两个 00 命令。如果响应少于 25 个字符,我们知道设备只响应第一个 00 命令,因此一次只支持一个命令。检查收到的回复数量可以通过多种方式完成,但到目前为止,长度对我们来说效果很好。

根据您的用例,仅发送单个命令可能就足够了。但是,如果您确实需要提高多个命令的速度,请在启动时添加一个检查以查看设备是否响应多个命令,然后根据结果构建您的消息。不要忘记以预期数量的响应行结束您的消息,以进一步提高速度。见附件摘自:http://elmelectronics.com/DSheets/ELM327DS.pdf

通过 mcp2515 发送 canbus 消息有点棘手。

首先Freematics OBD模拟器不支持多PID请求。其次,多个 PID 请求应以 ISO 15765 格式发送。当您发送多个请求时,他的 ECU 只会用一条 "First Frame" 消息进行响应,并将等待来自发送方的 "Flow Control" 消息。 ECU收到流控后,会根据你的流控设置继续发送响应。

有关 CAN 总线消息以及 "First Frame" 和 "Single Frame" 工作原理的更多信息,请阅读以下链接: googleBooks, ISO_15765-2, hackaday (dot) com