#ifndef MODBUS_RTU_H #define MODBUS_RTU_H #include #include #include #include "driver/uart.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "modbus_memory.h" #ifdef __cplusplus extern "C" { #endif #define MODBUS_RTU_MAX_ADU_LEN 256 #define MODBUS_RTU_MAX_DEVICES 16 typedef struct { uint8_t unit_id; modbus_memory_t *mem; const char *name; } modbus_rtu_device_t; typedef struct { uart_port_t uart_num; uint32_t baud_rate; uint8_t unit_count; modbus_rtu_device_t devices[MODBUS_RTU_MAX_DEVICES]; } modbus_rtu_ctx_t; void modbus_rtu_init(modbus_rtu_ctx_t *ctx, uart_port_t uart_num, uint32_t baud_rate); bool modbus_rtu_add_device(modbus_rtu_ctx_t *ctx, uint8_t unit_id, modbus_memory_t *mem, const char *name); modbus_rtu_device_t *modbus_rtu_find_device(modbus_rtu_ctx_t *ctx, uint8_t unit_id); int modbus_rtu_read_frame(modbus_rtu_ctx_t *ctx, uint8_t *buf, size_t buf_size, TickType_t first_byte_timeout); bool modbus_rtu_process_request(modbus_rtu_ctx_t *ctx, const uint8_t *req, size_t req_len, uint8_t *resp, size_t resp_size, size_t *resp_len); uint16_t modbus_rtu_crc16(const uint8_t *data, size_t len); #ifdef __cplusplus } #endif #endif /* MODBUS_RTU_H */