Проблема с оператором if

Да, да, хорошо. Попробую. Спасибо что не бросаете в проблеме

Ну спасибо, что согласились )) Вы поймите, отладка в уме - дело тухлое изначально, нужно знать точно, что происходит

Может обнулить? Или сделать через & ?

Нет такого логического оператора

2 лайка

Не сердитесь на меня пж. Это мой первый проект на ардуинке

вам заняться нечем?
Добавьте уже печать и выясните, какое значение приходит.

Сначала диагностика - потом лечение.

Допил кофе и побежал пробовать. О результате отпишусь

Вот и я про тоже. Сегодня работал с этим оператором && в своем скетче.

Сег вновь взял стандартный пример и начал заново. По (rxId == 0x7DF) проблем нет, все воспринимается системой адекватно!
Начал с первого if, в мониторе то что мне нужно и нет цикла. Ответ верный. Добавил второй if и …. Он не срабатывает, нет ответа вообще. Играл с таймингом, переносил {}, результата нет. Сейчас с телефона, доберусь до компа выложу скетч и монитор. Возможно перегрузил свой старый мозг, была еще другая работа. Буду проверять.

А что вы думаете про оператор по_битного сравнения, Возвращающий булевую переменную?

Кстати, как можно скопировать текст из монитора порта, я не смог найти такую функцию :person_shrugging:

Нету такого.
Только если сами напишете.
Ну и на всякий случай: ни &, ни && - не операторы сравнения.

скетч

[code]
// 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];

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: 250k@16MHz
  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: 250k@16MHz
  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)

  { Serial.println("CAN0 receive buffer:");
      if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
  
    Serial.print(msgString);
  
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<len; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
      }
    }
        
    Serial.println();
  }

  
    if(rxId == 0x7DF && rxBuf[0] == 0x02 && rxBuf[1] == 0x09 && rxBuf[2] == 0x02)
  {
      rxId = 0x7E8;
      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); }
     { Serial.println("CAN0 receive buffer:");
      if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
  
    Serial.print(msgString);
  
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<len; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
      }
    }
        
    Serial.println();
  }
  

  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)
     { Serial.println("CAN0 receive buffer:");
      if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
  
    Serial.print(msgString);
  
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<len; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
      }
    }
        
    Serial.println();
  }
  }
  else 
  
  if(rxId == 0x7E0 && rxBuf[0] == 0x30)
  {
    byte t = rxBuf[2];
  rxId = 0x7E8;
  len = 8;
  rxBuf[0] = 0x31;
  rxBuf[1] = 0x31;
  rxBuf[2] = 0x31;
  rxBuf[3] = 0x31;
  rxBuf[4] = 0x31;
  rxBuf[5] = 0x31;
  rxBuf[6] = 0x31;
  rxBuf[7] = 0x31;
  
  delay(t);
  
  CAN0.sendMsgBuf(rxId, 0, len, rxBuf); }

  
} 
else 
    
    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
    Serial.println("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
    
    if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
  
    Serial.print(msgString);
  
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<len; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
      }
    }
        
    Serial.println();
  }

  delay(0);
}

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

монитор

запрос FC flow control это запрос на второй фрейм длинной посылки. Он приходит не как широкополосный(0x7DF) запрос но как обращение к конкретному устройству (0x7E0).
Всего ответ содержит три фрейма.

Но ответ должен приходить от 0x7E8 на все эти запросы.

Какой-то кошмарный скетч.
Методом копипасты писали? Зачем после строки 88 опять начинается какой-то вывод в Serial? Зачем два раза CAN0_INT проверять?
Этак не только if залипнет, но и void loop() перестанет работать.

Начните сначала, ловите один фрейм, меняйте ID, отсылайте назад.

Думаю, что такой оператор в Си и С++ отсуствует напрочь

Первая замена сработала. Но это первый фрейм. Команда на FC поступила( запрос с Id 0x7E0) с ожиданием ответа в rxBuf[2]. Но ответа от ардуинки нет. Копипастом сделал вывод на монитор порта, мне он нах не нужен, только увидеть. Потом уберу это.

In C++, the & operator can have different meanings depending on the context:

  1. Bitwise AND Operator:
  • When used with integer types, it performs a bitwise AND operation. It compares each bit of the two operands and produces a result where each bit is 1 only if the corresponding bits in both operands are 1.
  • Example:
   int a = 5; // 0101 in binary
   int b = 3; // 0011 in binary
   int result = a & b; // result = 1 (0001 in binary) 
  1. Address-of Operator:
  • When used with a variable, it returns the memory address of that variable.
  • Example:
   int x = 10;
   int* ptr = &x; // ptr now stores the address of x 
  1. Reference Operator:
  • When used in a variable declaration, it creates a reference, which is an alias for another variable.
  • Example:
   int y = 20;
   int& ref = y; // ref is now a reference to y
   ref = 30; // y is now 30 

Important Considerations:

  • Bitwise vs. Logical AND: Don’t confuse the bitwise AND operator (&) with the logical AND operator (&&). The logical AND operator is used to combine boolean expressions.
  • Precedence: Be mindful of operator precedence. The & operator has higher precedence than the logical operators.
  • Pointers and References: Understanding the concepts of pointers and references is crucial for effective use of the & operator.

Generative AI is experimental.

Потом и приходите.

Наврядли кому-то интересно будет копаться в том, что даже автору не нужно.