63 lines
1.5 KiB
C
63 lines
1.5 KiB
C
#ifndef MODBUS_RTU_H
|
|
#define MODBUS_RTU_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#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 */ |