Подскажите, хочу вытащить температуру АКПП через CAN шину, но ответ не умещается в 8 байт и судя по тому как приходит ответ через ELM происходит досыл следующим сообщением. Но я никак не могу прочитать это второе сообщение. Каким образом считать по CAN шине сообщение больше 8 байт? Использую MCP2515.
Так ни схемы, ни кода, ни ошибок, ни имени контроллера мы не видим, как вам помочь? Можно готовые девайсы купить и всё смотреть на вашем телефоне. Стоят копейки.
void sendPID(unsigned char __pid)
{
unsigned char tmp[8] = {0x02, 0x21, __pid};
byte sndStat = CAN0.sendMsgBuf(CAN_ID_PID, 0, 8, tmp);
if (sndStat == CAN_OK)
{
Serial.print("PID sent: 0x");
Serial.println(__pid, HEX);
}
else
{
Serial.println("Error Sending Message...");
}
}
void receivePID(unsigned char __pid)
{
int vResultI = 0;
double vResultD = 0;
if (!digitalRead(CAN0_INT))
{
CAN0.readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s)
// if (rxId == 0x7E8)
//{
sprintf(msgString, "Received -> Standard ID: 0x%.3lX, DLC: %1d, Data: ", rxId, len);
Serial.print(msgString);
for (byte i = 0; i < len; i++)
{
sprintf(msgString, " 0x%.2X", rxBuf[i]);
Serial.print(msgString);
}
Приходит такой ответ:
А вот так приходит если через ELM:
У меня реализован вывод параметров через ELM по блютуз в экранчик на приборке, но по ELM большие задержки и не стабильные данные приходят, хочу напрямик с CAN шины брать.
вы прям думаете, что вы на коленке напишете лучше чем специализированный интерфейс ELM? Какая скорость КАН в машине? Ардуино Нано выше 125К уже может физически не успевать.
500kbit/sec вполне себе тянет 328-й мк.
Есть у меня подозрение, что dlc там не 8.
Все тянет без проблем. Другие параметры которые укладываются в 8 байт я принимаю корректно.
Если всё же хотите увидеть байты то советую взять такой модель, и не мучаться с MCP2515.
по CAN шине только 8 байт можно принять за раз, это стандарт…
Вас обманули. На то она и шина, чтобы принимать и передавать любое колличество байт. Купите выше указанную железку, которая вас приятно удивит.
Если dlc=8, то почему ELM то три бита рисует, то четыре?
И я бы еще попытался для начала без прерывания читать.
стандарт CAN 2.0:
Поле передаваемых данных (Data Field) — от 0 до 8 байт, размер определен в поле DLC.
Это как?
Стандарт не запрещает паковать данные в несколько последовательных пакетов, как у вас и происходит.
Что касается “успевает/не успевает” - одинарные пакеты Нано успевает принять, а серию - уже нет.
Так читайте следуюшие 8 байт, что мешает то? Если не можете, то купите другую железку.
Без вот этого. if (!digitalRead(CAN0_INT))
и без немедленной печати в сериал содержимого каждого пакета
ИМХО, с этой печатью шансов прочитать два последовательных пакета вообще нуль
В MCP2515 буфер на два сообщения, так что хотя бы периодически мы должны видеть какие-то обрывки.
Однако, конечно, вопрос в другом - стоит ли доверять эльму, если он так себя ведет, и искать мифический второй пакет.
Я делал последовательно считывание следующих 8 байт, но пришли те же 8 байт. Но возможно я как то не так опрашиваю. Вторую часть.
вы их вторично запрашивали, что ли? - будет то же самое.
Вам надо запросить один раз, а прочитать все, что придет.