IOT ENTERPRISE ©
Пример чтения данных из 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);
}
}