Почему не работает флаг?

На CAN0 приходит первая часть фрейма которую я изменяю и отправляю обратно в CAN0, далее от CAN0 приходит запрос на отправку второй части ответа (flow control), это работает, вторая часть ответа благополучно доходит по назначению.
Но следом на CAN0 приходит другой (отличный от первого) запрос который мне обрабатывать не надо и он нормально фильтруется и отправляется в CAN1, а вот запрос на flow control уже для этого запроса начинает обрабатываться IF (стр. 61) вместо того чтобы также лететь без изменений в CAN1.
Я использовал переменную в качестве флага, но флаг не работает. Где я ошибся?
строки 54-60 работают, 61-67 продолжают исполнять функцию несмотря на сброшенный флаг.

// Demo: Dual CAN-BUS Shields, Data Pass-through
// Written by: Cory J. Fowler
// January 31st 2014
// This examples the ability of this library to support more than one MCP2515 based CAN interface.


#include <mcp_can.h>
#include <SPI.h>

unsigned long rxId;
byte len;
byte rxBuf[8];
bool flag = false;

byte txBuf0[] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};
byte txBuf1[] = {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};
char msgString[128];                        // Array to store serial string

MCP_CAN CAN0(2);                              // CAN0 interface usins CS on digital pin 2
MCP_CAN CAN1(3);                               // CAN1 interface using CS on digital pin 3

#define CAN0_INT 8    //define interrupt pin for CAN0 recieve buffer
#define CAN1_INT 9    //define interrupt pin for CAN1 recieve buffer

void setup()
{
  Serial.begin(115200);

  pinMode(CAN0_INT, INPUT_PULLUP);
  pinMode(CAN1_INT, INPUT_PULLUP);

  // init CAN0 bus, baudrate: 500k@8MHz
  if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.print("CAN0: Init OK!\r\n");
    CAN0.setMode(MCP_NORMAL);
  } else Serial.print("CAN0: Init Fail!!!\r\n");

  // init CAN1 bus, baudrate: 500k@8MHz
  if (CAN1.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.print("CAN1: Init OK!\r\n");
    CAN1.setMode(MCP_NORMAL);
  } else Serial.print("CAN1: Init Fail!!!\r\n");

  SPI.setClockDivider(SPI_CLOCK_DIV2);         // Set SPI to run at 8MHz (16MHz / 2 = 8 MHz)

  CAN0.sendMsgBuf(0x1000000, 1, 8, txBuf0);
  CAN1.sendMsgBuf(0x1000001, 1, 8, txBuf1);
}

void loop() {
  if (!digitalRead(CAN0_INT)) {                // If interrupt pin is low, read CAN0 receive buffer
    CAN0.readMsgBuf(&rxId, &len, rxBuf);       // Read data: len = data length, buf = data byte(s)
  }
    if (rxId == 0x7DF && rxBuf[0] == 0x02){
    flag = true;
    rxId = 0x7E8;
    len = 8;
    rxBuf[1] = 0x14;
    CAN0.sendMsgBuf(rxId, 0, len, rxBuf);      // Immediately send message out CAN0 interface
  }
  if (rxId == 0x7E0 && rxBuf[0] == 0x30 && flag == true){
  rxId = 0x7E8;
  len = 8;
  rxBuf[5] = 0x15;
    CAN0.sendMsgBuf(rxId, 0, len, rxBuf);      // Immediately send message out CAN0 interface
    flag = false;
  }
    CAN1.sendMsgBuf(rxId, 0, len, rxBuf);      // Immediately send message out CAN1 interface

  if (!digitalRead(CAN1_INT)) {                       // If interrupt pin is low, read CAN1 receive buffer
    CAN1.readMsgBuf(&rxId, &len, rxBuf);       // Read data: len = data length, buf = data byte(s)
    CAN0.sendMsgBuf(rxId, 0, len, rxBuf);      // Immediately send message out CAN0 interface

  }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/
[/code]```

Откуда это известно?

Откуда это известно?

Ставьте отладочный вывод в сериал и смотрите, что там у вас происходит, иначе это просто тыканье пальцем в небо

Да, я тупанул, надо вывести в монитор.
А что вы скажете о том как я организовал реализацию флага в скетче, может что не так и не там вписал?

Ничего не скажу. Я вообще не понимаю, что этот флаг у вас делает

у меня два запроса подразумевающие ответ более чем в одном фрейме которые имеют разный заголовок но запрос на продолжение передачи (flow control) ответа у них одинаковый. ответ на первый запрос мне надо корректировать , а второй отправить без изменений.

странно, я использую цитирование но оно не отображается в сообщении

Ставьте вывод в сериал, без этого рассуждать о чем-то бессмысленно

Да, спасибо, я буду мониторить.

ОПЯТЬ???

Мы же с Вами это уже обсуждали аж100 сообщений, вы били себя в грудь и клялись, что добавите вывод в монитор…
Прошла неделя - вы приходите с тем же вопросом и опять вывода в монитор нет.
Вы нормальный вообще?

Нахрена тему-то новую открывать? Или надеялись, что все забудут ?

1 лайк

Переписал флаг, вывел в монитор и все заработало как нужно. Если кому интересно скетч могу завтра выложить.
Возникла другая проблема- при запросе live data, когда поток фреймов идет бесконечно в обе стороны, через 60-75 секунд ардуинка (mini pro) зависает, в мониторе все останавливается, связь прерывается. Повторный запуск только через reset. С короткими одиночными запросами- ответами проблем нет. Есть у кого предположения почему так, работает минуту или чуть больше (данные передаются одни и теже, но их много) и в ступор?

Некорректно написан код.

вы все еще не поняли - это должно быть интересно вам, а не нам.
Если у вас есть проблемы и нужна помощь - в первую очередь показывайте код.


#include <mcp_can.h>
#include <SPI.h>

unsigned long rxId;
byte len;
byte rxBuf[8];
bool vin = false;
byte txBuf0[] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};
byte txBuf1[] = {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};
char msgString[128];                  

MCP_CAN CAN0(2);                             
MCP_CAN CAN1(3);                      

#define CAN0_INT 8  
#define CAN1_INT 9   

void setup()
{
  Serial.begin(115200);

  pinMode(CAN0_INT, INPUT_PULLUP);
  pinMode(CAN1_INT, INPUT_PULLUP);

  // init CAN0 bus, baudrate: 500k@8MHz
  if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.print("CAN0: Init OK!\r\n");
    CAN0.setMode(MCP_NORMAL);
  } else Serial.print("CAN0: Init Fail!!!\r\n");

  // init CAN1 bus, baudrate: 500k@8MHz
  if (CAN1.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.print("CAN1: Init OK!\r\n");
    CAN1.setMode(MCP_NORMAL);
  } else Serial.print("CAN1: Init Fail!!!\r\n");

  SPI.setClockDivider(SPI_CLOCK_DIV2);     

  CAN0.sendMsgBuf(0x1000000, 1, 8, txBuf0);
  CAN1.sendMsgBuf(0x1000001, 1, 8, txBuf1);
}

void loop() {
  if (!digitalRead(CAN0_INT)) {             
    CAN0.readMsgBuf(&rxId, &len, rxBuf);    
  }
  
  if (rxId == 0x7DF && rxBuf[0] == 0x02 && rxBuf[1] == 0x09 && rxBuf[2] == 0x02)  // VIN reqest

  { // replace VIN to 1FT8X3CT5DEA11111

    vin = true;
    rxId = 0x7E8;
    len = 8;
    rxBuf[0] = 0x10;
    rxBuf[1] = 0x14;
    rxBuf[2] = 0x49;
    rxBuf[3] = 0x02;
    rxBuf[4] = 0x01;
    rxBuf[5] = 0x31;
    rxBuf[6] = 0x46;
    rxBuf[7] = 0x54;

    CAN0.sendMsgBuf(rxId, 0, len, rxBuf);                                       // send 1st frame
  }
  if (rxId == 0x7E0 && rxBuf[0] == 0x30 && vin == true) {
    
    vin = false;
    byte t = rxBuf[2];
    delay(t);
    rxId = 0x7E8;
    len = 8;
    rxBuf[0] = 0x21;
    rxBuf[1] = 0x38;
    rxBuf[2] = 0x58;
    rxBuf[3] = 0x33;
    rxBuf[4] = 0x43;
    rxBuf[5] = 0x54;
    rxBuf[6] = 0x35;
    rxBuf[7] = 0x44;


    CAN0.sendMsgBuf(rxId, 0, len, rxBuf);                                      //send 2nd frame

   
    delay(t);
    rxId = 0x7E8;
    len = 8;
    rxBuf[0] = 0x22;
    rxBuf[1] = 0x45;
    rxBuf[2] = 0x41;
    rxBuf[3] = 0x31;
    rxBuf[4] = 0x31;
    rxBuf[5] = 0x31;
    rxBuf[6] = 0x31;
    rxBuf[7] = 0x31;

    CAN0.sendMsgBuf(rxId, 0, len, rxBuf);       //send 3rd frame

  }

  CAN1.sendMsgBuf(rxId, 0, len, rxBuf);   

  if (!digitalRead(CAN1_INT)) {         
    CAN1.readMsgBuf(&rxId, &len, rxBuf);      
    CAN0.sendMsgBuf(rxId, 0, len, rxBuf);   

}
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/
[/code]```

Перезалил тот же скетч, запустил с питанием от usb, проработал 5 мин в режиме live data, повторил еще раз на 5 мин- не виснет. Переключил на адаптер 12-5в, завис через 50 сек. Напряжение на ардуино 4,81в. Воткнул обратно в usb- виснет. Чудеса. Вот в сомнениях теперь может из за питания или что то с платой? Пока буду искать , пробовать другой адаптер и сменить плату. Сталкивался кто с проблемами по питанию, 4,81 это мало?
Так же вопрос- если скетч из 10 строк работает нормально 5 минут можно ли считать что с ним все хорошо?
Процедура ради которой был затеян этот проект длится около 30мин.

Нормально.

попробую сменить плату и шилды, есть в наличии.

По очереди- заменил ардуинку, заменил первый шилд, заменил второй шилд, запитал от другого адаптера (5,05в), запитал шилды отдельно от ардуинки, удалял терминаторы шины… не помогло. Сег работало от 40 сек до 2 мин и вырубалось. Я честно не понимаю. Отследить по монитору проблему невозможно, она возникает рандомно, просто ардуинка останавливается и мертва до ресета или откл питания. Еще раз, я мучаю (ну или она меня) Pro mini 5v, что с ней может быть не так?
Поможет ли переход на 32 битный чип?

Мож она просто не справляется с двумя потоками по 500К каждый?

Почитал в сети - пишут. что при большом числе сообщений и ЕСП32 затыкается на 500Кbps, чего ж вы от старой атмеги хотите

Нашли решение в сети?

Да должна она работать. Полагаю, что дело в CAN-контроллере.

несколько ранее вы предполагали некоректность прошивки :open_hands:

по mcp2515- макс скорость до 1Mbps