#ifndef _MODBUS_H #define _MODBUS_H #include #include /* Modbus function codes */ #define read_holding_regs 0x03 #define read_input_regs 0x04 #define write_single_reg 0x06 /* Helpful macros */ #define lowByte(w) ((uint8_t) ((w) & 0xff)) #define highByte(w) ((uint8_t) ((w) >> 8)) #define word(h, l) ((h << 8) | l) /* Maximum response buffer size for Modbus nodes */ #define MAX_BUFSIZE 64 typedef struct { uint8_t slave_id; uint16_t response_buffer[MAX_BUFSIZE]; uint8_t rbuf_len; uint8_t modbus_timeout; void* modbus_uart; } modbus_slave_device; typedef enum { MB_OK = 0x0, MB_UART_ERR_1 = 0x1, MB_UART_ERR_2 = 0x2, MB_UART_ERR_3 = 0x3, MB_SLAVE_ID_ERR = 0x4, MB_FUNC_ERR = 0x5, MB_CRC_ERR = 0x6 } MB_StatusTypeDef; /* Platform-agnostic UART function pointers */ extern MB_StatusTypeDef (*MB_UART_Tx)(void*, uint16_t*, uint8_t*, uint8_t*); extern MB_StatusTypeDef (*MB_UART_Rx)(void*, uint16_t*, uint8_t*, uint8_t*); MB_StatusTypeDef modbus_transaction(uint8_t func, modbus_slave_device *device, uint16_t rw_addr, int read_num, uint16_t write_value); MB_StatusTypeDef ReadHoldingRegisters(modbus_slave_device *device, uint16_t reg_addr, int read_num); MB_StatusTypeDef ReadInputRegisters(modbus_slave_device *device, uint16_t reg_addr, int read_num); MB_StatusTypeDef WriteSingleRegister(modbus_slave_device *device, uint16_t reg_addr, uint16_t write_val); void ClearResponseBuffer(modbus_slave_device *device); #endif