Я попытался сделать ecuRequest, который отправляет PID в банку сети, а затем получает сообщение. Я получил эту идею из демонстрационного эскиза в этой статье http://skpang.co.uk/blog/archives/55. Я пытался имитировать ecu_req, используя библиотеку seeedstudio, найденную здесь. https://github.com/Seeed-Studio/CAN_BUS_Shield. Ниже то, что я имею до сих пор. Буфер заполняется, когда я подключаю его к машине, но, похоже, это не те данные.
char MCP_CAN::pidRequest(unsigned char pid, INT8U buf,float& engineData)
{
INT8U len = 8;
float engine_data;
uint8_t data[8];
data[0] = 0x02;
data[1] = 0x01;
data[2] = 0x0c;
data[3] = 0x00;
data[4] = 0x00;
data[5] = 0x00;
data[6] = 0x00;
data[7] = 0x00;
//uint8_t *ptr = data;
mcp2515_modifyRegister(MCP_CANCTRL, (1<<7)|(1<<6)|(1<<5), 0); //change mode_mask if doesnt work
if(sendMsgBuf(0x7DF, 1, 0, 8, data)==CAN_OK) {
delay(100);if(checkReceive()==CAN_MSGAVAIL) {
if (readMsgBuf(&len, buf)==CAN_OK) {
//engine_data = ((buf[3]*256)+buf[4])/4;
Serial.println(buf[0]);
Serial.println(buf[1]);
Serial.println(buf[2]);
Serial.println(buf[3]);
Serial.println(buf[4]);
Serial.println(buf[5]);
Serial.println(buf[6]);
Serial.println(buf[7]);
return 0;
}
else{
return 1;
}
}
else{
return 2;
}
}
else{
return 3;
}
Вы проверяете только одно сообщение, но на шине много разных сообщений, независимо от того, что вы отправляете.
Вы должны либо прочитать каждое сообщение, пока не получите ожидаемое сообщение с CAN ID (вероятно, CAN ID 0x7e8), либо установить соответствующий фильтр / маску в микросхеме MCP, чтобы оно отправляло вам только соответствующие сообщения.