/** * LIN Sniffer */ #include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "esp_err.h" #include "esp_system.h" #include "driver/gpio.h" #include "driver/uart.h" #define UART_NUM UART_NUM_1 #define UART_RX_GPIO GPIO_NUM_4 #define LIN_BAUDRATE 9600 static const char *TAG = "LIN_SNIFFER"; // Setup UART buffered IO with event queue const int uart_buffer_size = (1024 * 2); QueueHandle_t uart_queue; void uart_event_task(void *pvParameters) { uart_event_t event; while(1) { if (xQueueReceive(uart_queue, &event, portMAX_DELAY)) { switch (event.type) { case UART_DATA: ESP_LOGI(TAG, "UART_DATA: %d bytes", event.size); break; case UART_BREAK: ESP_LOGI(TAG, "UART_BREAK detected!"); break; case UART_FIFO_OVF: ESP_LOGW(TAG, "FIFO overflow"); uart_flush_input(UART_NUM); xQueueReset(uart_queue); break; case UART_BUFFER_FULL: ESP_LOGW(TAG, "RX buffer full"); uart_flush_input(UART_NUM); xQueueReset(uart_queue); break; default: break; } } } } void app_main(void) { ESP_LOGI(TAG, "Starting LIN Bus Sniffer"); // Install UART driver using an event queue here ESP_ERROR_CHECK(uart_driver_install( UART_NUM, uart_buffer_size, uart_buffer_size, 10, &uart_queue, 0)); // Configure UART uart_config_t uart_config = { .baud_rate = LIN_BAUDRATE, // Baudrate festlegen (z.B. 9600, 115200) .data_bits = UART_DATA_8_BITS, // Datenbits: 5, 6, 7 oder 8 .parity = UART_PARITY_DISABLE, // Parität: DISABLE, EVEN, ODD .stop_bits = UART_STOP_BITS_1, // Stopbits: 1, 1.5, 2 .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, // Flow Control: DISABLE, CTS_RTS, etc. .source_clk = UART_SCLK_DEFAULT, // Taktquelle }; ESP_ERROR_CHECK(uart_param_config(UART_NUM, &uart_config)); // Set UART pins(TX, RX, RTS, CTS) gpio_pullup_en(UART_RX_GPIO); ESP_ERROR_CHECK(uart_set_pin(UART_NUM, UART_PIN_NO_CHANGE, UART_RX_GPIO, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); // Start UART receive task xTaskCreate(uart_event_task, "uart event", 4096, NULL, 5, NULL); while (1) { vTaskDelay(pdMS_TO_TICKS(1000)); } }