我使用的是覆盆子Pi和arduino CAN schield,它使用MCP2515和SPI来请求单个OBD II PID。
我能够从我的OBD仿真器(Freematics)请求并接收单个PID。我知道可以在一次查询中请求多个PID(最多6个PID)。
每当我使用其他类型的消息时,我只收到第一个请求。任何人都可以帮忙吗?
以下是单个PID的消息public static boolean comparePOJO(Object obj1, Object obj2) {
return new Gson().toJson(obj1).equals(new Gson().toJson(obj2));
}
comparePOJO(car1,car2); //It will return true
:
(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!
答案 0 :(得分:1)
我们的Freematics OBD II仿真器不支持发送多个响应。我们的测试车之一,2010丰田卡罗拉。根据我们的经验,最好在启动时发送测试命令,以查看我们正在与之通信的设备是否支持多个响应。对于我们的应用程序,我们发送命令00两次,
010000
如果响应超过25个字符,我们知道设备支持多个命令,因为它响应了两个00命令。如果响应少于25个字符,我们知道设备仅响应第一个00命令,因此一次只支持一个命令。检查收到的回复数量可以通过多种方式完成,但到目前为止,长度对我们来说效果很好。
根据您的使用情况,仅发送单个命令就足够了。但是,如果您确实需要提高多个命令的速度,请在启动时添加一个检查,以查看设备是否响应多个命令,然后根据结果构建消息。不要忘记使用预期的响应行数来结束消息,以进一步提高速度。参见附件:http://elmelectronics.com/DSheets/ELM327DS.pdf
答案 1 :(得分:0)
通过mcp2515发送canbus消息非常棘手。
首先,Freematics OBD Emulator不支持多个PID请求。其次,多个PID请求应以ISO 15765格式发送。当你发送一个多重请求时,ECU只能响应一个"第一帧"消息并将等待"流量控制"来自发件人的邮件。收到流量控制后,ECU将继续根据您的流量控制设置发送响应。
有关CAN-Bus消息的更多信息以及" First Frame"和#34;单帧"有效,请阅读以下链接: googleBooks,ISO_15765-2,hackaday (dot) com