Чтение с can шины больше 8 байт

Подскажите, хочу вытащить температуру АКПП через 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))

1 лайк

и без немедленной печати в сериал содержимого каждого пакета
ИМХО, с этой печатью шансов прочитать два последовательных пакета вообще нуль

1 лайк

В MCP2515 буфер на два сообщения, так что хотя бы периодически мы должны видеть какие-то обрывки.

Однако, конечно, вопрос в другом - стоит ли доверять эльму, если он так себя ведет, и искать мифический второй пакет.

Я делал последовательно считывание следующих 8 байт, но пришли те же 8 байт. Но возможно я как то не так опрашиваю. Вторую часть.

вы их вторично запрашивали, что ли? - будет то же самое.

Вам надо запросить один раз, а прочитать все, что придет.