Вложенный цикл не повторяется

loop can-bus

Я пытаюсь взломать CANBUS с помощью идентификаторов и значений, но мой цикл, похоже, не меняет идентификатор.

Я ожидаю следующего при смене идентификаторов

0x100 FF FF FF FF FF FF FF FF
0x101 00 00 00 00 00 00 00 00

Но я получаю

0x100 FF FF FF FF FF FF FF FF
0x100 00 00 00 00 00 00 00 00

Я не уверен, где я ошибаюсь

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

// Определить вывод выбора микросхемы для MCP2515
#define CAN_CS 5

MCP_CAN CAN(CAN_CS); // Инициализируем MCP2515 с помощью контакта CS

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

  // Инициализируем MCP2515
  if (CAN.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.println("MCP2515 Initialized Successfully!");
  } else {
    Serial.println("Error Initializing MCP2515...");
    while (1);
  }

  CAN.setMode(MCP_NORMAL);
}

void loop() {
  for (uint16_t id = 0x100; id <= 0x500; id++) { // Увеличить ID
    for (uint8_t byteValue = 0x00; byteValue <= 0xFF; byteValue++) { // Увеличиваем байты данных от 0x00 до 0xFF
      uint8_t data[8] = {byteValue, byteValue, byteValue, byteValue, byteValue, byteValue, byteValue, byteValue}; // Установить все байты в текущее значение

      // Отправить CAN-сообщение
      byte sendStatus = CAN.sendMsgBuf(id, 0, 8, data);

      // Оставить условие if без изменений
      if (sendStatus == CAN_OK) {
        Serial.print("Sent message with ID: 0x");
        Serial.print(id, HEX);
        Serial.print(" Data: ");
        for (int k = 0; k < 8; k++) {
          Serial.print(data[k], HEX);
          Serial.print(" ");
        }
        Serial.println();
      } else {
        Serial.print("Error sending message with ID: 0x");
        Serial.println(id, HEX);
      }

      delay(10); // Небольшая задержка между сообщениями
    }

    // Вывести разделитель после завершения всех байтов данных для текущего идентификатора
    Serial.println("----------------------------------------");
  }

  Serial.println("Finished all IDs from 0x100 to 0x500 with data bytes from 0x00 to 0xFF.");
  while (1); // Остановиться после завершения
}

, 👍0

Обсуждение

это не похоже на распечатку, сгенерированную программой... пожалуйста, предоставьте полную распечатку, @jsotola


1 ответ


Лучший ответ:

2

То, что ваш внешний цикл «не увеличивается», может означать, что ваш внутренний цикл никогда не заканчивается:

for (uint8_t byteValue = 0x00; byteValue <= 0xFF; byteValue++) {

Итак, что мы имеем в коде вашего цикла for:

  • uint8_t byteValue -> byteValue может хранить значения от 0 до 255 (0xFF)
  • byteValue <= 0xFF -> максимальное значение равно 255, а условие в основном меньше 256 -> ; всегда истинно.
  • uint8_t Переполнение хорошо определено 255+1 == 0 (в отличие от знаковых значений)

Редактировать:

Я попытался скомпилировать этот цикл, и даже без подробной компиляции в Arduino IDE он показывает:

sketch_jan25a.ino: In function 'void loop()':
sketch_jan25a.ino:8:46: warning: comparison is always true due to limited range of data type [-Wtype-limits]

Так что не игнорируйте предупреждения в своем коде (в ядре Arduino тоже есть предупреждения :D)

,