3 сент. 2025

Пример чтения данных из CAN шины ТС с использованием TJA1050, через ESP32. Вывод всех полученных данный в мониторинг сериал порта

Пример чтения данных из CAN шины ТС с использованием TJA1050, через ESP32. Вывод всех полученных данный в мониторинг сериал порта.

#include <driver/twai.h> // Используем встроенный CAN-контроллер ESP32

// Настройки CAN
#define CAN_TX_GPIO_NUM    GPIO_NUM_5  // Пин CAN TX
#define CAN_RX_GPIO_NUM    GPIO_NUM_4  // Пин CAN RX
#define CAN_SPEED          TWAI_TIMING_CONFIG_500KBITS  // Скорость 500 kbps

void setup() {
  Serial.begin(115200);
  Serial.println("CAN Reader for ESP32 with TJA1050");
  Serial.println("Initializing CAN...");

  // Инициализация CAN контроллера
  twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(CAN_TX_GPIO_NUM, CAN_RX_GPIO_NUM, TWAI_MODE_NORMAL);
  twai_timing_config_t t_config = CAN_SPEED;
  twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();

  // Установка конфигурации CAN
  esp_err_t result = twai_driver_install(&g_config, &t_config, &f_config);
  if (result != ESP_OK) {
    Serial.printf("Failed to install CAN driver: 0x%X\n", result);
    while(1);
  }

  // Запуск CAN контроллера
  result = twai_start();
  if (result != ESP_OK) {
    Serial.printf("Failed to start CAN controller: 0x%X\n", result);
    while(1);
  }

  Serial.println("CAN initialized successfully!");
  Serial.println("Listening for CAN messages...");
  Serial.println("==========================================");
}

void loop() {
  twai_message_t message;
  
  // Ожидание CAN сообщения
  esp_err_t result = twai_receive(&message, pdMS_TO_TICKS(1000));
  
  if (result == ESP_OK) {
    // Вывод информации о CAN сообщении
    printCANMessage(message);
  } else if (result != ESP_ERR_TIMEOUT) {
    Serial.printf("Error receiving CAN message: 0x%X\n", result);
  }
}

void printCANMessage(twai_message_t &message) {
  // Вывод ID сообщения
  Serial.printf("ID: 0x%03X", message.identifier);
  
  // Флаги сообщения
  if (message.extd) Serial.print(" EXT");
  if (message.rtr) Serial.print(" RTR");
  Serial.print(" | ");
  
  // Длина данных
  Serial.printf("DLC: %d", message.data_length_code);
  Serial.print(" | ");
  
  // Данные
  Serial.print("Data: ");
  for (int i = 0; i < message.data_length_code; i++) {
    Serial.printf("%02X ", message.data[i]);
  }
  
  // Вывод данных в десятичном формате
  Serial.print("| Dec: ");
  for (int i = 0; i < message.data_length_code; i++) {
    Serial.printf("%3d ", message.data[i]);
  }
  
  // Вывод ASCII представления (если применимо)
  Serial.print("| ASCII: ");
  for (int i = 0; i < message.data_length_code; i++) {
    if (message.data[i] >= 32 && message.data[i] <= 126) {
      Serial.print((char)message.data[i]);
    } else {
      Serial.print(".");
    }
  }
  
  // Временная метка
  Serial.printf(" | Timestamp: %lu", message.timestamp);
  
  Serial.println();
}

// Функция для отправки CAN сообщения (опционально)
void sendCANMessage(uint32_t id, uint8_t *data, uint8_t length, bool extended = false) {
  twai_message_t message;
  message.identifier = id;
  message.extd = extended;
  message.data_length_code = length;
  message.rtr = false;
  
  for (int i = 0; i < length; i++) {
    message.data[i] = data[i];
  }
  
  esp_err_t result = twai_transmit(&message, pdMS_TO_TICKS(1000));
  if (result == ESP_OK) {
    Serial.println("CAN message sent successfully");
  } else {
    Serial.printf("Failed to send CAN message: 0x%X\n", result);
  }
}

// Обработчик ошибок CAN
void checkCANStatus() {
  twai_status_info_t status_info;
  twai_get_status_info(&status_info);
  
  if (status_info.state == TWAI_STATE_BUS_OFF) {
    Serial.println("CAN bus-off state detected!");
    // Автоматическое восстановление после bus-off
    twai_initiate_recovery();
  }
  
  if (status_info.msgs_to_rx > 0) {
    Serial.printf("Messages in RX queue: %d\n", status_info.msgs_to_rx);
  }
  
  if (status_info.tx_error_counter > 0 || status_info.rx_error_counter > 0) {
    Serial.printf("Error counters - TX: %d, RX: %d\n", 
                  status_info.tx_error_counter, status_info.rx_error_counter);
  }
}
Craftum Конструктор сайтов Craftum